• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * mesa 3-D graphics library
3   * Version:  6.5
4   *
5   * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6   *
7   * Permission is hereby granted, free of charge, to any person obtaining a
8   * copy of this software and associated documentation files (the "Software"),
9   * to deal in the Software without restriction, including without limitation
10   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11   * and/or sell copies of the Software, and to permit persons to whom the
12   * Software is furnished to do so, subject to the following conditions:
13   *
14   * The above copyright notice and this permission notice shall be included
15   * in all copies or substantial portions of the Software.
16   *
17   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18   * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20   * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21   * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22   * CONNECTION WITH THE SOFTWARE OR THE USE OR 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 VERT_RESULT, 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];      /* GL_NV_vertex_program */
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  
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