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