gallium: fix some "instruction"/"declaration" mix-ups in tgsi_exec_prepare().
[mesa.git] / src / mesa / pipe / p_state.h
1 /**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28
29 /**
30 * Abstract graphics pipe state objects.
31 *
32 * Basic notes:
33 * 1. Want compact representations, so we use bitfields.
34 * 2. Put bitfields before other (GLfloat) fields.
35 */
36
37
38 #ifndef PIPE_STATE_H
39 #define PIPE_STATE_H
40
41 #include "p_compiler.h"
42 #include "p_defines.h"
43 #include "p_format.h"
44
45 /**
46 * Implementation limits
47 */
48 #define PIPE_MAX_SAMPLERS 8
49 #define PIPE_MAX_CLIP_PLANES 6
50 #define PIPE_MAX_CONSTANT 32
51 #define PIPE_ATTRIB_MAX 32
52 #define PIPE_MAX_COLOR_BUFS 8
53 #define PIPE_MAX_TEXTURE_LEVELS 16
54 #define PIPE_MAX_FEEDBACK_ATTRIBS 16
55 #define PIPE_MAX_SHADER_INPUTS 16
56 #define PIPE_MAX_SHADER_OUTPUTS 16
57
58
59 /* fwd decls */
60 struct pipe_surface;
61 struct pipe_winsys;
62
63
64
65 /**
66 * The driver will certainly subclass this to include actual memory
67 * management information.
68 */
69 struct pipe_buffer {
70 unsigned alignment;
71 unsigned usage;
72 unsigned size;
73
74 /** Reference count */
75 unsigned refcount;
76 };
77
78
79
80
81 /**
82 * Primitive (point/line/tri) rasterization info
83 */
84 struct pipe_rasterizer_state
85 {
86 unsigned flatshade:1;
87 unsigned light_twoside:1;
88 unsigned front_winding:2; /**< PIPE_WINDING_x */
89 unsigned cull_mode:2; /**< PIPE_WINDING_x */
90 unsigned fill_cw:2; /**< PIPE_POLYGON_MODE_x */
91 unsigned fill_ccw:2; /**< PIPE_POLYGON_MODE_x */
92 unsigned offset_cw:1;
93 unsigned offset_ccw:1;
94 unsigned scissor:1;
95 unsigned poly_smooth:1;
96 unsigned poly_stipple_enable:1;
97 unsigned point_smooth:1;
98 unsigned point_sprite:1;
99 unsigned point_size_per_vertex:1; /**< size computed in vertex shader */
100 unsigned multisample:1; /* XXX maybe more ms state in future */
101 unsigned line_smooth:1;
102 unsigned line_stipple_enable:1;
103 unsigned line_stipple_factor:8; /**< [1..256] actually */
104 unsigned line_stipple_pattern:16;
105 unsigned bypass_clipping:1;
106 unsigned origin_lower_left:1; /**< Is (0,0) the lower-left corner? */
107
108 float line_width;
109 float point_size; /**< used when no per-vertex size */
110 float offset_units;
111 float offset_scale;
112 ubyte sprite_coord_mode[PIPE_MAX_SHADER_OUTPUTS]; /**< PIPE_SPRITE_COORD_ */
113 };
114
115
116 struct pipe_poly_stipple {
117 unsigned stipple[32];
118 };
119
120
121 struct pipe_viewport_state {
122 float scale[4];
123 float translate[4];
124 };
125
126
127 struct pipe_scissor_state {
128 unsigned minx:16;
129 unsigned miny:16;
130 unsigned maxx:16;
131 unsigned maxy:16;
132 };
133
134
135 struct pipe_clip_state {
136 float ucp[PIPE_MAX_CLIP_PLANES][4];
137 unsigned nr;
138 };
139
140
141 /**
142 * Constants for vertex/fragment shaders
143 */
144 struct pipe_constant_buffer {
145 struct pipe_buffer *buffer;
146 unsigned size; /** in bytes */
147 };
148
149
150 struct pipe_shader_state {
151 const struct tgsi_token *tokens;
152 ubyte num_inputs;
153 ubyte num_outputs;
154 ubyte input_map[PIPE_MAX_SHADER_INPUTS]; /* XXX this may be temporary */
155 ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
156 ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
157 ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */
158 ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
159 };
160
161
162 struct pipe_depth_stencil_alpha_state
163 {
164 struct {
165 unsigned enabled:1; /**< depth test enabled? */
166 unsigned writemask:1; /**< allow depth buffer writes? */
167 unsigned func:3; /**< depth test func (PIPE_FUNC_x) */
168 unsigned occlusion_count:1; /**< do occlusion counting? */
169 } depth;
170 struct {
171 unsigned enabled:1;
172 unsigned func:3; /**< PIPE_FUNC_x */
173 unsigned fail_op:3; /**< PIPE_STENCIL_OP_x */
174 unsigned zpass_op:3; /**< PIPE_STENCIL_OP_x */
175 unsigned zfail_op:3; /**< PIPE_STENCIL_OP_x */
176 ubyte ref_value;
177 ubyte value_mask;
178 ubyte write_mask;
179 } stencil[2]; /**< [0] = front, [1] = back */
180 struct {
181 unsigned enabled:1;
182 unsigned func:3; /**< PIPE_FUNC_x */
183 float ref; /**< reference value */
184 } alpha;
185 };
186
187
188 struct pipe_blend_state {
189 unsigned blend_enable:1;
190
191 unsigned rgb_func:3; /**< PIPE_BLEND_x */
192 unsigned rgb_src_factor:5; /**< PIPE_BLENDFACTOR_x */
193 unsigned rgb_dst_factor:5; /**< PIPE_BLENDFACTOR_x */
194
195 unsigned alpha_func:3; /**< PIPE_BLEND_x */
196 unsigned alpha_src_factor:5; /**< PIPE_BLENDFACTOR_x */
197 unsigned alpha_dst_factor:5; /**< PIPE_BLENDFACTOR_x */
198
199 unsigned logicop_enable:1;
200 unsigned logicop_func:4; /**< PIPE_LOGICOP_x */
201
202 unsigned colormask:4; /**< bitmask of PIPE_MASK_R/G/B/A */
203 unsigned dither:1;
204 };
205
206
207 struct pipe_blend_color {
208 float color[4];
209 };
210
211
212 struct pipe_framebuffer_state
213 {
214 /** multiple colorbuffers for multiple render targets */
215 unsigned num_cbufs;
216 struct pipe_surface *cbufs[PIPE_MAX_COLOR_BUFS];
217
218 struct pipe_surface *zsbuf; /**< Z/stencil buffer */
219 };
220
221
222 /**
223 * Texture sampler state.
224 */
225 struct pipe_sampler_state
226 {
227 unsigned wrap_s:3; /**< PIPE_TEX_WRAP_x */
228 unsigned wrap_t:3; /**< PIPE_TEX_WRAP_x */
229 unsigned wrap_r:3; /**< PIPE_TEX_WRAP_x */
230 unsigned min_img_filter:2; /**< PIPE_TEX_FILTER_x */
231 unsigned min_mip_filter:2; /**< PIPE_TEX_MIPFILTER_x */
232 unsigned mag_img_filter:2; /**< PIPE_TEX_FILTER_x */
233 unsigned compare:1; /**< shadow/depth compare enabled? */
234 unsigned compare_mode:1; /**< PIPE_TEX_COMPARE_x */
235 unsigned compare_func:3; /**< PIPE_FUNC_x */
236 unsigned normalized_coords:1; /**< Are coords normalized to [0,1]? */
237 float shadow_ambient; /**< shadow test fail color/intensity */
238 float lod_bias; /**< LOD/lambda bias */
239 float min_lod, max_lod; /**< LOD clamp range, after bias */
240 float border_color[4];
241 float max_anisotropy;
242 };
243
244
245 /**
246 * 2D surface. This is basically a view into a memory buffer.
247 * May be a renderbuffer, texture mipmap level, etc.
248 */
249 struct pipe_surface
250 {
251 struct pipe_buffer *buffer; /**< driver private buffer handle */
252 enum pipe_format format; /**< PIPE_FORMAT_x */
253 unsigned status; /**< PIPE_SURFACE_STATUS_x */
254 unsigned clear_value; /**< may be temporary */
255 unsigned cpp; /**< bytes per pixel */
256 unsigned width, height;
257 unsigned pitch; /**< in pixels */
258 unsigned offset; /**< offset from start of buffer, in bytes */
259 unsigned refcount;
260 struct pipe_winsys *winsys; /**< winsys which owns/created the surface */
261 };
262
263
264 /**
265 * Texture. Represents one or several texture images on one or several mipmap
266 * levels.
267 */
268 struct pipe_texture
269 {
270 /* Effectively the key:
271 */
272 enum pipe_texture_target target; /**< PIPE_TEXTURE_x */
273 enum pipe_format format; /**< PIPE_FORMAT_x */
274
275 unsigned last_level; /**< Index of last mipmap level present/defined */
276
277 unsigned width[PIPE_MAX_TEXTURE_LEVELS];
278 unsigned height[PIPE_MAX_TEXTURE_LEVELS];
279 unsigned depth[PIPE_MAX_TEXTURE_LEVELS];
280 unsigned cpp;
281
282 unsigned compressed:1;
283
284 /* These are also refcounted:
285 */
286 unsigned refcount;
287 };
288
289
290 /**
291 * A vertex buffer. Typically, all the vertex data/attributes for
292 * drawing something will be in one buffer. But it's also possible, for
293 * example, to put colors in one buffer and texcoords in another.
294 */
295 struct pipe_vertex_buffer
296 {
297 unsigned pitch:11; /**< stride to same attrib in next vertex, in bytes */
298 unsigned max_index; /**< number of vertices in this buffer */
299 unsigned buffer_offset; /**< offset to start of data in buffer, in bytes */
300 struct pipe_buffer *buffer; /**< the actual buffer */
301 };
302
303
304 /**
305 * Information to describe a vertex attribute (position, color, etc)
306 */
307 struct pipe_vertex_element
308 {
309 /** Offset of this attribute, in bytes, from the start of the vertex */
310 unsigned src_offset:11;
311
312 /** Which vertex_buffer (as given to pipe->set_vertex_buffer()) does
313 * this attribute live in?
314 */
315 unsigned vertex_buffer_index:5;
316 unsigned nr_components:3;
317
318 enum pipe_format src_format; /**< PIPE_FORMAT_* */
319 };
320
321
322 #endif