• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * mesa 3-D graphics library
3  *
4  * Copyright (C) 1999-2006  Brian Paul   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 "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22  * OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 /**
26  * \file t_context.h
27  * \brief TnL module datatypes and definitions.
28  * \author Keith Whitwell
29  */
30 
31 
32 /**
33  * \mainpage The TNL-module
34  *
35  * TNL stands for "transform and lighting", i.e. this module implements
36  * a pipeline that receives as input a buffer of vertices and does all
37  * necessary transformations (rotations, clipping, vertex shader etc.)
38  * and passes then the output to the rasterizer.
39  *
40  * The tnl_pipeline contains the array of all stages, which should be
41  * applied. Each stage is a black-box, which is described by an
42  * tnl_pipeline_stage. The function ::_tnl_run_pipeline applies all the
43  * stages to the vertex_buffer TNLcontext::vb, where the vertex data
44  * is stored. The last stage in the pipeline is the rasterizer.
45  *
46  */
47 
48 
49 #ifndef _T_CONTEXT_H
50 #define _T_CONTEXT_H
51 
52 #include "main/glheader.h"
53 #include "main/imports.h"
54 #include "main/mtypes.h"
55 
56 #include "math/m_vector.h"
57 
58 #include "vbo/vbo.h"
59 
60 #define MAX_PIPELINE_STAGES     30
61 
62 /*
63  * Note: The first attributes match the VERT_ATTRIB_* definitions
64  * in mtypes.h.  However, the tnl module has additional attributes
65  * for materials, color indexes, edge flags, etc.
66  */
67 /* Although it's nice to use these as bit indexes in a DWORD flag, we
68  * could manage without if necessary.  Another limit currently is the
69  * number of bits allocated for these numbers in places like vertex
70  * program instruction formats and register layouts.
71  */
72 /* The bit space exhaustion is a fact now, done by _TNL_ATTRIB_ATTRIBUTE* for
73  * GLSL vertex shader which cannot be aliased with conventional vertex attribs.
74  * Compacting _TNL_ATTRIB_MAT_* attribs would not work, they would not give
75  * as many free bits (11 plus already 1 free bit) as _TNL_ATTRIB_ATTRIBUTE*
76  * attribs want (16).
77  */
78 enum {
79 	_TNL_ATTRIB_POS,
80 	_TNL_ATTRIB_NORMAL,
81 	_TNL_ATTRIB_COLOR0,
82 	_TNL_ATTRIB_COLOR1,
83 	_TNL_ATTRIB_FOG,
84 	_TNL_ATTRIB_COLOR_INDEX,
85 	_TNL_ATTRIB_EDGEFLAG,
86 	_TNL_ATTRIB_TEX0,
87 	_TNL_ATTRIB_TEX1,
88 	_TNL_ATTRIB_TEX2,
89 	_TNL_ATTRIB_TEX3,
90 	_TNL_ATTRIB_TEX4,
91 	_TNL_ATTRIB_TEX5,
92 	_TNL_ATTRIB_TEX6,
93 	_TNL_ATTRIB_TEX7,
94 
95 	/* This is really a VARYING_SLOT, not an attrib.  Need to fix
96 	 * tnl to understand the difference.
97 	 */
98 	_TNL_ATTRIB_POINTSIZE,
99 
100 	_TNL_ATTRIB_GENERIC0, /* doesn't really exist! */
101 	_TNL_ATTRIB_GENERIC1,
102 	_TNL_ATTRIB_GENERIC2,
103 	_TNL_ATTRIB_GENERIC3,
104 	_TNL_ATTRIB_GENERIC4,
105 	_TNL_ATTRIB_GENERIC5,
106 	_TNL_ATTRIB_GENERIC6,
107 	_TNL_ATTRIB_GENERIC7,
108 	_TNL_ATTRIB_GENERIC8,
109 	_TNL_ATTRIB_GENERIC9,
110 	_TNL_ATTRIB_GENERIC10,
111 	_TNL_ATTRIB_GENERIC11,
112 	_TNL_ATTRIB_GENERIC12,
113 	_TNL_ATTRIB_GENERIC13,
114 	_TNL_ATTRIB_GENERIC14,
115 	_TNL_ATTRIB_GENERIC15,
116 
117 	_TNL_ATTRIB_MAX,
118 
119 	/* These alias with the generics, but they are not active
120 	 * concurrently, so it's not a problem.  The TNL module
121 	 * doesn't have to do anything about this as this is how they
122 	 * are passed into the _draw_prims callback.
123 	 *
124 	 * When we generate fixed-function replacement programs (in
125 	 * t_vp_build.c currently), they refer to the appropriate
126 	 * generic attribute in order to pick up per-vertex material
127 	 * data.
128 	 */
129 	_TNL_ATTRIB_MAT_FRONT_AMBIENT = _TNL_ATTRIB_GENERIC0,
130 	_TNL_ATTRIB_MAT_BACK_AMBIENT,
131 	_TNL_ATTRIB_MAT_FRONT_DIFFUSE,
132 	_TNL_ATTRIB_MAT_BACK_DIFFUSE,
133 	_TNL_ATTRIB_MAT_FRONT_SPECULAR,
134 	_TNL_ATTRIB_MAT_BACK_SPECULAR,
135 	_TNL_ATTRIB_MAT_FRONT_EMISSION,
136 	_TNL_ATTRIB_MAT_BACK_EMISSION,
137 	_TNL_ATTRIB_MAT_FRONT_SHININESS,
138 	_TNL_ATTRIB_MAT_BACK_SHININESS,
139 	_TNL_ATTRIB_MAT_FRONT_INDEXES,
140 	_TNL_ATTRIB_MAT_BACK_INDEXES,
141 };
142 
143 #define _TNL_ATTRIB_TEX(u)       (_TNL_ATTRIB_TEX0 + (u))
144 #define _TNL_ATTRIB_GENERIC(n) (_TNL_ATTRIB_GENERIC0 + (n))
145 
146 /* special index used for handing invalid glVertexAttribute() indices */
147 #define _TNL_ATTRIB_ERROR    (_TNL_ATTRIB_GENERIC15 + 1)
148 
149 /**
150  * Handy attribute ranges:
151  */
152 #define _TNL_FIRST_PROG      _TNL_ATTRIB_NORMAL
153 #define _TNL_LAST_PROG       _TNL_ATTRIB_TEX7
154 
155 #define _TNL_FIRST_TEX       _TNL_ATTRIB_TEX0
156 #define _TNL_LAST_TEX        _TNL_ATTRIB_TEX7
157 
158 #define _TNL_FIRST_GENERIC _TNL_ATTRIB_GENERIC0
159 #define _TNL_LAST_GENERIC  _TNL_ATTRIB_GENERIC15
160 
161 #define _TNL_FIRST_MAT       _TNL_ATTRIB_MAT_FRONT_AMBIENT /* GENERIC0 */
162 #define _TNL_LAST_MAT        _TNL_ATTRIB_MAT_BACK_INDEXES  /* GENERIC11 */
163 
164 /* Number of available texture attributes */
165 #define _TNL_NUM_TEX 8
166 
167 /* Number of available generic attributes */
168 #define _TNL_NUM_GENERIC 16
169 
170 /* Number of attributes used for evaluators */
171 #define _TNL_NUM_EVAL 16
172 
173 
174 #define PRIM_BEGIN     0x10
175 #define PRIM_END       0x20
176 #define PRIM_MODE_MASK 0x0f
177 
_tnl_translate_prim(const struct _mesa_prim * prim)178 static inline GLuint _tnl_translate_prim( const struct _mesa_prim *prim )
179 {
180    GLuint flag;
181    flag = prim->mode;
182    if (prim->begin) flag |= PRIM_BEGIN;
183    if (prim->end) flag |= PRIM_END;
184    return flag;
185 }
186 
187 
188 
189 
190 /**
191  * Contains the current state of a running pipeline.
192  */
193 struct vertex_buffer
194 {
195    GLuint Size;  /**< Max vertices per vertex buffer, constant */
196 
197    /* Constant over the pipeline.
198     */
199    GLuint Count;  /**< Number of vertices currently in buffer */
200 
201    /* Pointers to current data.  Most of the data is in AttribPtr -- all of
202     * it that is one of VERT_ATTRIB_X.  For things only produced by TNL,
203     * such as backface color or eye-space coordinates, they are stored
204     * here.
205     */
206    GLuint      *Elts;
207    GLvector4f  *EyePtr;		                /* _TNL_BIT_POS */
208    GLvector4f  *ClipPtr;	                /* _TNL_BIT_POS */
209    GLvector4f  *NdcPtr;                         /* _TNL_BIT_POS */
210    GLubyte     ClipOrMask;	                /* _TNL_BIT_POS */
211    GLubyte     ClipAndMask;	                /* _TNL_BIT_POS */
212    GLubyte     *ClipMask;		        /* _TNL_BIT_POS */
213    GLfloat     *NormalLengthPtr;	        /* _TNL_BIT_NORMAL */
214    GLboolean   *EdgeFlag;	                /* _TNL_BIT_EDGEFLAG */
215    GLvector4f  *BackfaceIndexPtr;
216    GLvector4f  *BackfaceColorPtr;
217    GLvector4f  *BackfaceSecondaryColorPtr;
218 
219    const struct _mesa_prim  *Primitive;
220    GLuint      PrimitiveCount;
221 
222    /* Inputs to the vertex program stage */
223    GLvector4f *AttribPtr[_TNL_ATTRIB_MAX];
224 };
225 
226 
227 /**
228  * Describes an individual operation on the pipeline.
229  */
230 struct tnl_pipeline_stage
231 {
232    const char *name;
233 
234    /* Private data for the pipeline stage:
235     */
236    void *privatePtr;
237 
238    /* Allocate private data
239     */
240    GLboolean (*create)( struct gl_context *ctx, struct tnl_pipeline_stage * );
241 
242    /* Free private data.
243     */
244    void (*destroy)( struct tnl_pipeline_stage * );
245 
246    /* Called on any statechange or input array size change or
247     * input array change to/from zero stride.
248     */
249    void (*validate)( struct gl_context *ctx, struct tnl_pipeline_stage * );
250 
251    /* Called from _tnl_run_pipeline().  The stage.changed_inputs value
252     * encodes all inputs to thee struct which have changed.  If
253     * non-zero, recompute all affected outputs of the stage, otherwise
254     * execute any 'sideeffects' of the stage.
255     *
256     * Return value: GL_TRUE - keep going
257     *               GL_FALSE - finished pipeline
258     */
259    GLboolean (*run)( struct gl_context *ctx, struct tnl_pipeline_stage * );
260 };
261 
262 
263 
264 /** Contains the array of all pipeline stages.
265  * The default values are defined at the end of t_pipeline.c
266  */
267 struct tnl_pipeline {
268 
269    GLuint last_attrib_stride[_TNL_ATTRIB_MAX];
270    GLuint last_attrib_size[_TNL_ATTRIB_MAX];
271    GLuint input_changes;
272    GLuint new_state;
273 
274    struct tnl_pipeline_stage stages[MAX_PIPELINE_STAGES+1];
275    GLuint nr_stages;
276 };
277 
278 struct tnl_clipspace;
279 struct tnl_clipspace_attr;
280 
281 typedef void (*tnl_extract_func)( const struct tnl_clipspace_attr *a,
282 				  GLfloat *out,
283 				  const GLubyte *v );
284 
285 typedef void (*tnl_insert_func)( const struct tnl_clipspace_attr *a,
286 				 GLubyte *v,
287 				 const GLfloat *in );
288 
289 typedef void (*tnl_emit_func)( struct gl_context *ctx,
290 			       GLuint count,
291 			       GLubyte *dest );
292 
293 
294 /**
295  * Describes how to convert/move a vertex attribute from a vertex array
296  * to a vertex structure.
297  */
298 struct tnl_clipspace_attr
299 {
300    GLuint attrib;          /* which vertex attrib (0=position, etc) */
301    GLuint format;
302    GLuint vertoffset;      /* position of the attrib in the vertex struct */
303    GLuint vertattrsize;    /* size of the attribute in bytes */
304    GLubyte *inputptr;
305    GLuint inputstride;
306    GLuint inputsize;
307    const tnl_insert_func *insert;
308    tnl_insert_func emit;
309    tnl_extract_func extract;
310    const GLfloat *vp;   /* NDC->Viewport mapping matrix */
311 };
312 
313 
314 
315 
316 typedef void (*tnl_points_func)( struct gl_context *ctx, GLuint first, GLuint last );
317 typedef void (*tnl_line_func)( struct gl_context *ctx, GLuint v1, GLuint v2 );
318 typedef void (*tnl_triangle_func)( struct gl_context *ctx,
319 				   GLuint v1, GLuint v2, GLuint v3 );
320 typedef void (*tnl_quad_func)( struct gl_context *ctx, GLuint v1, GLuint v2,
321 			       GLuint v3, GLuint v4 );
322 typedef void (*tnl_render_func)( struct gl_context *ctx, GLuint start, GLuint count,
323 				 GLuint flags );
324 typedef void (*tnl_interp_func)( struct gl_context *ctx,
325 				 GLfloat t, GLuint dst, GLuint out, GLuint in,
326 				 GLboolean force_boundary );
327 typedef void (*tnl_copy_pv_func)( struct gl_context *ctx, GLuint dst, GLuint src );
328 typedef void (*tnl_setup_func)( struct gl_context *ctx,
329 				GLuint start, GLuint end,
330 				GLuint new_inputs);
331 
332 
333 struct tnl_attr_type {
334    GLuint format;
335    GLuint size;
336    GLuint stride;
337    GLuint offset;
338 };
339 
340 struct tnl_clipspace_fastpath {
341    GLuint vertex_size;
342    GLuint attr_count;
343    GLboolean match_strides;
344 
345    struct tnl_attr_type *attr;
346 
347    tnl_emit_func func;
348    struct tnl_clipspace_fastpath *next;
349 };
350 
351 /**
352  * Used to describe conversion of vertex arrays to vertex structures.
353  * I.e. Structure of arrays to arrays of structs.
354  */
355 struct tnl_clipspace
356 {
357    GLboolean need_extras;
358 
359    GLuint new_inputs;
360 
361    GLubyte *vertex_buf;
362    GLuint vertex_size;
363    GLuint max_vertex_size;
364 
365    struct tnl_clipspace_attr attr[_TNL_ATTRIB_MAX];
366    GLuint attr_count;
367 
368    tnl_emit_func emit;
369    tnl_interp_func interp;
370    tnl_copy_pv_func copy_pv;
371 
372    /* Parameters and constants for codegen:
373     */
374    GLboolean need_viewport;
375    GLfloat vp_scale[4];
376    GLfloat vp_xlate[4];
377    GLfloat chan_scale[4];
378    GLfloat identity[4];
379 
380    struct tnl_clipspace_fastpath *fastpath;
381 
382    void (*codegen_emit)( struct gl_context *ctx );
383 };
384 
385 
386 #define SHINE_TABLE_SIZE 256	/**< Material shininess lookup table sizes */
387 
388 /**
389  * Material shininess lookup table.
390  */
391 struct tnl_shine_tab
392 {
393    struct tnl_shine_tab *next, *prev;
394    GLfloat tab[SHINE_TABLE_SIZE+1];
395    GLfloat shininess;
396    GLuint refcount;
397 };
398 
399 
400 struct tnl_device_driver
401 {
402    /***
403     *** TNL Pipeline
404     ***/
405 
406    void (*RunPipeline)(struct gl_context *ctx);
407    /* Replaces PipelineStart/PipelineFinish -- intended to allow
408     * drivers to wrap _tnl_run_pipeline() with code to validate state
409     * and grab/release hardware locks.
410     */
411 
412    void (*NotifyMaterialChange)(struct gl_context *ctx);
413    /* Alert tnl-aware drivers of changes to material.
414     */
415 
416    /***
417     *** Rendering -- These functions called only from t_vb_render.c
418     ***/
419    struct
420    {
421       void (*Start)(struct gl_context *ctx);
422       void (*Finish)(struct gl_context *ctx);
423       /* Called before and after all rendering operations, including DrawPixels,
424        * ReadPixels, Bitmap, span functions, and CopyTexImage, etc commands.
425        * These are a suitable place for grabbing/releasing hardware locks.
426        */
427 
428       void (*PrimitiveNotify)(struct gl_context *ctx, GLenum mode);
429       /* Called between RenderStart() and RenderFinish() to indicate the
430        * type of primitive we're about to draw.  Mode will be one of the
431        * modes accepted by glBegin().
432        */
433 
434       tnl_interp_func Interp;
435       /* The interp function is called by the clipping routines when we need
436        * to generate an interpolated vertex.  All pertinant vertex ancilliary
437        * data should be computed by interpolating between the 'in' and 'out'
438        * vertices.
439        */
440 
441       tnl_copy_pv_func CopyPV;
442       /* The copy function is used to make a copy of a vertex.  All pertinant
443        * vertex attributes should be copied.
444        */
445 
446       void (*ClippedPolygon)( struct gl_context *ctx, const GLuint *elts, GLuint n );
447       /* Render a polygon with <n> vertices whose indexes are in the <elts>
448        * array.
449        */
450 
451       void (*ClippedLine)( struct gl_context *ctx, GLuint v0, GLuint v1 );
452       /* Render a line between the two vertices given by indexes v0 and v1. */
453 
454       tnl_points_func           Points; /* must now respect vb->elts */
455       tnl_line_func             Line;
456       tnl_triangle_func         Triangle;
457       tnl_quad_func             Quad;
458       /* These functions are called in order to render points, lines,
459        * triangles and quads.  These are only called via the T&L module.
460        */
461 
462       tnl_render_func          *PrimTabVerts;
463       tnl_render_func          *PrimTabElts;
464       /* Render whole unclipped primitives (points, lines, linestrips,
465        * lineloops, etc).  The tables are indexed by the GL enum of the
466        * primitive to be rendered.  RenderTabVerts is used for non-indexed
467        * arrays of vertices.  RenderTabElts is used for indexed arrays of
468        * vertices.
469        */
470 
471       void (*ResetLineStipple)( struct gl_context *ctx );
472       /* Reset the hardware's line stipple counter.
473        */
474 
475       tnl_setup_func BuildVertices;
476       /* This function is called whenever new vertices are required for
477        * rendering.  The vertices in question are those n such that start
478        * <= n < end.  The new_inputs parameter indicates those fields of
479        * the vertex which need to be updated, if only a partial repair of
480        * the vertex is required.
481        *
482        * This function is called only from _tnl_render_stage in tnl/t_render.c.
483        */
484 
485 
486       GLboolean (*Multipass)( struct gl_context *ctx, GLuint passno );
487       /* Driver may request additional render passes by returning GL_TRUE
488        * when this function is called.  This function will be called
489        * after the first pass, and passes will be made until the function
490        * returns GL_FALSE.  If no function is registered, only one pass
491        * is made.
492        *
493        * This function will be first invoked with passno == 1.
494        */
495    } Render;
496 };
497 
498 
499 /**
500  * Context state for T&L context.
501  */
502 typedef struct
503 {
504    /* Driver interface.
505     */
506    struct tnl_device_driver Driver;
507 
508    /* Pipeline
509     */
510    struct tnl_pipeline pipeline;
511    struct vertex_buffer vb;
512 
513    /* Clipspace/ndc/window vertex managment:
514     */
515    struct tnl_clipspace clipspace;
516    GLmatrix _WindowMap;
517 
518    /* Probably need a better configuration mechanism:
519     */
520    GLboolean NeedNdcCoords;
521    GLboolean AllowVertexFog;
522    GLboolean AllowPixelFog;
523    GLboolean _DoVertexFog;  /* eval fog function at each vertex? */
524 
525    GLbitfield64 render_inputs_bitset;
526 
527    GLvector4f tmp_inputs[VERT_ATTRIB_MAX];
528 
529    /* Temp storage for t_draw.c:
530     */
531    GLubyte *block[VERT_ATTRIB_MAX];
532    GLuint nr_blocks;
533 
534    GLuint CurInstance;
535 
536    struct tnl_shine_tab *_ShineTable[2]; /**< Active shine tables */
537    struct tnl_shine_tab *_ShineTabList;  /**< MRU list of inactive shine tables */
538    /**@}*/
539 } TNLcontext;
540 
541 
542 
543 #define TNL_CONTEXT(ctx) ((TNLcontext *)((ctx)->swtnl_context))
544 
545 
546 #define TYPE_IDX(t) ((t) & 0xf)
547 #define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1      /* 0xa + 1 */
548 
549 
550 extern void
551 tnl_clip_prepare(struct gl_context *ctx);
552 
553 
554 #endif
555