xa_priv.h revision adf166b6c4f6781fd5e751622e9488e5f834bbc2
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#define XA_VB_SIZE (100 * 4 * 3 * 4)
42#define XA_LAST_SURFACE_TYPE (xa_type_yuv_component + 1)
43#define XA_MAX_SAMPLERS 3
44
45struct xa_fence {
46    struct pipe_fence_handle *pipe_fence;
47    struct xa_tracker *xa;
48};
49
50struct xa_format_descriptor {
51    enum pipe_format format;
52    enum xa_formats xa_format;
53};
54
55struct xa_surface {
56    struct pipe_resource template;
57    struct xa_tracker *xa;
58    struct pipe_resource *tex;
59    struct pipe_surface *srf;
60    struct pipe_sampler_view *view;
61    unsigned int flags;
62    struct xa_format_descriptor fdesc;
63    struct pipe_transfer *transfer;
64    struct pipe_context *mapping_pipe;
65};
66
67struct xa_tracker {
68    enum xa_formats *supported_formats;
69    unsigned int format_map[XA_LAST_SURFACE_TYPE][2];
70    int d_depth_bits_last;
71    int ds_depth_bits_last;
72    struct pipe_screen *screen;
73    struct xa_context *default_ctx;
74};
75
76struct xa_context {
77    struct xa_tracker *xa;
78    struct pipe_context *pipe;
79
80    struct cso_context *cso;
81    struct xa_shaders *shaders;
82
83    struct pipe_resource *vs_const_buffer;
84    struct pipe_resource *fs_const_buffer;
85
86    float buffer[XA_VB_SIZE];
87    unsigned int buffer_size;
88    struct pipe_vertex_element velems[3];
89
90    /* number of attributes per vertex for the current
91     * draw operation */
92    unsigned int attrs_per_vertex;
93
94    unsigned int fb_width;
95    unsigned int fb_height;
96
97    struct pipe_fence_handle *last_fence;
98    struct xa_surface *src;
99    struct xa_surface *dst;
100    int simple_copy;
101
102    int has_solid_color;
103    float solid_color[4];
104
105    unsigned int num_bound_samplers;
106    struct pipe_sampler_view *bound_sampler_views[XA_MAX_SAMPLERS];
107    const struct xa_composite *comp;
108};
109
110enum xa_vs_traits {
111    VS_COMPOSITE = 1 << 0,
112    VS_MASK = 1 << 1,
113    VS_SOLID_FILL = 1 << 2,
114    VS_LINGRAD_FILL = 1 << 3,
115    VS_RADGRAD_FILL = 1 << 4,
116    VS_YUV = 1 << 5,
117
118    VS_FILL = (VS_SOLID_FILL | VS_LINGRAD_FILL | VS_RADGRAD_FILL)
119};
120
121enum xa_fs_traits {
122    FS_COMPOSITE = 1 << 0,
123    FS_MASK = 1 << 1,
124    FS_SOLID_FILL = 1 << 2,
125    FS_LINGRAD_FILL = 1 << 3,
126    FS_RADGRAD_FILL = 1 << 4,
127    FS_CA_FULL = 1 << 5,	/* src.rgba * mask.rgba */
128    FS_CA_SRCALPHA = 1 << 6,	/* src.aaaa * mask.rgba */
129    FS_YUV = 1 << 7,
130    FS_SRC_REPEAT_NONE = 1 << 8,
131    FS_MASK_REPEAT_NONE = 1 << 9,
132    FS_SRC_SWIZZLE_RGB = 1 << 10,
133    FS_MASK_SWIZZLE_RGB = 1 << 11,
134    FS_SRC_SET_ALPHA = 1 << 12,
135    FS_MASK_SET_ALPHA = 1 << 13,
136    FS_SRC_LUMINANCE = 1 << 14,
137    FS_MASK_LUMINANCE = 1 << 15,
138
139    FS_FILL = (FS_SOLID_FILL | FS_LINGRAD_FILL | FS_RADGRAD_FILL),
140    FS_COMPONENT_ALPHA = (FS_CA_FULL | FS_CA_SRCALPHA)
141};
142
143struct xa_shader {
144    void *fs;
145    void *vs;
146};
147
148struct xa_shaders;
149
150/*
151 * Inline utilities
152 */
153
154static INLINE int
155xa_min(int a, int b)
156{
157    return ((a <= b) ? a : b);
158}
159
160static INLINE void
161xa_pixel_to_float4(uint32_t pixel, float *color)
162{
163    uint32_t	    r, g, b, a;
164
165    a = (pixel >> 24) & 0xff;
166    r = (pixel >> 16) & 0xff;
167    g = (pixel >>  8) & 0xff;
168    b = (pixel >>  0) & 0xff;
169    color[0] = ((float)r) / 255.;
170    color[1] = ((float)g) / 255.;
171    color[2] = ((float)b) / 255.;
172    color[3] = ((float)a) / 255.;
173}
174
175
176/*
177 * xa_tgsi.c
178 */
179
180extern struct xa_shaders *xa_shaders_create(struct xa_context *);
181
182void xa_shaders_destroy(struct xa_shaders *shaders);
183
184struct xa_shader xa_shaders_get(struct xa_shaders *shaders,
185				unsigned vs_traits, unsigned fs_traits);
186
187/*
188 * xa_context.c
189 */
190extern int
191xa_surface_psurf_create(struct xa_context *ctx, struct xa_surface *dst);
192
193extern void
194xa_surface_psurf_destroy(struct xa_surface *dst);
195
196/*
197 * xa_renderer.c
198 */
199void renderer_set_constants(struct xa_context *r,
200			    int shader_type, const float *params,
201			    int param_bytes);
202
203void renderer_draw_yuv(struct xa_context *r,
204		       float src_x,
205		       float src_y,
206		       float src_w,
207		       float src_h,
208		       int dst_x,
209		       int dst_y, int dst_w, int dst_h,
210		       struct xa_surface *srf[]);
211
212void renderer_bind_destination(struct xa_context *r,
213			       struct pipe_surface *surface, int width,
214			       int height);
215
216void renderer_init_state(struct xa_context *r);
217void renderer_copy_prepare(struct xa_context *r,
218			   struct pipe_surface *dst_surface,
219			   struct pipe_resource *src_texture);
220void renderer_copy(struct xa_context *r, int dx,
221		   int dy,
222		   int sx,
223		   int sy,
224		   int width, int height, float src_width, float src_height);
225
226void renderer_draw_flush(struct xa_context *r);
227
228void renderer_begin_solid(struct xa_context *r);
229void renderer_solid(struct xa_context *r,
230		    int x0, int y0, int x1, int y1, float *color);
231void
232renderer_begin_textures(struct xa_context *r);
233
234void
235renderer_texture(struct xa_context *r,
236		 int *pos,
237		 int width, int height,
238		 const float *src_matrix,
239		 const float *mask_matrix);
240
241#endif
242