st/xa: Initial import of the xa state-tracker and the xa-vmwgfx target.
[mesa.git] / src / gallium / state_trackers / xa / xa_priv.h
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
36 #include "pipe/p_screen.h"
37 #include "pipe/p_context.h"
38 #include "pipe/p_state.h"
39
40 #define XA_VB_SIZE (100 * 4 * 3 * 4)
41 #define XA_LAST_SURFACE_TYPE (xa_type_yuv_component + 1)
42
43 struct xa_fence {
44 struct pipe_fence_handle *pipe_fence;
45 struct xa_tracker *xa;
46 };
47
48 struct xa_format_descriptor {
49 enum pipe_format format;
50 enum xa_formats xa_format;
51 };
52
53 struct xa_surface {
54 struct pipe_resource template;
55 struct xa_tracker *xa;
56 struct pipe_resource *tex;
57 struct pipe_surface *srf;
58 struct pipe_sampler_view *view;
59 unsigned int flags;
60 struct xa_format_descriptor fdesc;
61 struct pipe_transfer *transfer;
62 struct pipe_context *mapping_pipe;
63 };
64
65 struct xa_tracker {
66 enum xa_formats *supported_formats;
67 unsigned int format_map[XA_LAST_SURFACE_TYPE][2];
68 int d_depth_bits_last;
69 int ds_depth_bits_last;
70 struct pipe_screen *screen;
71 struct xa_context *default_ctx;
72 };
73
74 struct xa_context {
75 struct xa_tracker *xa;
76 struct pipe_context *pipe;
77
78 struct cso_context *cso;
79 struct xa_shaders *shaders;
80
81 struct pipe_resource *vs_const_buffer;
82 struct pipe_resource *fs_const_buffer;
83
84 float buffer[XA_VB_SIZE];
85 unsigned int buffer_size;
86 struct pipe_vertex_element velems[3];
87
88 /* number of attributes per vertex for the current
89 * draw operation */
90 unsigned int attrs_per_vertex;
91
92 unsigned int fb_width;
93 unsigned int fb_height;
94
95 struct pipe_fence_handle *last_fence;
96 struct xa_surface *src;
97 struct xa_surface *dst;
98 };
99
100 enum xa_vs_traits {
101 VS_COMPOSITE = 1 << 0,
102 VS_MASK = 1 << 1,
103 VS_SOLID_FILL = 1 << 2,
104 VS_LINGRAD_FILL = 1 << 3,
105 VS_RADGRAD_FILL = 1 << 4,
106 VS_YUV = 1 << 5,
107
108 VS_FILL = (VS_SOLID_FILL | VS_LINGRAD_FILL | VS_RADGRAD_FILL)
109 };
110
111 enum xa_fs_traits {
112 FS_COMPOSITE = 1 << 0,
113 FS_MASK = 1 << 1,
114 FS_SOLID_FILL = 1 << 2,
115 FS_LINGRAD_FILL = 1 << 3,
116 FS_RADGRAD_FILL = 1 << 4,
117 FS_CA_FULL = 1 << 5, /* src.rgba * mask.rgba */
118 FS_CA_SRCALPHA = 1 << 6, /* src.aaaa * mask.rgba */
119 FS_YUV = 1 << 7,
120 FS_SRC_REPEAT_NONE = 1 << 8,
121 FS_MASK_REPEAT_NONE = 1 << 9,
122 FS_SRC_SWIZZLE_RGB = 1 << 10,
123 FS_MASK_SWIZZLE_RGB = 1 << 11,
124 FS_SRC_SET_ALPHA = 1 << 12,
125 FS_MASK_SET_ALPHA = 1 << 13,
126 FS_SRC_LUMINANCE = 1 << 14,
127 FS_MASK_LUMINANCE = 1 << 15,
128
129 FS_FILL = (FS_SOLID_FILL | FS_LINGRAD_FILL | FS_RADGRAD_FILL),
130 FS_COMPONENT_ALPHA = (FS_CA_FULL | FS_CA_SRCALPHA)
131 };
132
133 struct xa_shader {
134 void *fs;
135 void *vs;
136 };
137
138 static inline int
139 xa_min(int a, int b)
140 {
141 return ((a <= b) ? a : b);
142 }
143
144 struct xa_shaders;
145
146 /*
147 * xa_tgsi.c
148 */
149
150 extern struct xa_shaders *xa_shaders_create(struct xa_context *);
151
152 void xa_shaders_destroy(struct xa_shaders *shaders);
153
154 struct xa_shader xa_shaders_get(struct xa_shaders *shaders,
155 unsigned vs_traits, unsigned fs_traits);
156
157 /*
158 * xa_renderer.c
159 */
160 void renderer_set_constants(struct xa_context *r,
161 int shader_type, const float *params,
162 int param_bytes);
163
164 void renderer_draw_yuv(struct xa_context *r,
165 float src_x,
166 float src_y,
167 float src_w,
168 float src_h,
169 int dst_x,
170 int dst_y, int dst_w, int dst_h,
171 struct xa_surface *srf[]);
172
173 void renderer_bind_destination(struct xa_context *r,
174 struct pipe_surface *surface, int width,
175 int height);
176
177 void renderer_init_state(struct xa_context *r);
178
179 #endif