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