• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
xa_scissor_reset(struct xa_context * ctx)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
xa_scissor_update(struct xa_context * ctx,unsigned minx,unsigned miny,unsigned maxx,unsigned maxy)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
xa_min(int a,int b)193 xa_min(int a, int b)
194 {
195     return ((a <= b) ? a : b);
196 }
197 
198 static inline void
xa_pixel_to_float4(uint32_t pixel,float * color)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
xa_pixel_to_float4_a8(uint32_t pixel,float * color)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