mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 09:08:10 +02:00
Fix the worst problems with dangling edgeflag references in
display lists. These mainly arise from edgeflag being the only attribute no longer stored internally as a float and requiring various special case paths to accomodate it.
This commit is contained in:
parent
0d4af83f25
commit
df943a4041
3 changed files with 30 additions and 21 deletions
|
|
@ -282,6 +282,7 @@ struct tnl_vtx {
|
|||
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 */
|
||||
GLfloat CurrentFloatEdgeFlag;
|
||||
GLuint counter, initial_counter;
|
||||
struct tnl_copied_vtx copied;
|
||||
|
||||
|
|
@ -379,6 +380,8 @@ struct tnl_save {
|
|||
GLuint opcode_vertex_list;
|
||||
|
||||
struct tnl_copied_vtx copied;
|
||||
|
||||
GLfloat CurrentFloatEdgeFlag;
|
||||
|
||||
GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->ListState */
|
||||
GLubyte *currentsz[_TNL_ATTRIB_MAX];
|
||||
|
|
|
|||
|
|
@ -377,12 +377,16 @@ static void _save_copy_to_current( GLcontext *ctx )
|
|||
}
|
||||
}
|
||||
|
||||
/* Edgeflag requires special treatment:
|
||||
/* Edgeflag requires special treatment:
|
||||
*
|
||||
* TODO: change edgeflag to GLfloat in Mesa.
|
||||
*/
|
||||
if (tnl->save.attrsz[_TNL_ATTRIB_EDGEFLAG]) {
|
||||
ctx->ListState.ActiveEdgeFlag = 1;
|
||||
tnl->save.CurrentFloatEdgeFlag =
|
||||
tnl->save.attrptr[_TNL_ATTRIB_EDGEFLAG][0];
|
||||
ctx->ListState.CurrentEdgeFlag =
|
||||
(tnl->save.attrptr[_TNL_ATTRIB_EDGEFLAG][0] == 1.0);
|
||||
(tnl->save.CurrentFloatEdgeFlag == 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -403,9 +407,10 @@ static void _save_copy_from_current( GLcontext *ctx )
|
|||
|
||||
/* Edgeflag requires special treatment:
|
||||
*/
|
||||
if (tnl->save.attrsz[_TNL_ATTRIB_EDGEFLAG])
|
||||
tnl->save.attrptr[_TNL_ATTRIB_EDGEFLAG][0] =
|
||||
(GLfloat)ctx->ListState.CurrentEdgeFlag;
|
||||
if (tnl->save.attrsz[_TNL_ATTRIB_EDGEFLAG]) {
|
||||
tnl->save.CurrentFloatEdgeFlag = (GLfloat)ctx->ListState.CurrentEdgeFlag;
|
||||
tnl->save.attrptr[_TNL_ATTRIB_EDGEFLAG][0] = tnl->save.CurrentFloatEdgeFlag;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -480,8 +485,9 @@ static void _save_upgrade_vertex( GLcontext *ctx,
|
|||
if (tnl->save.currentsz[attr][0] == 0) {
|
||||
assert(oldsz == 0);
|
||||
tnl->save.dangling_attr_ref = GL_TRUE;
|
||||
_mesa_debug(NULL, "_save_upgrade_vertex: dangling reference attr %d\n",
|
||||
attr);
|
||||
|
||||
/* _mesa_debug(NULL, "_save_upgrade_vertex: dangling reference attr %d\n", */
|
||||
/* attr); */
|
||||
|
||||
#if 0
|
||||
/* The current strategy is to punt these degenerate cases
|
||||
|
|
@ -1653,7 +1659,8 @@ static void _save_current_init( GLcontext *ctx )
|
|||
tnl->save.currentsz[_TNL_ATTRIB_INDEX] = &ctx->ListState.ActiveIndex;
|
||||
tnl->save.current[_TNL_ATTRIB_INDEX] = &ctx->ListState.CurrentIndex;
|
||||
|
||||
/* Current edgeflag is handled individually */
|
||||
tnl->save.currentsz[_TNL_ATTRIB_EDGEFLAG] = &ctx->ListState.ActiveEdgeFlag;
|
||||
tnl->save.current[_TNL_ATTRIB_EDGEFLAG] = &tnl->save.CurrentFloatEdgeFlag;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ static void _tnl_copy_to_current( GLcontext *ctx )
|
|||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
GLuint i;
|
||||
|
||||
for (i = _TNL_ATTRIB_POS+1 ; i <= _TNL_ATTRIB_INDEX ; i++)
|
||||
for (i = _TNL_ATTRIB_POS+1 ; i <= _TNL_ATTRIB_EDGEFLAG ; i++)
|
||||
if (tnl->vtx.attrsz[i]) {
|
||||
/* Note: the tnl->vtx.current[i] pointers points to
|
||||
* the ctx->Current fields. The first 16 or so, anyway.
|
||||
|
|
@ -152,12 +152,12 @@ static void _tnl_copy_to_current( GLcontext *ctx )
|
|||
tnl->vtx.attrptr[i]);
|
||||
}
|
||||
|
||||
/* Edgeflag requires special treatment:
|
||||
/* Edgeflag requires additional treatment:
|
||||
*/
|
||||
if (tnl->vtx.attrsz[_TNL_ATTRIB_EDGEFLAG])
|
||||
if (tnl->vtx.attrsz[_TNL_ATTRIB_EDGEFLAG]) {
|
||||
ctx->Current.EdgeFlag =
|
||||
(tnl->vtx.attrptr[_TNL_ATTRIB_EDGEFLAG][0] == 1.0);
|
||||
|
||||
(tnl->vtx.CurrentFloatEdgeFlag == 1.0);
|
||||
}
|
||||
|
||||
/* Colormaterial -- this kindof sucks.
|
||||
*/
|
||||
|
|
@ -179,7 +179,12 @@ static void _tnl_copy_from_current( GLcontext *ctx )
|
|||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
GLint i;
|
||||
|
||||
for (i = _TNL_ATTRIB_POS+1 ; i <= _TNL_ATTRIB_INDEX ; i++)
|
||||
/* Edgeflag requires additional treatment:
|
||||
*/
|
||||
tnl->vtx.CurrentFloatEdgeFlag =
|
||||
(GLfloat)ctx->Current.EdgeFlag;
|
||||
|
||||
for (i = _TNL_ATTRIB_POS+1 ; i <= _TNL_ATTRIB_MAX ; i++)
|
||||
switch (tnl->vtx.attrsz[i]) {
|
||||
case 4: tnl->vtx.attrptr[i][3] = tnl->vtx.current[i][3];
|
||||
case 3: tnl->vtx.attrptr[i][2] = tnl->vtx.current[i][2];
|
||||
|
|
@ -188,13 +193,6 @@ static void _tnl_copy_from_current( GLcontext *ctx )
|
|||
break;
|
||||
}
|
||||
|
||||
/* Edgeflag requires special treatment:
|
||||
*/
|
||||
if (tnl->vtx.attrsz[_TNL_ATTRIB_EDGEFLAG])
|
||||
tnl->vtx.attrptr[_TNL_ATTRIB_EDGEFLAG][0] =
|
||||
(GLfloat)ctx->Current.EdgeFlag;
|
||||
|
||||
|
||||
ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;
|
||||
}
|
||||
|
||||
|
|
@ -860,6 +858,7 @@ static void _tnl_current_init( GLcontext *ctx )
|
|||
ctx->Light.Material.Attrib[i];
|
||||
|
||||
tnl->vtx.current[_TNL_ATTRIB_INDEX] = &ctx->Current.Index;
|
||||
tnl->vtx.current[_TNL_ATTRIB_EDGEFLAG] = &tnl->vtx.CurrentFloatEdgeFlag;
|
||||
}
|
||||
|
||||
static struct _tnl_dynfn *no_codegen( GLcontext *ctx, int key )
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue