summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/i965/brw_exec_api.c
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2006-09-06 18:30:00 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2006-09-06 18:30:00 +0000
commit14ec34d64733478b773190cb62be37b7b2871a7f (patch)
tree3935796705a0f28df41cf5fe9d79284448235bb9 /src/mesa/drivers/dri/i965/brw_exec_api.c
parent2216aac8ea2ab90cdf71658379f88f30131426c5 (diff)
Simplify the immediate and displaylist code. Treat VertexAttrib*ARB
as non-aliasing and cope with the >32 attributes that result, taking materials into account.
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_exec_api.c')
-rw-r--r--src/mesa/drivers/dri/i965/brw_exec_api.c401
1 files changed, 120 insertions, 281 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_exec_api.c b/src/mesa/drivers/dri/i965/brw_exec_api.c
index d42720286c..ca012dbcd8 100644
--- a/src/mesa/drivers/dri/i965/brw_exec_api.c
+++ b/src/mesa/drivers/dri/i965/brw_exec_api.c
@@ -45,9 +45,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
static void reset_attrfv( struct brw_exec_context *exec );
-static brw_attrfv_func choose[BRW_MAX_ATTR_CODEGEN+1][4]; /* +1 for ERROR_ATTRIB */
-static brw_attrfv_func generic_attr_func[BRW_MAX_ATTR_CODEGEN][4];
-
/* Close off the last primitive, execute the buffer, restart the
* primitive.
@@ -135,7 +132,7 @@ static void brw_exec_copy_to_current( struct brw_exec_context *exec )
GLcontext *ctx = exec->ctx;
GLuint i;
- for (i = BRW_ATTRIB_POS+1 ; i < BRW_ATTRIB_INDEX ; i++) {
+ for (i = BRW_ATTRIB_POS+1 ; i < BRW_ATTRIB_MAX ; i++) {
if (exec->vtx.attrsz[i]) {
/* Note: the exec->vtx.current[i] pointers point into the
* ctx->Current.Attrib and ctx->Light.Material.Attrib arrays.
@@ -166,15 +163,13 @@ static void brw_exec_copy_to_current( struct brw_exec_context *exec )
ctx->Current.EdgeFlag = (exec->vtx.CurrentFloatEdgeFlag == 1.0);
}
-#if 1
/* Colormaterial -- this kindof sucks.
*/
if (ctx->Light.ColorMaterialEnabled &&
- exec->vtx.attrsz[VERT_ATTRIB_COLOR0]) {
+ exec->vtx.attrsz[BRW_ATTRIB_COLOR0]) {
_mesa_update_color_material(ctx,
- ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
+ ctx->Current.Attrib[BRW_ATTRIB_COLOR0]);
}
-#endif
ctx->Driver.NeedFlush &= ~FLUSH_UPDATE_CURRENT;
}
@@ -304,35 +299,24 @@ static void brw_exec_wrap_upgrade_vertex( struct brw_exec_context *exec,
exec->vtx.vert_count += exec->vtx.copied.nr;
exec->vtx.copied.nr = 0;
}
-
- /* For codegen - attrptr's may have changed, so need to redo
- * codegen. Might be a reasonable place to try & detect attributes
- * in the vertex which aren't being submitted any more.
- */
- for (i = 0 ; i < BRW_ATTRIB_MAX ; i++)
- if (exec->vtx.attrsz[i]) {
- GLuint j = exec->vtx.attrsz[i] - 1;
-
- if (i < BRW_MAX_ATTR_CODEGEN)
- exec->vtx.tabfv[i][j] = choose[i][j];
- }
-
}
-static void brw_exec_fixup_vertex( struct brw_exec_context *exec,
+static void brw_exec_fixup_vertex( GLcontext *ctx,
GLuint attr, GLuint sz )
{
- static const GLfloat id[4] = { 0, 0, 0, 1 };
+ struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec;
int i;
- if (exec->vtx.attrsz[attr] < sz) {
+ if (sz > exec->vtx.attrsz[attr]) {
/* New size is larger. Need to flush existing vertices and get
* an enlarged vertex format.
*/
brw_exec_wrap_upgrade_vertex( exec, attr, sz );
}
- else if (exec->vtx.attrsz[attr] > sz) {
+ else if (sz < exec->vtx.active_sz[attr]) {
+ static const GLfloat id[4] = { 0, 0, 0, 1 };
+
/* New size is smaller - just need to fill in some
* zeros. Don't need to flush or wrap.
*/
@@ -340,6 +324,8 @@ static void brw_exec_fixup_vertex( struct brw_exec_context *exec,
exec->vtx.attrptr[attr][i-1] = id[i-1];
}
+ exec->vtx.active_sz[attr] = sz;
+
/* Does setting NeedFlush belong here? Necessitates resetting
* vtxfmt on each flush (otherwise flags won't get reset
* afterwards).
@@ -351,230 +337,48 @@ static void brw_exec_fixup_vertex( struct brw_exec_context *exec,
}
-/* Helper function for 'CHOOSE' macro. Do what's necessary when an
- * entrypoint is called for the first time.
- */
-
-static brw_attrfv_func do_choose( GLuint attr, GLuint sz )
-{
- GET_CURRENT_CONTEXT( ctx );
- struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec;
- GLuint oldsz = exec->vtx.attrsz[attr];
-
- assert(attr < BRW_MAX_ATTR_CODEGEN);
-
- if (oldsz != sz) {
- /* Reset any active pointers for this attribute
- */
- if (oldsz)
- exec->vtx.tabfv[attr][oldsz-1] = choose[attr][oldsz-1];
-
- brw_exec_fixup_vertex( exec, attr, sz );
-
- }
-
- /* Codegen?
- */
-
- /* Else use generic version:
- */
- exec->vtx.tabfv[attr][sz-1] = generic_attr_func[attr][sz-1];
-
- return exec->vtx.tabfv[attr][sz-1];
-}
-
-#define CHOOSE( ATTR, N ) \
-static void choose_##ATTR##_##N( const GLfloat *v ) \
-{ \
- brw_attrfv_func f = do_choose(ATTR, N); \
- f( v ); \
-}
-
-#define CHOOSERS( ATTRIB ) \
- CHOOSE( ATTRIB, 1 ) \
- CHOOSE( ATTRIB, 2 ) \
- CHOOSE( ATTRIB, 3 ) \
- CHOOSE( ATTRIB, 4 ) \
-
-
-#define INIT_CHOOSERS(ATTR) \
- choose[ATTR][0] = choose_##ATTR##_1; \
- choose[ATTR][1] = choose_##ATTR##_2; \
- choose[ATTR][2] = choose_##ATTR##_3; \
- choose[ATTR][3] = choose_##ATTR##_4;
-
-CHOOSERS( 0 )
-CHOOSERS( 1 )
-CHOOSERS( 2 )
-CHOOSERS( 3 )
-CHOOSERS( 4 )
-CHOOSERS( 5 )
-CHOOSERS( 6 )
-CHOOSERS( 7 )
-CHOOSERS( 8 )
-CHOOSERS( 9 )
-CHOOSERS( 10 )
-CHOOSERS( 11 )
-CHOOSERS( 12 )
-CHOOSERS( 13 )
-CHOOSERS( 14 )
-CHOOSERS( 15 )
-
-static void error_attrib( const GLfloat *unused )
-{
- GET_CURRENT_CONTEXT( ctx );
- (void) unused;
- _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttrib" );
-}
-
-
-
-static void reset_attrfv( struct brw_exec_context *exec )
-{
- GLuint i;
-
- for (i = 0 ; i < BRW_ATTRIB_MAX ; i++)
- if (exec->vtx.attrsz[i]) {
- GLint j = exec->vtx.attrsz[i] - 1;
- exec->vtx.attrsz[i] = 0;
-
- if (i < BRW_MAX_ATTR_CODEGEN) {
- while (j >= 0) {
- exec->vtx.tabfv[i][j] = choose[i][j];
- j--;
- }
- }
- }
-
- exec->vtx.vertex_size = 0;
-}
-
-
-
-/* Materials:
- *
- * These are treated as per-vertex attributes, at indices above where
- * the NV_vertex_program leaves off. There are a lot of good things
- * about treating materials this way.
- *
- * However: I don't want to double the number of generated functions
- * just to cope with this, so I unroll the 'C' varients of CHOOSE and
- * ATTRF into this function, and dispense with codegen and
- * second-level dispatch.
- *
- * There is no aliasing of material attributes with other entrypoints.
+/*
*/
-#define OTHER_ATTR( exec, A, N, params ) \
-do { \
- if (exec->vtx.attrsz[A] != N) { \
- brw_exec_fixup_vertex( exec, A, N ); \
- } \
- \
- { \
- GLfloat *dest = exec->vtx.attrptr[A]; \
- if (N>0) dest[0] = (params)[0]; \
- if (N>1) dest[1] = (params)[1]; \
- if (N>2) dest[2] = (params)[2]; \
- if (N>3) dest[3] = (params)[3]; \
- } \
-} while (0)
-
-
-#define MAT( exec, ATTR, N, face, params ) \
+#define ATTR( A, N, V0, V1, V2, V3 ) \
do { \
- if (face != GL_BACK) \
- OTHER_ATTR( exec, ATTR, N, params ); /* front */ \
- if (face != GL_FRONT) \
- OTHER_ATTR( exec, ATTR + 1, N, params ); /* back */ \
+ struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec; \
+ \
+ if (exec->vtx.active_sz[A] != N) \
+ brw_exec_fixup_vertex(ctx, A, N); \
+ \
+ { \
+ GLfloat *dest = exec->vtx.attrptr[A]; \
+ if (N>0) dest[0] = V0; \
+ if (N>1) dest[1] = V1; \
+ if (N>2) dest[2] = V2; \
+ if (N>3) dest[3] = V3; \
+ } \
+ \
+ if ((A) == 0) { \
+ GLuint i; \
+ \
+ for (i = 0; i < exec->vtx.vertex_size; i++) \
+ exec->vtx.vbptr[i] = exec->vtx.vertex[i]; \
+ \
+ exec->vtx.vbptr += exec->vtx.vertex_size; \
+ exec->ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; \
+ \
+ if (++exec->vtx.vert_count >= exec->vtx.max_vert) \
+ brw_exec_vtx_wrap( exec ); \
+ } \
} while (0)
-/* Colormaterial is dealt with later on.
- */
-static void GLAPIENTRY brw_exec_Materialfv( GLenum face, GLenum pname,
- const GLfloat *params )
-{
- GET_CURRENT_CONTEXT( ctx );
- struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec;
+#define ERROR() _mesa_error( ctx, GL_INVALID_ENUM, __FUNCTION__ )
+#define TAG(x) brw_##x
- switch (face) {
- case GL_FRONT:
- case GL_BACK:
- case GL_FRONT_AND_BACK:
- break;
-
- default:
- _mesa_error( ctx, GL_INVALID_ENUM, "glMaterialfv" );
- return;
- }
+#include "brw_attrib_tmp.h"
- switch (pname) {
- case GL_EMISSION:
- MAT( exec, BRW_ATTRIB_MAT_FRONT_EMISSION, 4, face, params );
- break;
- case GL_AMBIENT:
- MAT( exec, BRW_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params );
- break;
- case GL_DIFFUSE:
- MAT( exec, BRW_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params );
- break;
- case GL_SPECULAR:
- MAT( exec, BRW_ATTRIB_MAT_FRONT_SPECULAR, 4, face, params );
- break;
- case GL_SHININESS:
- MAT( exec, BRW_ATTRIB_MAT_FRONT_SHININESS, 1, face, params );
- break;
- case GL_COLOR_INDEXES:
- MAT( exec, BRW_ATTRIB_MAT_FRONT_INDEXES, 3, face, params );
- break;
- case GL_AMBIENT_AND_DIFFUSE:
- MAT( exec, BRW_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params );
- MAT( exec, BRW_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params );
- break;
- default:
- _mesa_error( ctx, GL_INVALID_ENUM, "glMaterialfv" );
- return;
- }
-}
-
-
-static void GLAPIENTRY brw_exec_EdgeFlag( GLboolean b )
-{
- GET_CURRENT_CONTEXT( ctx );
- struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec;
- GLfloat f = (GLfloat)b;
-
- OTHER_ATTR( exec, BRW_ATTRIB_EDGEFLAG, 1, &f );
-}
-
-#if 0
-static void GLAPIENTRY brw_exec_EdgeFlagv( const GLboolean *v )
-{
- GET_CURRENT_CONTEXT( ctx );
- struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec;
- GLfloat f = (GLfloat)v[0];
-
- OTHER_ATTR( exec, BRW_ATTRIB_EDGEFLAG, 1, &f );
-}
-#endif
-
-static void GLAPIENTRY brw_exec_Indexf( GLfloat f )
-{
- GET_CURRENT_CONTEXT( ctx );
- struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec;
- OTHER_ATTR( exec, BRW_ATTRIB_INDEX, 1, &f );
-}
-static void GLAPIENTRY brw_exec_Indexfv( const GLfloat *v )
-{
- GET_CURRENT_CONTEXT( ctx );
- struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec;
- OTHER_ATTR( exec, BRW_ATTRIB_INDEX, 1, v );
-}
/* Eval
*/
@@ -583,7 +387,6 @@ static void GLAPIENTRY brw_exec_EvalCoord1f( GLfloat u )
GET_CURRENT_CONTEXT( ctx );
struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec;
- /* TODO: use a CHOOSE() function for this: */
{
GLint i;
if (exec->eval.recalculate_maps)
@@ -592,7 +395,7 @@ static void GLAPIENTRY brw_exec_EvalCoord1f( GLfloat u )
for (i = 0 ; i <= BRW_ATTRIB_INDEX ; i++) {
if (exec->eval.map1[i].map)
if (exec->vtx.attrsz[i] != exec->eval.map1[i].sz)
- brw_exec_fixup_vertex( exec, i, exec->eval.map1[i].sz );
+ brw_exec_fixup_vertex( ctx, i, exec->eval.map1[i].sz );
}
}
@@ -611,7 +414,6 @@ static void GLAPIENTRY brw_exec_EvalCoord2f( GLfloat u, GLfloat v )
GET_CURRENT_CONTEXT( ctx );
struct brw_exec_context *exec = IMM_CONTEXT(ctx)->exec;
- /* TODO: use a CHOOSE() function for this: */
{
GLint i;
if (exec->eval.recalculate_maps)
@@ -619,13 +421,13 @@ static void GLAPIENTRY brw_exec_EvalCoord2f( GLfloat u, GLfloat v )
for (i = 0 ; i <= BRW_ATTRIB_INDEX ; i++) {
if (exec->eval.map2[i].map)
- if (exec->vtx.attrsz[i] != exec->eval.map2[i].sz)
- brw_exec_fixup_vertex( exec, i, exec->eval.map2[i].sz );
+ if (exec->vtx.active_sz[i] != exec->eval.map2[i].sz)
+ brw_exec_fixup_vertex( ctx, i, exec->eval.map2[i].sz );
}
if (ctx->Eval.AutoNormal)
- if (exec->vtx.attrsz[BRW_ATTRIB_NORMAL] != 3)
- brw_exec_fixup_vertex( exec, BRW_ATTRIB_NORMAL, 3 );
+ if (exec->vtx.active_sz[BRW_ATTRIB_NORMAL] != 3)
+ brw_exec_fixup_vertex( ctx, BRW_ATTRIB_NORMAL, 3 );
}
_mesa_memcpy( exec->vtx.copied.buffer, exec->vtx.vertex,
@@ -750,8 +552,6 @@ static void brw_exec_vtxfmt_init( struct brw_exec_context *exec )
vfmt->Begin = brw_exec_Begin;
vfmt->CallList = _mesa_CallList;
vfmt->CallLists = _mesa_CallLists;
- vfmt->EdgeFlag = brw_exec_EdgeFlag;
-/* vfmt->EdgeFlagv = brw_exec_EdgeFlagv; */
vfmt->End = brw_exec_End;
vfmt->EvalCoord1f = brw_exec_EvalCoord1f;
vfmt->EvalCoord1fv = brw_exec_EvalCoord1fv;
@@ -759,13 +559,71 @@ static void brw_exec_vtxfmt_init( struct brw_exec_context *exec )
vfmt->EvalCoord2fv = brw_exec_EvalCoord2fv;
vfmt->EvalPoint1 = brw_exec_EvalPoint1;
vfmt->EvalPoint2 = brw_exec_EvalPoint2;
- vfmt->Indexf = brw_exec_Indexf;
- vfmt->Indexfv = brw_exec_Indexfv;
- vfmt->Materialfv = brw_exec_Materialfv;
vfmt->Rectf = _mesa_noop_Rectf;
vfmt->EvalMesh1 = _mesa_noop_EvalMesh1;
vfmt->EvalMesh2 = _mesa_noop_EvalMesh2;
+
+
+ /* from attrib_tmp.h:
+ */
+ vfmt->Color3f = brw_Color3f;
+ vfmt->Color3fv = brw_Color3fv;
+ vfmt->Color4f = brw_Color4f;
+ vfmt->Color4fv = brw_Color4fv;
+ vfmt->FogCoordfEXT = brw_FogCoordfEXT;
+ vfmt->FogCoordfvEXT = brw_FogCoordfvEXT;
+ vfmt->MultiTexCoord1fARB = brw_MultiTexCoord1f;
+ vfmt->MultiTexCoord1fvARB = brw_MultiTexCoord1fv;
+ vfmt->MultiTexCoord2fARB = brw_MultiTexCoord2f;
+ vfmt->MultiTexCoord2fvARB = brw_MultiTexCoord2fv;
+ vfmt->MultiTexCoord3fARB = brw_MultiTexCoord3f;
+ vfmt->MultiTexCoord3fvARB = brw_MultiTexCoord3fv;
+ vfmt->MultiTexCoord4fARB = brw_MultiTexCoord4f;
+ vfmt->MultiTexCoord4fvARB = brw_MultiTexCoord4fv;
+ vfmt->Normal3f = brw_Normal3f;
+ vfmt->Normal3fv = brw_Normal3fv;
+ vfmt->SecondaryColor3fEXT = brw_SecondaryColor3fEXT;
+ vfmt->SecondaryColor3fvEXT = brw_SecondaryColor3fvEXT;
+ vfmt->TexCoord1f = brw_TexCoord1f;
+ vfmt->TexCoord1fv = brw_TexCoord1fv;
+ vfmt->TexCoord2f = brw_TexCoord2f;
+ vfmt->TexCoord2fv = brw_TexCoord2fv;
+ vfmt->TexCoord3f = brw_TexCoord3f;
+ vfmt->TexCoord3fv = brw_TexCoord3fv;
+ vfmt->TexCoord4f = brw_TexCoord4f;
+ vfmt->TexCoord4fv = brw_TexCoord4fv;
+ vfmt->Vertex2f = brw_Vertex2f;
+ vfmt->Vertex2fv = brw_Vertex2fv;
+ vfmt->Vertex3f = brw_Vertex3f;
+ vfmt->Vertex3fv = brw_Vertex3fv;
+ vfmt->Vertex4f = brw_Vertex4f;
+ vfmt->Vertex4fv = brw_Vertex4fv;
+
+ vfmt->VertexAttrib1fARB = brw_VertexAttrib1fARB;
+ vfmt->VertexAttrib1fvARB = brw_VertexAttrib1fvARB;
+ vfmt->VertexAttrib2fARB = brw_VertexAttrib2fARB;
+ vfmt->VertexAttrib2fvARB = brw_VertexAttrib2fvARB;
+ vfmt->VertexAttrib3fARB = brw_VertexAttrib3fARB;
+ vfmt->VertexAttrib3fvARB = brw_VertexAttrib3fvARB;
+ vfmt->VertexAttrib4fARB = brw_VertexAttrib4fARB;
+ vfmt->VertexAttrib4fvARB = brw_VertexAttrib4fvARB;
+
+ vfmt->VertexAttrib1fNV = brw_VertexAttrib1fNV;
+ vfmt->VertexAttrib1fvNV = brw_VertexAttrib1fvNV;
+ vfmt->VertexAttrib2fNV = brw_VertexAttrib2fNV;
+ vfmt->VertexAttrib2fvNV = brw_VertexAttrib2fvNV;
+ vfmt->VertexAttrib3fNV = brw_VertexAttrib3fNV;
+ vfmt->VertexAttrib3fvNV = brw_VertexAttrib3fvNV;
+ vfmt->VertexAttrib4fNV = brw_VertexAttrib4fNV;
+ vfmt->VertexAttrib4fvNV = brw_VertexAttrib4fvNV;
+
+ vfmt->Materialfv = brw_Materialfv;
+
+ vfmt->EdgeFlag = brw_EdgeFlag;
+ vfmt->Indexf = brw_Indexf;
+ vfmt->Indexfv = brw_Indexfv;
+
}
@@ -791,35 +649,6 @@ void brw_exec_vtx_init( struct brw_exec_context *exec )
{
GLcontext *ctx = exec->ctx;
GLuint i;
- static int firsttime = 1;
-
- if (firsttime) {
- firsttime = 0;
-
- INIT_CHOOSERS( 0 );
- INIT_CHOOSERS( 1 );
- INIT_CHOOSERS( 2 );
- INIT_CHOOSERS( 3 );
- INIT_CHOOSERS( 4 );
- INIT_CHOOSERS( 5 );
- INIT_CHOOSERS( 6 );
- INIT_CHOOSERS( 7 );
- INIT_CHOOSERS( 8 );
- INIT_CHOOSERS( 9 );
- INIT_CHOOSERS( 10 );
- INIT_CHOOSERS( 11 );
- INIT_CHOOSERS( 12 );
- INIT_CHOOSERS( 13 );
- INIT_CHOOSERS( 14 );
- INIT_CHOOSERS( 15 );
-
- choose[ERROR_ATTRIB][0] = error_attrib;
- choose[ERROR_ATTRIB][1] = error_attrib;
- choose[ERROR_ATTRIB][2] = error_attrib;
- choose[ERROR_ATTRIB][3] = error_attrib;
-
- brw_exec_generic_attr_table_init( generic_attr_func );
- }
/* Allocate a buffer object. Will just reuse this object
* continuously.
@@ -829,16 +658,14 @@ void brw_exec_vtx_init( struct brw_exec_context *exec )
brw_exec_current_init( exec );
brw_exec_vtxfmt_init( exec );
- brw_exec_vtx_generic_init( exec );
/* Hook our functions into the dispatch table.
*/
_mesa_install_exec_vtxfmt( exec->ctx, &exec->vtxfmt );
- memcpy( exec->vtx.tabfv, choose, sizeof(choose) );
-
for (i = 0 ; i < BRW_ATTRIB_MAX ; i++) {
exec->vtx.attrsz[i] = 0;
+ exec->vtx.active_sz[i] = 0;
exec->vtx.inputs[i] = &exec->vtx.arrays[i];
}
@@ -875,3 +702,15 @@ void brw_exec_FlushVertices( GLcontext *ctx, GLuint flags )
}
+static void reset_attrfv( struct brw_exec_context *exec )
+{
+ GLuint i;
+
+ for (i = 0 ; i < BRW_ATTRIB_MAX ; i++) {
+ exec->vtx.attrsz[i] = 0;
+ exec->vtx.active_sz[i] = 0;
+ }
+
+ exec->vtx.vertex_size = 0;
+}
+