Home | History | Annotate | Download | only in xa
      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