X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Ftnl%2Ft_context.h;h=ca4edcfcb9b940974719456b1b1a89e6256c2dc4;hb=5e77b61e393144e76fe0a280c3c5da2d36703bbb;hp=ec5675faf915270e8bb14664717a91348f21f7b6;hpb=c8100a02d28c8a424f69723778abebd950914bc6;p=mesa.git diff --git a/src/mesa/tnl/t_context.h b/src/mesa/tnl/t_context.h index ec5675faf91..ca4edcfcb9b 100644 --- a/src/mesa/tnl/t_context.h +++ b/src/mesa/tnl/t_context.h @@ -1,8 +1,8 @@ /* * mesa 3-D graphics library - * Version: 5.1 + * Version: 6.5 * - * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -43,57 +43,39 @@ * stages to the vertex_buffer TNLcontext::vb, where the vertex data * is stored. The last stage in the pipeline is the rasterizer. * - * The initial vertex_buffer data may either come from an ::immediate - * structure or client vertex_arrays or display lists: - * - * - * - The ::immediate structure records all the GL commands issued between - * glBegin and glEnd. \n - * The structure accumulates data, until it is either full or it is - * flushed (usually by a state change). Before starting then the pipeline, - * the collected vertex data in ::immediate has to be pushed into - * TNLcontext::vb. - * This happens in ::_tnl_vb_bind_immediate. The pipeline is then run by - * calling tnl_device_driver::RunPipeline = ::_tnl_run_pipeline, which - * is stored in TNLcontext::Driver. \n - * An ::immediate does (for performance reasons) usually not finish with a - * glEnd, and hence it also does not need to start with a glBegin. - * This means that the last vertices of one ::immediate may need to be - * saved for the next one. - * - * - * - NOT SURE ABOUT THIS: The vertex_arrays structure is used to handle - * glDrawArrays etc. \n - * Here, the data of the vertex_arrays is copied by ::_tnl_vb_bind_arrays - * into TNLcontext::vb, so that the pipeline can be started. */ #ifndef _T_CONTEXT_H #define _T_CONTEXT_H -#include "glheader.h" -#include "mtypes.h" +#include "main/glheader.h" +#include "main/bitset.h" +#include "main/mtypes.h" #include "math/m_matrix.h" #include "math/m_vector.h" #include "math/m_xform.h" +#include "vbo/vbo.h" #define MAX_PIPELINE_STAGES 30 - /* * Note: The first attributes match the VERT_ATTRIB_* definitions * in mtypes.h. However, the tnl module has additional attributes * for materials, color indexes, edge flags, etc. */ -/* Note: These are currently being used to define both inputs and - * outputs from the tnl pipeline. A better solution (which would also - * releive the congestion to slightly prolong the life of the bitmask - * below) is to have the fixed function pipeline populate a set of - * arrays named after those produced by the vertex program stage, and - * have the rest the mesa backend work on those. +/* Although it's nice to use these as bit indexes in a DWORD flag, we + * could manage without if necessary. Another limit currently is the + * number of bits allocated for these numbers in places like vertex + * program instruction formats and register layouts. + */ +/* The bit space exhaustion is a fact now, done by _TNL_ATTRIB_ATTRIBUTE* for + * GLSL vertex shader which cannot be aliased with conventional vertex attribs. + * Compacting _TNL_ATTRIB_MAT_* attribs would not work, they would not give + * as many free bits (11 plus already 1 free bit) as _TNL_ATTRIB_ATTRIBUTE* + * attribs want (16). */ enum { _TNL_ATTRIB_POS = 0, @@ -102,8 +84,8 @@ enum { _TNL_ATTRIB_COLOR0 = 3, _TNL_ATTRIB_COLOR1 = 4, _TNL_ATTRIB_FOG = 5, - _TNL_ATTRIB_SIX = 6, - _TNL_ATTRIB_SEVEN = 7, + _TNL_ATTRIB_COLOR_INDEX = 6, + _TNL_ATTRIB_EDGEFLAG = 7, _TNL_ATTRIB_TEX0 = 8, _TNL_ATTRIB_TEX1 = 9, _TNL_ATTRIB_TEX2 = 10, @@ -112,6 +94,34 @@ enum { _TNL_ATTRIB_TEX5 = 13, _TNL_ATTRIB_TEX6 = 14, _TNL_ATTRIB_TEX7 = 15, + + _TNL_ATTRIB_GENERIC0 = 16, /* doesn't really exist! */ + _TNL_ATTRIB_GENERIC1 = 17, + _TNL_ATTRIB_GENERIC2 = 18, + _TNL_ATTRIB_GENERIC3 = 19, + _TNL_ATTRIB_GENERIC4 = 20, + _TNL_ATTRIB_GENERIC5 = 21, + _TNL_ATTRIB_GENERIC6 = 22, + _TNL_ATTRIB_GENERIC7 = 23, + _TNL_ATTRIB_GENERIC8 = 24, + _TNL_ATTRIB_GENERIC9 = 25, + _TNL_ATTRIB_GENERIC10 = 26, + _TNL_ATTRIB_GENERIC11 = 27, + _TNL_ATTRIB_GENERIC12 = 28, + _TNL_ATTRIB_GENERIC13 = 29, + _TNL_ATTRIB_GENERIC14 = 30, + _TNL_ATTRIB_GENERIC15 = 31, + + /* These alias with the generics, but they are not active + * concurrently, so it's not a problem. The TNL module + * doesn't have to do anything about this as this is how they + * are passed into the _draw_prims callback. + * + * When we generate fixed-function replacement programs (in + * t_vp_build.c currently), they refer to the appropriate + * generic attribute in order to pick up per-vertex material + * data. + */ _TNL_ATTRIB_MAT_FRONT_AMBIENT = 16, _TNL_ATTRIB_MAT_BACK_AMBIENT = 17, _TNL_ATTRIB_MAT_FRONT_DIFFUSE = 18, @@ -123,292 +133,58 @@ enum { _TNL_ATTRIB_MAT_FRONT_SHININESS = 24, _TNL_ATTRIB_MAT_BACK_SHININESS = 25, _TNL_ATTRIB_MAT_FRONT_INDEXES = 26, - _TNL_ATTRIB_MAT_BACK_INDEXES = 27, - _TNL_ATTRIB_INDEX = 28, - _TNL_ATTRIB_EDGEFLAG = 29, - _TNL_ATTRIB_POINTSIZE = 30, - _TNL_ATTRIB_MAX = 31 -} ; - -/* Will probably have to revise this scheme fairly shortly, eg. by - * compacting all the MAT flags down to one bit, or by using two - * dwords to store the flags. - */ -#define _TNL_BIT_POS (1<<0) -#define _TNL_BIT_WEIGHT (1<<1) -#define _TNL_BIT_NORMAL (1<<2) -#define _TNL_BIT_COLOR0 (1<<3) -#define _TNL_BIT_COLOR1 (1<<4) -#define _TNL_BIT_FOG (1<<5) -#define _TNL_BIT_SIX (1<<6) -#define _TNL_BIT_SEVEN (1<<7) -#define _TNL_BIT_TEX0 (1<<8) -#define _TNL_BIT_TEX1 (1<<9) -#define _TNL_BIT_TEX2 (1<<10) -#define _TNL_BIT_TEX3 (1<<11) -#define _TNL_BIT_TEX4 (1<<12) -#define _TNL_BIT_TEX5 (1<<13) -#define _TNL_BIT_TEX6 (1<<14) -#define _TNL_BIT_TEX7 (1<<15) -#define _TNL_BIT_MAT_FRONT_AMBIENT (1<<16) -#define _TNL_BIT_MAT_BACK_AMBIENT (1<<17) -#define _TNL_BIT_MAT_FRONT_DIFFUSE (1<<18) -#define _TNL_BIT_MAT_BACK_DIFFUSE (1<<19) -#define _TNL_BIT_MAT_FRONT_SPECULAR (1<<20) -#define _TNL_BIT_MAT_BACK_SPECULAR (1<<21) -#define _TNL_BIT_MAT_FRONT_EMISSION (1<<22) -#define _TNL_BIT_MAT_BACK_EMISSION (1<<23) -#define _TNL_BIT_MAT_FRONT_SHININESS (1<<24) -#define _TNL_BIT_MAT_BACK_SHININESS (1<<25) -#define _TNL_BIT_MAT_FRONT_INDEXES (1<<26) -#define _TNL_BIT_MAT_BACK_INDEXES (1<<27) -#define _TNL_BIT_INDEX (1<<28) -#define _TNL_BIT_EDGEFLAG (1<<29) -#define _TNL_BIT_POINTSIZE (1<<30) - -#define _TNL_BIT_TEX(u) (1 << (_TNL_ATTRIB_TEX0 + (u))) - - - -#define _TNL_BITS_MAT_ANY (_TNL_BIT_MAT_FRONT_AMBIENT | \ - _TNL_BIT_MAT_BACK_AMBIENT | \ - _TNL_BIT_MAT_FRONT_DIFFUSE | \ - _TNL_BIT_MAT_BACK_DIFFUSE | \ - _TNL_BIT_MAT_FRONT_SPECULAR | \ - _TNL_BIT_MAT_BACK_SPECULAR | \ - _TNL_BIT_MAT_FRONT_EMISSION | \ - _TNL_BIT_MAT_BACK_EMISSION | \ - _TNL_BIT_MAT_FRONT_SHININESS | \ - _TNL_BIT_MAT_BACK_SHININESS | \ - _TNL_BIT_MAT_FRONT_INDEXES | \ - _TNL_BIT_MAT_BACK_INDEXES) - - -#define _TNL_BITS_TEX_ANY (_TNL_BIT_TEX0 | \ - _TNL_BIT_TEX1 | \ - _TNL_BIT_TEX2 | \ - _TNL_BIT_TEX3 | \ - _TNL_BIT_TEX4 | \ - _TNL_BIT_TEX5 | \ - _TNL_BIT_TEX6 | \ - _TNL_BIT_TEX7) - - -#define _TNL_BITS_PROG_ANY (_TNL_BIT_POS | \ - _TNL_BIT_WEIGHT | \ - _TNL_BIT_NORMAL | \ - _TNL_BIT_COLOR0 | \ - _TNL_BIT_COLOR1 | \ - _TNL_BIT_FOG | \ - _TNL_BIT_SIX | \ - _TNL_BIT_SEVEN | \ - _TNL_BITS_TEX_ANY) - - - -#define PRIM_BEGIN 0x10 -#define PRIM_END 0x20 -#define PRIM_WEAK 0x40 -#define PRIM_MODE_MASK 0x0f - -/* - */ -struct tnl_prim { - GLuint mode; - GLuint start; - GLuint count; -}; - - - -struct tnl_eval1_map { - struct gl_1d_map *map; - GLuint sz; -}; - -struct tnl_eval2_map { - struct gl_2d_map *map; - GLuint sz; -}; - -struct tnl_eval { - GLuint new_state; - struct tnl_eval1_map map1[_TNL_ATTRIB_INDEX + 1]; - struct tnl_eval2_map map2[_TNL_ATTRIB_INDEX + 1]; -}; - - -#define TNL_MAX_PRIM 16 -#define TNL_MAX_COPIED_VERTS 3 + _TNL_ATTRIB_MAT_BACK_INDEXES = 27, -struct tnl_copied_vtx { - GLfloat buffer[_TNL_ATTRIB_MAX * 4 * TNL_MAX_COPIED_VERTS]; - GLuint nr; -}; - -#define VERT_BUFFER_SIZE 2048 /* 8kbytes */ - - -typedef void (*attrfv_func)( const GLfloat * ); - -struct dynfn { - struct dynfn *next, *prev; - int key; - char *code; -}; - -struct dynfn_lists { - struct dynfn Vertex[4]; - struct dynfn Attribute[4]; -}; - -struct dynfn_generators { - struct dynfn *(*Vertex[4])( GLcontext *ctx, int key ); - struct dynfn *(*Attribute[4])( GLcontext *ctx, int key ); -}; - -#define _TNL_MAX_ATTR_CODEGEN 16 - - -/* The assembly of vertices in immediate mode is separated from - * display list compilation. This allows a simpler immediate mode - * treatment and a display list compiler better suited to - * hardware-acceleration. - */ -struct tnl_vtx { - GLfloat buffer[VERT_BUFFER_SIZE]; - GLubyte attrsz[_TNL_ATTRIB_MAX]; - GLuint vertex_size; - struct tnl_prim prim[TNL_MAX_PRIM]; - GLuint prim_count; - GLfloat *vbptr; /* cursor, points into buffer */ - GLfloat vertex[_TNL_ATTRIB_MAX*4]; /* current vertex */ - GLfloat *attrptr[_TNL_ATTRIB_MAX]; /* points into vertex */ - GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->Current, etc */ - GLuint counter, initial_counter; - struct tnl_copied_vtx copied; - - attrfv_func tabfv[_TNL_MAX_ATTR_CODEGEN+1][4]; /* plus 1 for ERROR_ATTRIB */ - - struct dynfn_lists cache; - struct dynfn_generators gen; - - struct tnl_eval eval; - GLboolean *edgeflag_tmp; - GLboolean have_materials; -}; + /* This is really a VERT_RESULT, not an attrib. Need to fix + * tnl to understand the difference. + */ + _TNL_ATTRIB_POINTSIZE = 16, + _TNL_ATTRIB_MAX = 32 +} ; +#define _TNL_ATTRIB_TEX(u) (_TNL_ATTRIB_TEX0 + (u)) +#define _TNL_ATTRIB_GENERIC(n) (_TNL_ATTRIB_GENERIC0 + (n)) +/* special index used for handing invalid glVertexAttribute() indices */ +#define _TNL_ATTRIB_ERROR (_TNL_ATTRIB_GENERIC15 + 1) -/* For display lists, this structure holds a run of vertices of the - * same format, and a strictly well-formed set of begin/end pairs, - * starting on the first vertex and ending at the last. Vertex - * copying on buffer breaks is precomputed according to these - * primitives, though there are situations where the copying will need - * correction at execute-time, perhaps by replaying the list as - * immediate mode commands. - * - * On executing this list, the 'current' values may be updated with - * the values of the final vertex, and often no fixup of the start of - * the vertex list is required. - * - * Eval and other commands that don't fit into these vertex lists are - * compiled using the fallback opcode mechanism provided by dlist.c. +/** + * Handy attribute ranges: */ -struct tnl_vertex_list { - GLubyte attrsz[_TNL_ATTRIB_MAX]; - GLuint vertex_size; +#define _TNL_FIRST_PROG _TNL_ATTRIB_WEIGHT +#define _TNL_LAST_PROG _TNL_ATTRIB_TEX7 - GLfloat *buffer; - GLuint count; - GLuint wrap_count; /* number of copied vertices at start */ - GLboolean have_materials; /* bit of a hack - quick check for materials */ - GLboolean dangling_attr_ref; /* current attr implicitly referenced - outside the list */ +#define _TNL_FIRST_TEX _TNL_ATTRIB_TEX0 +#define _TNL_LAST_TEX _TNL_ATTRIB_TEX7 - GLfloat *normal_lengths; - struct tnl_prim *prim; - GLuint prim_count; +#define _TNL_FIRST_GENERIC _TNL_ATTRIB_GENERIC0 +#define _TNL_LAST_GENERIC _TNL_ATTRIB_GENERIC15 - struct tnl_vertex_store *vertex_store; - struct tnl_primitive_store *prim_store; -}; +#define _TNL_FIRST_MAT _TNL_ATTRIB_MAT_FRONT_AMBIENT /* GENERIC0 */ +#define _TNL_LAST_MAT _TNL_ATTRIB_MAT_BACK_INDEXES /* GENERIC11 */ -/* These buffers should be a reasonable size to support upload to - * hardware? Maybe drivers should stitch them back together, or - * specify a desired size? - */ -#define SAVE_BUFFER_SIZE (16*1024) -#define SAVE_PRIM_SIZE 128 +/* Number of available generic attributes */ +#define _TNL_NUM_GENERIC 16 -/* Storage to be shared among several vertex_lists. - */ -struct tnl_vertex_store { - GLfloat buffer[SAVE_BUFFER_SIZE]; - GLuint used; - GLuint refcount; -}; - -struct tnl_primitive_store { - struct tnl_prim buffer[SAVE_PRIM_SIZE]; - GLuint used; - GLuint refcount; -}; - - -struct tnl_save { - GLubyte attrsz[_TNL_ATTRIB_MAX]; - GLuint vertex_size; +/* Number of attributes used for evaluators */ +#define _TNL_NUM_EVAL 16 - GLfloat *buffer; - GLuint count; - GLuint wrap_count; - struct tnl_prim *prim; - GLuint prim_count, prim_max; - - struct tnl_vertex_store *vertex_store; - struct tnl_primitive_store *prim_store; - - GLfloat *vbptr; /* cursor, points into buffer */ - GLfloat vertex[_TNL_ATTRIB_MAX*4]; /* current values */ - GLfloat *attrptr[_TNL_ATTRIB_MAX]; - GLuint counter, initial_counter; - GLboolean dangling_attr_ref; - GLboolean have_materials; - - GLuint opcode_vertex_list; - - struct tnl_copied_vtx copied; - - GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->ListState */ - GLubyte *currentsz[_TNL_ATTRIB_MAX]; +#define PRIM_BEGIN 0x10 +#define PRIM_END 0x20 +#define PRIM_MODE_MASK 0x0f - void (*tabfv[_TNL_ATTRIB_MAX][4])( const GLfloat * ); -}; +static INLINE GLuint _tnl_translate_prim( const struct _mesa_prim *prim ) +{ + GLuint flag; + flag = prim->mode; + if (prim->begin) flag |= PRIM_BEGIN; + if (prim->end) flag |= PRIM_END; + return flag; +} -struct tnl_vertex_arrays -{ - /* Conventional vertex attribute arrays */ - GLvector4f Obj; - GLvector4f Normal; - GLvector4f Color; - GLvector4f SecondaryColor; - GLvector4f FogCoord; - GLvector4f TexCoord[MAX_TEXTURE_COORD_UNITS]; - GLvector4f Index; - - GLubyte *EdgeFlag; - GLuint *Elt; - - /* These attributes don't alias with the conventional attributes. - * The GL_NV_vertex_program extension defines 16 extra sets of vertex - * arrays which have precedent over the conventional arrays when enabled. - */ - GLvector4f Attribs[_TNL_ATTRIB_MAX]; -}; /** @@ -416,22 +192,24 @@ struct tnl_vertex_arrays */ struct vertex_buffer { - /* Constant over life of the vertex_buffer. - */ - GLuint Size; + GLuint Size; /**< Max vertices per vertex buffer, constant */ /* Constant over the pipeline. */ - GLuint Count; /* for everything except Elts */ + GLuint Count; /**< Number of vertices currently in buffer */ /* Pointers to current data. + * XXX some of these fields alias AttribPtr below and should be removed + * such as NormalPtr, TexCoordPtr, FogCoordPtr, etc. */ GLuint *Elts; GLvector4f *ObjPtr; /* _TNL_BIT_POS */ GLvector4f *EyePtr; /* _TNL_BIT_POS */ GLvector4f *ClipPtr; /* _TNL_BIT_POS */ GLvector4f *NdcPtr; /* _TNL_BIT_POS */ + GLfloat *ClipDistancePtr[MAX_CLIP_PLANES]; /* _TNL_BIT_POS */ GLubyte ClipOrMask; /* _TNL_BIT_POS */ + GLubyte ClipAndMask; /* _TNL_BIT_POS */ GLubyte *ClipMask; /* _TNL_BIT_POS */ GLvector4f *NormalPtr; /* _TNL_BIT_NORMAL */ GLfloat *NormalLengthPtr; /* _TNL_BIT_NORMAL */ @@ -440,64 +218,39 @@ struct vertex_buffer GLvector4f *IndexPtr[2]; /* _TNL_BIT_INDEX */ GLvector4f *ColorPtr[2]; /* _TNL_BIT_COLOR0 */ GLvector4f *SecondaryColorPtr[2]; /* _TNL_BIT_COLOR1 */ - GLvector4f *PointSizePtr; /* _TNL_BIT_POS */ GLvector4f *FogCoordPtr; /* _TNL_BIT_FOG */ - struct tnl_prim *Primitive; + const struct _mesa_prim *Primitive; GLuint PrimitiveCount; /* Inputs to the vertex program stage */ GLvector4f *AttribPtr[_TNL_ATTRIB_MAX]; /* GL_NV_vertex_program */ - - GLuint LastClipped; - /* Private data from _tnl_render_stage that has no business being - * in this struct. - */ }; -/** Describes an individual operation on the pipeline. +/** + * Describes an individual operation on the pipeline. */ struct tnl_pipeline_stage { const char *name; - GLuint check_state; /* All state referenced in check() -- - * When is the pipeline_stage struct - * itself invalidated? Must be - * constant. - */ - - /* Usually constant or set by the 'check' callback: - */ - GLuint run_state; /* All state referenced in run() -- - * When is the cached output of the - * stage invalidated? - */ - - GLboolean active; /* True if runnable in current state */ - GLuint inputs; /* VERT_* inputs to the stage */ - GLuint outputs; /* VERT_* outputs of the stage */ - - /* Set in _tnl_run_pipeline(): - */ - GLuint changed_inputs; /* Generated value -- inputs to the - * stage that have changed since last - * call to 'run'. - */ - /* Private data for the pipeline stage: */ void *privatePtr; - /* Free private data. May not be null. + /* Allocate private data + */ + GLboolean (*create)( GLcontext *ctx, struct tnl_pipeline_stage * ); + + /* Free private data. */ void (*destroy)( struct tnl_pipeline_stage * ); - /* Called from _tnl_validate_pipeline(). Must update all fields in - * the pipeline_stage struct for the current state. + /* Called on any statechange or input array size change or + * input array change to/from zero stride. */ - void (*check)( GLcontext *ctx, struct tnl_pipeline_stage * ); + void (*validate)( GLcontext *ctx, struct tnl_pipeline_stage * ); /* Called from _tnl_run_pipeline(). The stage.changed_inputs value * encodes all inputs to thee struct which have changed. If @@ -510,26 +263,36 @@ struct tnl_pipeline_stage GLboolean (*run)( GLcontext *ctx, struct tnl_pipeline_stage * ); }; + + /** Contains the array of all pipeline stages. - * The default values are defined at the end of t_pipeline.c */ + * The default values are defined at the end of t_pipeline.c + */ struct tnl_pipeline { - GLuint build_state_trigger; /**< state changes which require build */ - GLuint build_state_changes; /**< state changes since last build */ - GLuint run_state_changes; /**< state changes since last run */ - GLuint run_input_changes; /**< VERT_* changes since last run */ - GLuint inputs; /**< VERT_* inputs to pipeline */ - /** This array has to end with a NULL-pointer. */ + + GLuint last_attrib_stride[_TNL_ATTRIB_MAX]; + GLuint last_attrib_size[_TNL_ATTRIB_MAX]; + GLuint input_changes; + GLuint new_state; + struct tnl_pipeline_stage stages[MAX_PIPELINE_STAGES+1]; GLuint nr_stages; }; +struct tnl_clipspace; struct tnl_clipspace_attr; -typedef void (*extract_func)( const struct tnl_clipspace_attr *a, GLfloat *out, - const GLubyte *v ); +typedef void (*tnl_extract_func)( const struct tnl_clipspace_attr *a, + GLfloat *out, + const GLubyte *v ); + +typedef void (*tnl_insert_func)( const struct tnl_clipspace_attr *a, + GLubyte *v, + const GLfloat *in ); -typedef void (*insert_func)( const struct tnl_clipspace_attr *a, GLubyte *v, - const GLfloat *in ); +typedef void (*tnl_emit_func)( GLcontext *ctx, + GLuint count, + GLubyte *dest ); /** @@ -539,34 +302,55 @@ typedef void (*insert_func)( const struct tnl_clipspace_attr *a, GLubyte *v, struct tnl_clipspace_attr { GLuint attrib; /* which vertex attrib (0=position, etc) */ + GLuint format; GLuint vertoffset; /* position of the attrib in the vertex struct */ GLuint vertattrsize; /* size of the attribute in bytes */ GLubyte *inputptr; GLuint inputstride; - insert_func *insert; - insert_func emit; - extract_func extract; + GLuint inputsize; + const tnl_insert_func *insert; + tnl_insert_func emit; + tnl_extract_func extract; const GLfloat *vp; /* NDC->Viewport mapping matrix */ }; -typedef void (*points_func)( GLcontext *ctx, GLuint first, GLuint last ); -typedef void (*line_func)( GLcontext *ctx, GLuint v1, GLuint v2 ); -typedef void (*triangle_func)( GLcontext *ctx, - GLuint v1, GLuint v2, GLuint v3 ); -typedef void (*quad_func)( GLcontext *ctx, GLuint v1, GLuint v2, - GLuint v3, GLuint v4 ); -typedef void (*render_func)( GLcontext *ctx, GLuint start, GLuint count, - GLuint flags ); -typedef void (*interp_func)( GLcontext *ctx, - GLfloat t, GLuint dst, GLuint out, GLuint in, - GLboolean force_boundary ); -typedef void (*copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src ); -typedef void (*setup_func)( GLcontext *ctx, - GLuint start, GLuint end, - GLuint new_inputs); +typedef void (*tnl_points_func)( GLcontext *ctx, GLuint first, GLuint last ); +typedef void (*tnl_line_func)( GLcontext *ctx, GLuint v1, GLuint v2 ); +typedef void (*tnl_triangle_func)( GLcontext *ctx, + GLuint v1, GLuint v2, GLuint v3 ); +typedef void (*tnl_quad_func)( GLcontext *ctx, GLuint v1, GLuint v2, + GLuint v3, GLuint v4 ); +typedef void (*tnl_render_func)( GLcontext *ctx, GLuint start, GLuint count, + GLuint flags ); +typedef void (*tnl_interp_func)( GLcontext *ctx, + GLfloat t, GLuint dst, GLuint out, GLuint in, + GLboolean force_boundary ); +typedef void (*tnl_copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src ); +typedef void (*tnl_setup_func)( GLcontext *ctx, + GLuint start, GLuint end, + GLuint new_inputs); + + +struct tnl_attr_type { + GLuint format; + GLuint size; + GLuint stride; + GLuint offset; +}; + +struct tnl_clipspace_fastpath { + GLuint vertex_size; + GLuint attr_count; + GLboolean match_strides; + + struct tnl_attr_type *attr; + + tnl_emit_func func; + struct tnl_clipspace_fastpath *next; +}; /** * Used to describe conversion of vertex arrays to vertex structures. @@ -585,9 +369,21 @@ struct tnl_clipspace struct tnl_clipspace_attr attr[_TNL_ATTRIB_MAX]; GLuint attr_count; - void (*emit)( GLcontext *ctx, GLuint start, GLuint end, void *dest ); - interp_func interp; - copy_pv_func copy_pv; + tnl_emit_func emit; + tnl_interp_func interp; + tnl_copy_pv_func copy_pv; + + /* Parameters and constants for codegen: + */ + GLboolean need_viewport; + GLfloat vp_scale[4]; + GLfloat vp_xlate[4]; + GLfloat chan_scale[4]; + GLfloat identity[4]; + + struct tnl_clipspace_fastpath *fastpath; + + void (*codegen_emit)( GLcontext *ctx ); }; @@ -607,10 +403,9 @@ struct tnl_device_driver /* Alert tnl-aware drivers of changes to material. */ - GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p); - /* Allow drivers to hook in optimized begin/end engines. - * Return value: GL_TRUE - driver handled the begin - * GL_FALSE - driver didn't handle the begin + void (*NotifyInputChanges)(GLcontext *ctx, GLuint bitmask); + /* Alert tnl-aware drivers of changes to size and stride of input + * arrays. */ /*** @@ -631,14 +426,14 @@ struct tnl_device_driver * modes accepted by glBegin(). */ - interp_func Interp; + tnl_interp_func Interp; /* The interp function is called by the clipping routines when we need * to generate an interpolated vertex. All pertinant vertex ancilliary * data should be computed by interpolating between the 'in' and 'out' * vertices. */ - copy_pv_func CopyPV; + tnl_copy_pv_func CopyPV; /* The copy function is used to make a copy of a vertex. All pertinant * vertex attributes should be copied. */ @@ -651,16 +446,16 @@ struct tnl_device_driver void (*ClippedLine)( GLcontext *ctx, GLuint v0, GLuint v1 ); /* Render a line between the two vertices given by indexes v0 and v1. */ - points_func Points; /* must now respect vb->elts */ - line_func Line; - triangle_func Triangle; - quad_func Quad; + tnl_points_func Points; /* must now respect vb->elts */ + tnl_line_func Line; + tnl_triangle_func Triangle; + tnl_quad_func Quad; /* These functions are called in order to render points, lines, * triangles and quads. These are only called via the T&L module. */ - render_func *PrimTabVerts; - render_func *PrimTabElts; + tnl_render_func *PrimTabVerts; + tnl_render_func *PrimTabElts; /* Render whole unclipped primitives (points, lines, linestrips, * lineloops, etc). The tables are indexed by the GL enum of the * primitive to be rendered. RenderTabVerts is used for non-indexed @@ -672,7 +467,7 @@ struct tnl_device_driver /* Reset the hardware's line stipple counter. */ - setup_func BuildVertices; + tnl_setup_func BuildVertices; /* This function is called whenever new vertices are required for * rendering. The vertices in question are those n such that start * <= n < end. The new_inputs parameter indicates those fields of @@ -694,7 +489,20 @@ struct tnl_device_driver */ } Render; }; - + + +#define DECLARE_RENDERINPUTS(name) BITSET64_DECLARE(name, _TNL_ATTRIB_MAX) +#define RENDERINPUTS_COPY BITSET64_COPY +#define RENDERINPUTS_EQUAL BITSET64_EQUAL +#define RENDERINPUTS_ZERO BITSET64_ZERO +#define RENDERINPUTS_ONES BITSET64_ONES +#define RENDERINPUTS_TEST BITSET64_TEST +#define RENDERINPUTS_SET BITSET64_SET +#define RENDERINPUTS_CLEAR BITSET64_CLEAR +#define RENDERINPUTS_TEST_RANGE BITSET64_TEST_RANGE +#define RENDERINPUTS_SET_RANGE BITSET64_SET_RANGE +#define RENDERINPUTS_CLEAR_RANGE BITSET64_CLEAR_RANGE + /** * Context state for T&L context. @@ -705,26 +513,11 @@ typedef struct */ struct tnl_device_driver Driver; - /* Execute: - */ - struct tnl_vtx vtx; - - /* Compile: - */ - struct tnl_save save; - /* Pipeline */ struct tnl_pipeline pipeline; struct vertex_buffer vb; - /* GLvectors for binding to vb: - */ - struct tnl_vertex_arrays vtx_inputs; - struct tnl_vertex_arrays save_inputs; - struct tnl_vertex_arrays current; - struct tnl_vertex_arrays array_inputs; - /* Clipspace/ndc/window vertex managment: */ struct tnl_clipspace clipspace; @@ -732,35 +525,32 @@ typedef struct /* Probably need a better configuration mechanism: */ GLboolean NeedNdcCoords; - GLboolean LoopbackDListCassettes; - GLboolean CalcDListNormalLengths; - GLboolean IsolateMaterials; GLboolean AllowVertexFog; GLboolean AllowPixelFog; - GLboolean AllowCodegen; - GLboolean _DoVertexFog; /* eval fog function at each vertex? */ - GLuint render_inputs; + DECLARE_RENDERINPUTS(render_inputs_bitset); - GLvertexformat exec_vtxfmt; - GLvertexformat save_vtxfmt; + GLvector4f tmp_inputs[VERT_ATTRIB_MAX]; + + /* Temp storage for t_draw.c: + */ + GLubyte *block[VERT_ATTRIB_MAX]; + GLuint nr_blocks; } TNLcontext; -#define TNL_CONTEXT(ctx) ((TNLcontext *)(ctx->swtnl_context)) +#define TNL_CONTEXT(ctx) ((TNLcontext *)((ctx)->swtnl_context)) #define TYPE_IDX(t) ((t) & 0xf) #define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1 /* 0xa + 1 */ -extern void _tnl_MakeCurrent( GLcontext *ctx, - GLframebuffer *drawBuffer, - GLframebuffer *readBuffer ); - +extern void +tnl_clip_prepare(GLcontext *ctx); #endif