r6xx/r7xx: fix buffer aging bug

We were using sparse indexing for aos, while the common
code expected packed indexing.
This commit is contained in:
Alex Deucher 2009-07-14 20:08:27 -04:00
parent 9ae78dc0bc
commit 9385e4e1ff
2 changed files with 32 additions and 27 deletions

View file

@ -355,7 +355,7 @@ int r700SetupStreams(GLcontext * ctx)
struct vertex_buffer *vb = &tnl->vb;
unsigned int unBit;
unsigned int i;
unsigned int i, j = 0;
BEGIN_BATCH_NO_AUTOSTATE(6);
R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
@ -374,21 +374,23 @@ int r700SetupStreams(GLcontext * ctx)
unBit = 1 << i;
if(vpc->mesa_program.Base.InputsRead & unBit)
{
rcommon_emit_vector(ctx,
&context->radeon.tcl.aos[i],
vb->AttribPtr[i]->data,
vb->AttribPtr[i]->size,
vb->AttribPtr[i]->stride,
vb->Count);
/* currently aos are packed */
r700SetupVTXConstants(ctx,
i,
(void*)(&context->radeon.tcl.aos[i]),
(unsigned int)context->radeon.tcl.aos[i].components,
(unsigned int)context->radeon.tcl.aos[i].stride * 4,
(unsigned int)context->radeon.tcl.aos[i].count);
if (!context->radeon.tcl.aos[j].bo) {
rcommon_emit_vector(ctx,
&context->radeon.tcl.aos[j],
vb->AttribPtr[i]->data,
vb->AttribPtr[i]->size,
vb->AttribPtr[i]->stride,
vb->Count);
/* currently aos are packed */
r700SetupVTXConstants(ctx,
j,
(void*)(&context->radeon.tcl.aos[j]),
(unsigned int)context->radeon.tcl.aos[j].components,
(unsigned int)context->radeon.tcl.aos[j].stride * 4,
(unsigned int)context->radeon.tcl.aos[j].count);
j++;
}
context->radeon.tcl.aos_count++;
}
}

View file

@ -115,7 +115,7 @@ unsigned int Map_Vertex_Input(r700_AssemblerBase *pAsm,
struct gl_vertex_program *mesa_vp,
unsigned int unStart)
{
int i;
int i, j = 0;
unsigned int unBit;
unsigned int unTotal = unStart;
for(i=0; i<VERT_ATTRIB_MAX; i++)
@ -123,7 +123,8 @@ unsigned int Map_Vertex_Input(r700_AssemblerBase *pAsm,
unBit = 1 << i;
if(mesa_vp->Base.InputsRead & unBit)
{
pAsm->ucVP_AttributeMap[i] = unTotal++;
pAsm->ucVP_AttributeMap[j] = unTotal++;
j++;
}
}
return (unTotal - unStart);
@ -133,7 +134,7 @@ GLboolean Process_Vertex_Program_Vfetch_Instructions(
struct r700_vertex_program *vp,
struct gl_vertex_program *mesa_vp)
{
int i;
int i, j = 0;
unsigned int unBit;
VTX_FETCH_METHOD vtxFetchMethod;
vtxFetchMethod.bEnableMini = GL_FALSE;
@ -145,11 +146,12 @@ GLboolean Process_Vertex_Program_Vfetch_Instructions(
if(mesa_vp->Base.InputsRead & unBit)
{
assemble_vfetch_instruction(&vp->r700AsmCode,
i,
vp->r700AsmCode.ucVP_AttributeMap[i],
vp->aos_desc[i].size,
vp->aos_desc[i].type,
&vtxFetchMethod);
j,
vp->r700AsmCode.ucVP_AttributeMap[j],
vp->aos_desc[j].size,
vp->aos_desc[j].type,
&vtxFetchMethod);
j++;
}
}
@ -305,15 +307,16 @@ void r700SelectVertexShader(GLcontext *ctx)
struct vertex_buffer *vb = &tnl->vb;
unsigned int unBit;
unsigned int i;
unsigned int i, j = 0;
for(i=0; i<VERT_ATTRIB_MAX; i++)
{
unBit = 1 << i;
if(vpc->mesa_program.Base.InputsRead & unBit) /* ctx->Array.ArrayObj->xxxxxxx */
{
vpc->aos_desc[i].size = vb->AttribPtr[i]->size;
vpc->aos_desc[i].stride = vb->AttribPtr[i]->size * sizeof(GL_FLOAT);/* when emit array, data is packed. vb->AttribPtr[i]->stride;*/
vpc->aos_desc[i].type = GL_FLOAT;
vpc->aos_desc[j].size = vb->AttribPtr[i]->size;
vpc->aos_desc[j].stride = vb->AttribPtr[i]->size * sizeof(GL_FLOAT);/* when emit array, data is packed. vb->AttribPtr[i]->stride;*/
vpc->aos_desc[j].type = GL_FLOAT;
j++;
}
}