Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**********************************************************
  2.  * Copyright 2009-2011 VMware, Inc. All rights reserved.
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person
  5.  * obtaining a copy of this software and associated documentation
  6.  * files (the "Software"), to deal in the Software without
  7.  * restriction, including without limitation the rights to use, copy,
  8.  * modify, merge, publish, distribute, sublicense, and/or sell copies
  9.  * of the Software, and to permit persons to whom the Software is
  10.  * furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice shall be
  13.  * included in all copies or substantial portions of the Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  18.  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  19.  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  20.  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22.  * SOFTWARE.
  23.  *
  24.  *********************************************************
  25.  * Authors:
  26.  * Zack Rusin <zackr-at-vmware-dot-com>
  27.  * Thomas Hellstrom <thellstrom-at-vmware-dot-com>
  28.  */
  29.  
  30. #ifndef _XA_PRIV_H_
  31. #define _XA_PRIV_H_
  32.  
  33. #include "xa_tracker.h"
  34. #include "xa_context.h"
  35. #include "xa_composite.h"
  36.  
  37. #include "pipe/p_screen.h"
  38. #include "pipe/p_context.h"
  39. #include "pipe/p_state.h"
  40.  
  41. #include "util/u_math.h"
  42.  
  43. #if defined(__GNUC__)
  44. #define XA_EXPORT __attribute__ ((visibility("default")))
  45. #else
  46. #define XA_EXPORT
  47. #endif
  48.  
  49. #define XA_VB_SIZE (100 * 4 * 3 * 4)
  50. #define XA_LAST_SURFACE_TYPE (xa_type_yuv_component + 1)
  51. #define XA_MAX_SAMPLERS 3
  52.  
  53. struct xa_fence {
  54.     struct pipe_fence_handle *pipe_fence;
  55.     struct xa_tracker *xa;
  56. };
  57.  
  58. struct xa_format_descriptor {
  59.     enum pipe_format format;
  60.     enum xa_formats xa_format;
  61. };
  62.  
  63. struct xa_surface {
  64.     int refcount;
  65.     struct pipe_resource template;
  66.     struct xa_tracker *xa;
  67.     struct pipe_resource *tex;
  68.     struct pipe_transfer *transfer;
  69.     unsigned int flags;
  70.     struct xa_format_descriptor fdesc;
  71.     struct pipe_context *mapping_pipe;
  72. };
  73.  
  74. struct xa_tracker {
  75.     enum xa_formats *supported_formats;
  76.     unsigned int format_map[XA_LAST_SURFACE_TYPE][2];
  77.     int d_depth_bits_last;
  78.     int ds_depth_bits_last;
  79.     struct pipe_loader_device *dev;
  80.     struct pipe_screen *screen;
  81.     struct xa_context *default_ctx;
  82. };
  83.  
  84. struct xa_context {
  85.     struct xa_tracker *xa;
  86.     struct pipe_context *pipe;
  87.  
  88.     struct cso_context *cso;
  89.     struct xa_shaders *shaders;
  90.  
  91.     struct pipe_resource *vs_const_buffer;
  92.     struct pipe_resource *fs_const_buffer;
  93.  
  94.     float buffer[XA_VB_SIZE];
  95.     unsigned int buffer_size;
  96.     struct pipe_vertex_element velems[3];
  97.  
  98.     /* number of attributes per vertex for the current
  99.      * draw operation */
  100.     unsigned int attrs_per_vertex;
  101.  
  102.     unsigned int fb_width;
  103.     unsigned int fb_height;
  104.  
  105.     struct pipe_fence_handle *last_fence;
  106.     struct xa_surface *src;
  107.     struct xa_surface *dst;
  108.     struct pipe_surface *srf;
  109.  
  110.     /* destination scissor state.. we scissor out untouched parts
  111.      * of the dst for the benefit of tilers:
  112.      */
  113.     struct pipe_scissor_state scissor;
  114.     int scissor_valid;
  115.  
  116.     int simple_copy;
  117.  
  118.     int has_solid_color;
  119.     float solid_color[4];
  120.  
  121.     unsigned int num_bound_samplers;
  122.     struct pipe_sampler_view *bound_sampler_views[XA_MAX_SAMPLERS];
  123.     const struct xa_composite *comp;
  124. };
  125.  
  126. static INLINE void
  127. xa_scissor_reset(struct xa_context *ctx)
  128. {
  129.     ctx->scissor.maxx = 0;
  130.     ctx->scissor.maxy = 0;
  131.     ctx->scissor.minx = ~0;
  132.     ctx->scissor.miny = ~0;
  133.     ctx->scissor_valid = FALSE;
  134. }
  135.  
  136. static INLINE void
  137. xa_scissor_update(struct xa_context *ctx, unsigned minx, unsigned miny,
  138.                 unsigned maxx, unsigned maxy)
  139. {
  140.     ctx->scissor.maxx = MAX2(ctx->scissor.maxx, maxx);
  141.     ctx->scissor.maxy = MAX2(ctx->scissor.maxy, maxy);
  142.     ctx->scissor.minx = MIN2(ctx->scissor.minx, minx);
  143.     ctx->scissor.miny = MIN2(ctx->scissor.miny, miny);
  144.     ctx->scissor_valid = TRUE;
  145. }
  146.  
  147. enum xa_vs_traits {
  148.     VS_COMPOSITE = 1 << 0,
  149.     VS_MASK = 1 << 1,
  150.     VS_SOLID_FILL = 1 << 2,
  151.     VS_LINGRAD_FILL = 1 << 3,
  152.     VS_RADGRAD_FILL = 1 << 4,
  153.     VS_YUV = 1 << 5,
  154.  
  155.     VS_FILL = (VS_SOLID_FILL | VS_LINGRAD_FILL | VS_RADGRAD_FILL)
  156. };
  157.  
  158. enum xa_fs_traits {
  159.     FS_COMPOSITE = 1 << 0,
  160.     FS_MASK = 1 << 1,
  161.     FS_SOLID_FILL = 1 << 2,
  162.     FS_LINGRAD_FILL = 1 << 3,
  163.     FS_RADGRAD_FILL = 1 << 4,
  164.     FS_CA_FULL = 1 << 5,        /* src.rgba * mask.rgba */
  165.     FS_CA_SRCALPHA = 1 << 6,    /* src.aaaa * mask.rgba */
  166.     FS_YUV = 1 << 7,
  167.     FS_SRC_REPEAT_NONE = 1 << 8,
  168.     FS_MASK_REPEAT_NONE = 1 << 9,
  169.     FS_SRC_SWIZZLE_RGB = 1 << 10,
  170.     FS_MASK_SWIZZLE_RGB = 1 << 11,
  171.     FS_SRC_SET_ALPHA = 1 << 12,
  172.     FS_MASK_SET_ALPHA = 1 << 13,
  173.     FS_SRC_LUMINANCE = 1 << 14,
  174.     FS_MASK_LUMINANCE = 1 << 15,
  175.     FS_DST_LUMINANCE = 1 << 16,
  176.  
  177.     FS_FILL = (FS_SOLID_FILL | FS_LINGRAD_FILL | FS_RADGRAD_FILL),
  178.     FS_COMPONENT_ALPHA = (FS_CA_FULL | FS_CA_SRCALPHA)
  179. };
  180.  
  181. struct xa_shader {
  182.     void *fs;
  183.     void *vs;
  184. };
  185.  
  186. struct xa_shaders;
  187.  
  188. /*
  189.  * Inline utilities
  190.  */
  191.  
  192. static INLINE int
  193. xa_min(int a, int b)
  194. {
  195.     return ((a <= b) ? a : b);
  196. }
  197.  
  198. static INLINE void
  199. xa_pixel_to_float4(uint32_t pixel, float *color)
  200. {
  201.     uint32_t        r, g, b, a;
  202.  
  203.     a = (pixel >> 24) & 0xff;
  204.     r = (pixel >> 16) & 0xff;
  205.     g = (pixel >>  8) & 0xff;
  206.     b = (pixel >>  0) & 0xff;
  207.     color[0] = ((float)r) / 255.;
  208.     color[1] = ((float)g) / 255.;
  209.     color[2] = ((float)b) / 255.;
  210.     color[3] = ((float)a) / 255.;
  211. }
  212.  
  213. static INLINE void
  214. xa_pixel_to_float4_a8(uint32_t pixel, float *color)
  215. {
  216.     uint32_t a;
  217.  
  218.     a = (pixel >> 24) & 0xff;
  219.     color[0] = ((float)a) / 255.;
  220.     color[1] = ((float)a) / 255.;
  221.     color[2] = ((float)a) / 255.;
  222.     color[3] = ((float)a) / 255.;
  223. }
  224.  
  225. /*
  226.  * xa_tgsi.c
  227.  */
  228.  
  229. extern struct xa_shaders *xa_shaders_create(struct xa_context *);
  230.  
  231. void xa_shaders_destroy(struct xa_shaders *shaders);
  232.  
  233. struct xa_shader xa_shaders_get(struct xa_shaders *shaders,
  234.                                 unsigned vs_traits, unsigned fs_traits);
  235.  
  236. /*
  237.  * xa_context.c
  238.  */
  239. extern void
  240. xa_context_flush(struct xa_context *ctx);
  241.  
  242. extern int
  243. xa_ctx_srf_create(struct xa_context *ctx, struct xa_surface *dst);
  244.  
  245. extern void
  246. xa_ctx_srf_destroy(struct xa_context *ctx);
  247.  
  248. extern void
  249. xa_ctx_sampler_views_destroy(struct xa_context *ctx);
  250.  
  251. /*
  252.  * xa_renderer.c
  253.  */
  254. void renderer_set_constants(struct xa_context *r,
  255.                             int shader_type, const float *params,
  256.                             int param_bytes);
  257.  
  258. void renderer_draw_yuv(struct xa_context *r,
  259.                        float src_x,
  260.                        float src_y,
  261.                        float src_w,
  262.                        float src_h,
  263.                        int dst_x,
  264.                        int dst_y, int dst_w, int dst_h,
  265.                        struct xa_surface *srf[]);
  266.  
  267. void renderer_bind_destination(struct xa_context *r,
  268.                                struct pipe_surface *surface);
  269.  
  270. void renderer_init_state(struct xa_context *r);
  271. void renderer_copy_prepare(struct xa_context *r,
  272.                            struct pipe_surface *dst_surface,
  273.                            struct pipe_resource *src_texture,
  274.                            const enum xa_formats src_xa_format,
  275.                            const enum xa_formats dst_xa_format);
  276.  
  277. void renderer_copy(struct xa_context *r, int dx,
  278.                    int dy,
  279.                    int sx,
  280.                    int sy,
  281.                    int width, int height, float src_width, float src_height);
  282.  
  283. void renderer_draw_flush(struct xa_context *r);
  284.  
  285. void renderer_begin_solid(struct xa_context *r);
  286. void renderer_solid(struct xa_context *r,
  287.                     int x0, int y0, int x1, int y1, float *color);
  288. void
  289. renderer_begin_textures(struct xa_context *r);
  290.  
  291. void
  292. renderer_texture(struct xa_context *r,
  293.                  int *pos,
  294.                  int width, int height,
  295.                  const float *src_matrix,
  296.                  const float *mask_matrix);
  297.  
  298. #endif
  299.