Squashed commit of the following:
[profile/ivi/mesa.git] / src / gallium / include / 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  * @file
31  * 
32  * Abstract graphics pipe state objects.
33  *
34  * Basic notes:
35  *   1. Want compact representations, so we use bitfields.
36  *   2. Put bitfields before other (GLfloat) fields.
37  */
38
39
40 #ifndef PIPE_STATE_H
41 #define PIPE_STATE_H
42
43 #include "p_compiler.h"
44 #include "p_defines.h"
45 #include "p_format.h"
46 #include "p_screen.h"
47
48
49 #ifdef __cplusplus
50 extern "C" {
51 #endif
52
53
54 /**
55  * Implementation limits
56  */
57 #define PIPE_MAX_ATTRIBS          32
58 #define PIPE_MAX_CLIP_PLANES       6
59 #define PIPE_MAX_COLOR_BUFS        8
60 #define PIPE_MAX_CONSTANT_BUFFERS 32
61 #define PIPE_MAX_SAMPLERS         16
62 #define PIPE_MAX_VERTEX_SAMPLERS  16
63 #define PIPE_MAX_SHADER_INPUTS    16
64 #define PIPE_MAX_SHADER_OUTPUTS   16
65 #define PIPE_MAX_TEXTURE_LEVELS   16
66
67
68 struct pipe_reference
69 {
70    int32_t count; /* atomic */
71 };
72
73
74
75 /**
76  * Primitive (point/line/tri) rasterization info
77  */
78 struct pipe_rasterizer_state
79 {
80    unsigned flatshade:1;
81    unsigned light_twoside:1;
82    unsigned front_winding:2;  /**< PIPE_WINDING_x */
83    unsigned cull_mode:2;      /**< PIPE_WINDING_x */
84    unsigned fill_cw:2;        /**< PIPE_POLYGON_MODE_x */
85    unsigned fill_ccw:2;       /**< PIPE_POLYGON_MODE_x */
86    unsigned offset_cw:1;
87    unsigned offset_ccw:1;
88    unsigned scissor:1;
89    unsigned poly_smooth:1;
90    unsigned poly_stipple_enable:1;
91    unsigned point_smooth:1;
92    unsigned sprite_coord_enable:PIPE_MAX_SHADER_OUTPUTS;
93    unsigned sprite_coord_mode:1;     /**< PIPE_SPRITE_COORD_ */
94    unsigned point_quad_rasterization:1; /** points rasterized as quads or points */
95    unsigned point_size_per_vertex:1; /**< size computed in vertex shader */
96    unsigned multisample:1;         /* XXX maybe more ms state in future */
97    unsigned line_smooth:1;
98    unsigned line_stipple_enable:1;
99    unsigned line_stipple_factor:8;  /**< [1..256] actually */
100    unsigned line_stipple_pattern:16;
101    unsigned line_last_pixel:1;
102
103    /** 
104     * Use the first vertex of a primitive as the provoking vertex for
105     * flat shading.
106     */
107    unsigned flatshade_first:1;   
108
109    /** 
110     * When true, triangle rasterization uses (0.5, 0.5) pixel centers
111     * for determining pixel ownership.
112     *
113     * When false, triangle rasterization uses (0,0) pixel centers for
114     * determining pixel ownership.
115     *
116     * Triangle rasterization always uses a 'top,left' rule for pixel
117     * ownership, this just alters which point we consider the pixel
118     * center for that test.
119     */
120    unsigned gl_rasterization_rules:1;
121
122    float line_width;
123    float point_size;           /**< used when no per-vertex size */
124    float offset_units;
125    float offset_scale;
126 };
127
128
129 struct pipe_poly_stipple
130 {
131    unsigned stipple[32];
132 };
133
134
135 struct pipe_viewport_state
136 {
137    float scale[4];
138    float translate[4];
139 };
140
141
142 struct pipe_scissor_state
143 {
144    unsigned minx:16;
145    unsigned miny:16;
146    unsigned maxx:16;
147    unsigned maxy:16;
148 };
149
150
151 struct pipe_clip_state
152 {
153    float ucp[PIPE_MAX_CLIP_PLANES][4];
154    unsigned nr;
155 };
156
157
158 struct pipe_shader_state
159 {
160    const struct tgsi_token *tokens;
161 };
162
163
164 struct pipe_depth_state 
165 {
166    unsigned enabled:1;         /**< depth test enabled? */
167    unsigned writemask:1;       /**< allow depth buffer writes? */
168    unsigned func:3;            /**< depth test func (PIPE_FUNC_x) */
169 };
170
171
172 struct pipe_stencil_state
173 {
174    unsigned enabled:1;  /**< stencil[0]: stencil enabled, stencil[1]: two-side enabled */
175    unsigned func:3;     /**< PIPE_FUNC_x */
176    unsigned fail_op:3;  /**< PIPE_STENCIL_OP_x */
177    unsigned zpass_op:3; /**< PIPE_STENCIL_OP_x */
178    unsigned zfail_op:3; /**< PIPE_STENCIL_OP_x */
179    unsigned valuemask:8;
180    unsigned writemask:8;
181 };
182
183
184 struct pipe_alpha_state
185 {
186    unsigned enabled:1;
187    unsigned func:3;     /**< PIPE_FUNC_x */
188    float ref_value;     /**< reference value */
189 };
190
191
192 struct pipe_depth_stencil_alpha_state
193 {
194    struct pipe_depth_state depth;
195    struct pipe_stencil_state stencil[2]; /**< [0] = front, [1] = back */
196    struct pipe_alpha_state alpha;
197 };
198
199
200 struct pipe_rt_blend_state
201 {
202    unsigned blend_enable:1;
203
204    unsigned rgb_func:3;          /**< PIPE_BLEND_x */
205    unsigned rgb_src_factor:5;    /**< PIPE_BLENDFACTOR_x */
206    unsigned rgb_dst_factor:5;    /**< PIPE_BLENDFACTOR_x */
207
208    unsigned alpha_func:3;        /**< PIPE_BLEND_x */
209    unsigned alpha_src_factor:5;  /**< PIPE_BLENDFACTOR_x */
210    unsigned alpha_dst_factor:5;  /**< PIPE_BLENDFACTOR_x */
211
212    unsigned colormask:4;         /**< bitmask of PIPE_MASK_R/G/B/A */
213 };
214
215 struct pipe_blend_state
216 {
217    unsigned independent_blend_enable:1;
218    unsigned logicop_enable:1;
219    unsigned logicop_func:4;      /**< PIPE_LOGICOP_x */
220    unsigned dither:1;
221    struct pipe_rt_blend_state rt[PIPE_MAX_COLOR_BUFS];
222 };
223
224
225 struct pipe_blend_color
226 {
227    float color[4];
228 };
229
230 struct pipe_stencil_ref
231 {
232    ubyte ref_value[2];
233 };
234
235 struct pipe_framebuffer_state
236 {
237    unsigned width, height;
238
239    /** multiple color buffers for multiple render targets */
240    unsigned nr_cbufs;
241    struct pipe_surface *cbufs[PIPE_MAX_COLOR_BUFS];
242
243    struct pipe_surface *zsbuf;      /**< Z/stencil buffer */
244 };
245
246
247 /**
248  * Texture sampler state.
249  */
250 struct pipe_sampler_state
251 {
252    unsigned wrap_s:3;            /**< PIPE_TEX_WRAP_x */
253    unsigned wrap_t:3;            /**< PIPE_TEX_WRAP_x */
254    unsigned wrap_r:3;            /**< PIPE_TEX_WRAP_x */
255    unsigned min_img_filter:2;    /**< PIPE_TEX_FILTER_x */
256    unsigned min_mip_filter:2;    /**< PIPE_TEX_MIPFILTER_x */
257    unsigned mag_img_filter:2;    /**< PIPE_TEX_FILTER_x */
258    unsigned compare_mode:1;      /**< PIPE_TEX_COMPARE_x */
259    unsigned compare_func:3;      /**< PIPE_FUNC_x */
260    unsigned normalized_coords:1; /**< Are coords normalized to [0,1]? */
261    unsigned max_anisotropy:6;
262    float lod_bias;               /**< LOD/lambda bias */
263    float min_lod, max_lod;       /**< LOD clamp range, after bias */
264    float border_color[4];
265 };
266
267
268 /**
269  * 2D surface.  This is basically a view into a memory buffer.
270  * May be a renderbuffer, texture mipmap level, etc.
271  */
272 struct pipe_surface
273 {
274    struct pipe_reference reference;
275    struct pipe_resource *texture; /**< resource into which this is a view  */
276    enum pipe_format format;
277
278    unsigned width;               /**< logical width in pixels */
279    unsigned height;              /**< logical height in pixels */
280
281    unsigned layout;              /**< PIPE_SURFACE_LAYOUT_x */
282    unsigned offset;              /**< offset from start of buffer, in bytes */
283    unsigned usage;               /**< bitmask of PIPE_BIND_x */
284
285    unsigned zslice;
286    unsigned face;
287    unsigned level;
288 };
289
290
291
292
293
294 /**
295  * A view into a texture that can be bound to a shader stage.
296  */
297 struct pipe_sampler_view
298 {
299    struct pipe_reference reference;
300    enum pipe_format format;      /**< typed PIPE_FORMAT_x */
301    struct pipe_resource *texture; /**< texture into which this is a view  */
302    struct pipe_context *context; /**< context this view belongs to */
303    unsigned first_level:8;       /**< first mipmap level */
304    unsigned last_level:8;        /**< last mipmap level */
305    unsigned swizzle_r:3;         /**< PIPE_SWIZZLE_x for red component */
306    unsigned swizzle_g:3;         /**< PIPE_SWIZZLE_x for green component */
307    unsigned swizzle_b:3;         /**< PIPE_SWIZZLE_x for blue component */
308    unsigned swizzle_a:3;         /**< PIPE_SWIZZLE_x for alpha component */
309 };
310
311
312 struct pipe_box
313 {
314    unsigned x;
315    unsigned y;
316    unsigned z;
317    unsigned width;
318    unsigned height;
319    unsigned depth;
320 };
321
322
323
324 struct pipe_resource
325 {
326    struct pipe_reference reference;
327    struct pipe_screen *screen; /**< screen that this texture belongs to */
328    enum pipe_texture_target target; /**< PIPE_TEXTURE_x */
329    enum pipe_format format;         /**< PIPE_FORMAT_x */
330
331    unsigned width0;
332    unsigned height0;
333    unsigned depth0;
334
335    unsigned last_level:8;    /**< Index of last mipmap level present/defined */
336    unsigned nr_samples:8;    /**< for multisampled surfaces, nr of samples */
337    unsigned _usage:8;          /* PIPE_USAGE_x (not a bitmask) */
338
339    unsigned bind;              /* PIPE_BIND_x */
340    unsigned flags;             /* PIPE_RESOURCE_FLAG_x */
341 };
342
343
344 struct pipe_subresource
345 {
346    unsigned face:16;
347    unsigned level:16;
348 };
349
350
351 /**
352  * Transfer object.  For data transfer to/from a texture.
353  */
354 struct pipe_transfer
355 {
356    struct pipe_resource *resource; /**< resource to transfer to/from  */
357    struct pipe_subresource sr;
358    enum pipe_transfer_usage usage;
359    struct pipe_box box;
360    unsigned stride;
361    unsigned slice_stride;
362    void *data;
363 };
364
365
366
367 /**
368  * A vertex buffer.  Typically, all the vertex data/attributes for
369  * drawing something will be in one buffer.  But it's also possible, for
370  * example, to put colors in one buffer and texcoords in another.
371  */
372 struct pipe_vertex_buffer
373 {
374    unsigned stride;    /**< stride to same attrib in next vertex, in bytes */
375    unsigned max_index;   /**< number of vertices in this buffer */
376    unsigned buffer_offset;  /**< offset to start of data in buffer, in bytes */
377    struct pipe_resource *buffer;  /**< the actual buffer */
378 };
379
380
381 /**
382  * Information to describe a vertex attribute (position, color, etc)
383  */
384 struct pipe_vertex_element
385 {
386    /** Offset of this attribute, in bytes, from the start of the vertex */
387    unsigned src_offset;
388
389    /** Instance data rate divisor. 0 means this is per-vertex data,
390     *  n means per-instance data used for n consecutive instances (n > 0).
391     */
392    unsigned instance_divisor;
393
394    /** Which vertex_buffer (as given to pipe->set_vertex_buffer()) does
395     * this attribute live in?
396     */
397    unsigned vertex_buffer_index:8;
398  
399    enum pipe_format src_format;
400 };
401
402
403 #ifdef __cplusplus
404 }
405 #endif
406    
407 #endif