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