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