t_context.h revision cdc920a0
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/bitset.h" 54#include "main/mtypes.h" 55 56#include "math/m_matrix.h" 57#include "math/m_vector.h" 58#include "math/m_xform.h" 59 60#include "vbo/vbo.h" 61 62#define MAX_PIPELINE_STAGES 30 63 64/* 65 * Note: The first attributes match the VERT_ATTRIB_* definitions 66 * in mtypes.h. However, the tnl module has additional attributes 67 * for materials, color indexes, edge flags, etc. 68 */ 69/* Although it's nice to use these as bit indexes in a DWORD flag, we 70 * could manage without if necessary. Another limit currently is the 71 * number of bits allocated for these numbers in places like vertex 72 * program instruction formats and register layouts. 73 */ 74/* The bit space exhaustion is a fact now, done by _TNL_ATTRIB_ATTRIBUTE* for 75 * GLSL vertex shader which cannot be aliased with conventional vertex attribs. 76 * Compacting _TNL_ATTRIB_MAT_* attribs would not work, they would not give 77 * as many free bits (11 plus already 1 free bit) as _TNL_ATTRIB_ATTRIBUTE* 78 * attribs want (16). 79 */ 80enum { 81 _TNL_ATTRIB_POS = 0, 82 _TNL_ATTRIB_WEIGHT = 1, 83 _TNL_ATTRIB_NORMAL = 2, 84 _TNL_ATTRIB_COLOR0 = 3, 85 _TNL_ATTRIB_COLOR1 = 4, 86 _TNL_ATTRIB_FOG = 5, 87 _TNL_ATTRIB_COLOR_INDEX = 6, 88 _TNL_ATTRIB_EDGEFLAG = 7, 89 _TNL_ATTRIB_TEX0 = 8, 90 _TNL_ATTRIB_TEX1 = 9, 91 _TNL_ATTRIB_TEX2 = 10, 92 _TNL_ATTRIB_TEX3 = 11, 93 _TNL_ATTRIB_TEX4 = 12, 94 _TNL_ATTRIB_TEX5 = 13, 95 _TNL_ATTRIB_TEX6 = 14, 96 _TNL_ATTRIB_TEX7 = 15, 97 98 _TNL_ATTRIB_GENERIC0 = 16, /* doesn't really exist! */ 99 _TNL_ATTRIB_GENERIC1 = 17, 100 _TNL_ATTRIB_GENERIC2 = 18, 101 _TNL_ATTRIB_GENERIC3 = 19, 102 _TNL_ATTRIB_GENERIC4 = 20, 103 _TNL_ATTRIB_GENERIC5 = 21, 104 _TNL_ATTRIB_GENERIC6 = 22, 105 _TNL_ATTRIB_GENERIC7 = 23, 106 _TNL_ATTRIB_GENERIC8 = 24, 107 _TNL_ATTRIB_GENERIC9 = 25, 108 _TNL_ATTRIB_GENERIC10 = 26, 109 _TNL_ATTRIB_GENERIC11 = 27, 110 _TNL_ATTRIB_GENERIC12 = 28, 111 _TNL_ATTRIB_GENERIC13 = 29, 112 _TNL_ATTRIB_GENERIC14 = 30, 113 _TNL_ATTRIB_GENERIC15 = 31, 114 115 /* These alias with the generics, but they are not active 116 * concurrently, so it's not a problem. The TNL module 117 * doesn't have to do anything about this as this is how they 118 * are passed into the _draw_prims callback. 119 * 120 * When we generate fixed-function replacement programs (in 121 * t_vp_build.c currently), they refer to the appropriate 122 * generic attribute in order to pick up per-vertex material 123 * data. 124 */ 125 _TNL_ATTRIB_MAT_FRONT_AMBIENT = 16, 126 _TNL_ATTRIB_MAT_BACK_AMBIENT = 17, 127 _TNL_ATTRIB_MAT_FRONT_DIFFUSE = 18, 128 _TNL_ATTRIB_MAT_BACK_DIFFUSE = 19, 129 _TNL_ATTRIB_MAT_FRONT_SPECULAR = 20, 130 _TNL_ATTRIB_MAT_BACK_SPECULAR = 21, 131 _TNL_ATTRIB_MAT_FRONT_EMISSION = 22, 132 _TNL_ATTRIB_MAT_BACK_EMISSION = 23, 133 _TNL_ATTRIB_MAT_FRONT_SHININESS = 24, 134 _TNL_ATTRIB_MAT_BACK_SHININESS = 25, 135 _TNL_ATTRIB_MAT_FRONT_INDEXES = 26, 136 _TNL_ATTRIB_MAT_BACK_INDEXES = 27, 137 138 /* This is really a VERT_RESULT, not an attrib. Need to fix 139 * tnl to understand the difference. 140 */ 141 _TNL_ATTRIB_POINTSIZE = 16, 142 143 _TNL_ATTRIB_MAX = 32 144} ; 145 146#define _TNL_ATTRIB_TEX(u) (_TNL_ATTRIB_TEX0 + (u)) 147#define _TNL_ATTRIB_GENERIC(n) (_TNL_ATTRIB_GENERIC0 + (n)) 148 149/* special index used for handing invalid glVertexAttribute() indices */ 150#define _TNL_ATTRIB_ERROR (_TNL_ATTRIB_GENERIC15 + 1) 151 152/** 153 * Handy attribute ranges: 154 */ 155#define _TNL_FIRST_PROG _TNL_ATTRIB_WEIGHT 156#define _TNL_LAST_PROG _TNL_ATTRIB_TEX7 157 158#define _TNL_FIRST_TEX _TNL_ATTRIB_TEX0 159#define _TNL_LAST_TEX _TNL_ATTRIB_TEX7 160 161#define _TNL_FIRST_GENERIC _TNL_ATTRIB_GENERIC0 162#define _TNL_LAST_GENERIC _TNL_ATTRIB_GENERIC15 163 164#define _TNL_FIRST_MAT _TNL_ATTRIB_MAT_FRONT_AMBIENT /* GENERIC0 */ 165#define _TNL_LAST_MAT _TNL_ATTRIB_MAT_BACK_INDEXES /* GENERIC11 */ 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 178static 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 */ 193struct 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]; /* GL_NV_vertex_program */ 224}; 225 226 227/** 228 * Describes an individual operation on the pipeline. 229 */ 230struct 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)( GLcontext *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)( GLcontext *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)( GLcontext *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 */ 267struct 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 278struct tnl_clipspace; 279struct tnl_clipspace_attr; 280 281typedef void (*tnl_extract_func)( const struct tnl_clipspace_attr *a, 282 GLfloat *out, 283 const GLubyte *v ); 284 285typedef void (*tnl_insert_func)( const struct tnl_clipspace_attr *a, 286 GLubyte *v, 287 const GLfloat *in ); 288 289typedef void (*tnl_emit_func)( GLcontext *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 */ 298struct 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 316typedef void (*tnl_points_func)( GLcontext *ctx, GLuint first, GLuint last ); 317typedef void (*tnl_line_func)( GLcontext *ctx, GLuint v1, GLuint v2 ); 318typedef void (*tnl_triangle_func)( GLcontext *ctx, 319 GLuint v1, GLuint v2, GLuint v3 ); 320typedef void (*tnl_quad_func)( GLcontext *ctx, GLuint v1, GLuint v2, 321 GLuint v3, GLuint v4 ); 322typedef void (*tnl_render_func)( GLcontext *ctx, GLuint start, GLuint count, 323 GLuint flags ); 324typedef void (*tnl_interp_func)( GLcontext *ctx, 325 GLfloat t, GLuint dst, GLuint out, GLuint in, 326 GLboolean force_boundary ); 327typedef void (*tnl_copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src ); 328typedef void (*tnl_setup_func)( GLcontext *ctx, 329 GLuint start, GLuint end, 330 GLuint new_inputs); 331 332 333struct tnl_attr_type { 334 GLuint format; 335 GLuint size; 336 GLuint stride; 337 GLuint offset; 338}; 339 340struct 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 */ 355struct 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)( GLcontext *ctx ); 383}; 384 385 386struct tnl_device_driver 387{ 388 /*** 389 *** TNL Pipeline 390 ***/ 391 392 void (*RunPipeline)(GLcontext *ctx); 393 /* Replaces PipelineStart/PipelineFinish -- intended to allow 394 * drivers to wrap _tnl_run_pipeline() with code to validate state 395 * and grab/release hardware locks. 396 */ 397 398 void (*NotifyMaterialChange)(GLcontext *ctx); 399 /* Alert tnl-aware drivers of changes to material. 400 */ 401 402 /*** 403 *** Rendering -- These functions called only from t_vb_render.c 404 ***/ 405 struct 406 { 407 void (*Start)(GLcontext *ctx); 408 void (*Finish)(GLcontext *ctx); 409 /* Called before and after all rendering operations, including DrawPixels, 410 * ReadPixels, Bitmap, span functions, and CopyTexImage, etc commands. 411 * These are a suitable place for grabbing/releasing hardware locks. 412 */ 413 414 void (*PrimitiveNotify)(GLcontext *ctx, GLenum mode); 415 /* Called between RenderStart() and RenderFinish() to indicate the 416 * type of primitive we're about to draw. Mode will be one of the 417 * modes accepted by glBegin(). 418 */ 419 420 tnl_interp_func Interp; 421 /* The interp function is called by the clipping routines when we need 422 * to generate an interpolated vertex. All pertinant vertex ancilliary 423 * data should be computed by interpolating between the 'in' and 'out' 424 * vertices. 425 */ 426 427 tnl_copy_pv_func CopyPV; 428 /* The copy function is used to make a copy of a vertex. All pertinant 429 * vertex attributes should be copied. 430 */ 431 432 void (*ClippedPolygon)( GLcontext *ctx, const GLuint *elts, GLuint n ); 433 /* Render a polygon with <n> vertices whose indexes are in the <elts> 434 * array. 435 */ 436 437 void (*ClippedLine)( GLcontext *ctx, GLuint v0, GLuint v1 ); 438 /* Render a line between the two vertices given by indexes v0 and v1. */ 439 440 tnl_points_func Points; /* must now respect vb->elts */ 441 tnl_line_func Line; 442 tnl_triangle_func Triangle; 443 tnl_quad_func Quad; 444 /* These functions are called in order to render points, lines, 445 * triangles and quads. These are only called via the T&L module. 446 */ 447 448 tnl_render_func *PrimTabVerts; 449 tnl_render_func *PrimTabElts; 450 /* Render whole unclipped primitives (points, lines, linestrips, 451 * lineloops, etc). The tables are indexed by the GL enum of the 452 * primitive to be rendered. RenderTabVerts is used for non-indexed 453 * arrays of vertices. RenderTabElts is used for indexed arrays of 454 * vertices. 455 */ 456 457 void (*ResetLineStipple)( GLcontext *ctx ); 458 /* Reset the hardware's line stipple counter. 459 */ 460 461 tnl_setup_func BuildVertices; 462 /* This function is called whenever new vertices are required for 463 * rendering. The vertices in question are those n such that start 464 * <= n < end. The new_inputs parameter indicates those fields of 465 * the vertex which need to be updated, if only a partial repair of 466 * the vertex is required. 467 * 468 * This function is called only from _tnl_render_stage in tnl/t_render.c. 469 */ 470 471 472 GLboolean (*Multipass)( GLcontext *ctx, GLuint passno ); 473 /* Driver may request additional render passes by returning GL_TRUE 474 * when this function is called. This function will be called 475 * after the first pass, and passes will be made until the function 476 * returns GL_FALSE. If no function is registered, only one pass 477 * is made. 478 * 479 * This function will be first invoked with passno == 1. 480 */ 481 } Render; 482}; 483 484 485#define DECLARE_RENDERINPUTS(name) BITSET64_DECLARE(name, _TNL_ATTRIB_MAX) 486#define RENDERINPUTS_COPY BITSET64_COPY 487#define RENDERINPUTS_EQUAL BITSET64_EQUAL 488#define RENDERINPUTS_ZERO BITSET64_ZERO 489#define RENDERINPUTS_ONES BITSET64_ONES 490#define RENDERINPUTS_TEST BITSET64_TEST 491#define RENDERINPUTS_SET BITSET64_SET 492#define RENDERINPUTS_CLEAR BITSET64_CLEAR 493#define RENDERINPUTS_TEST_RANGE BITSET64_TEST_RANGE 494#define RENDERINPUTS_SET_RANGE BITSET64_SET_RANGE 495#define RENDERINPUTS_CLEAR_RANGE BITSET64_CLEAR_RANGE 496 497 498/** 499 * Context state for T&L context. 500 */ 501typedef struct 502{ 503 /* Driver interface. 504 */ 505 struct tnl_device_driver Driver; 506 507 /* Pipeline 508 */ 509 struct tnl_pipeline pipeline; 510 struct vertex_buffer vb; 511 512 /* Clipspace/ndc/window vertex managment: 513 */ 514 struct tnl_clipspace clipspace; 515 516 /* Probably need a better configuration mechanism: 517 */ 518 GLboolean NeedNdcCoords; 519 GLboolean AllowVertexFog; 520 GLboolean AllowPixelFog; 521 GLboolean _DoVertexFog; /* eval fog function at each vertex? */ 522 523 DECLARE_RENDERINPUTS(render_inputs_bitset); 524 525 GLvector4f tmp_inputs[VERT_ATTRIB_MAX]; 526 527 /* Temp storage for t_draw.c: 528 */ 529 GLubyte *block[VERT_ATTRIB_MAX]; 530 GLuint nr_blocks; 531 532} TNLcontext; 533 534 535 536#define TNL_CONTEXT(ctx) ((TNLcontext *)((ctx)->swtnl_context)) 537 538 539#define TYPE_IDX(t) ((t) & 0xf) 540#define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1 /* 0xa + 1 */ 541 542 543extern void 544tnl_clip_prepare(GLcontext *ctx); 545 546 547#endif 548