r600: set barrier for tex inst if dst is used earlier, might overwrite it otherwise

This commit is contained in:
Andre Maasikas 2009-10-21 19:04:21 +03:00
parent a88c9296cb
commit 869e20bcb7
1 changed files with 25 additions and 2 deletions

View File

@ -135,15 +135,19 @@ GLboolean Find_Instruction_Dependencies_fp(struct r700_fragment_program *fp,
{ {
GLuint i, j; GLuint i, j;
GLint * puiTEMPwrites; GLint * puiTEMPwrites;
GLint * puiTEMPreads;
struct prog_instruction * pILInst; struct prog_instruction * pILInst;
InstDeps *pInstDeps; InstDeps *pInstDeps;
struct prog_instruction * texcoord_DepInst; struct prog_instruction * texcoord_DepInst;
GLint nDepInstID; GLint nDepInstID;
puiTEMPwrites = (GLint*) MALLOC(sizeof(GLuint)*mesa_fp->Base.NumTemporaries); puiTEMPwrites = (GLint*) MALLOC(sizeof(GLuint)*mesa_fp->Base.NumTemporaries);
puiTEMPreads = (GLint*) MALLOC(sizeof(GLuint)*mesa_fp->Base.NumTemporaries);
for(i=0; i<mesa_fp->Base.NumTemporaries; i++) for(i=0; i<mesa_fp->Base.NumTemporaries; i++)
{ {
puiTEMPwrites[i] = -1; puiTEMPwrites[i] = -1;
puiTEMPreads[i] = -1;
} }
pInstDeps = (InstDeps*)MALLOC(sizeof(InstDeps)*mesa_fp->Base.NumInstructions); pInstDeps = (InstDeps*)MALLOC(sizeof(InstDeps)*mesa_fp->Base.NumInstructions);
@ -167,6 +171,11 @@ GLboolean Find_Instruction_Dependencies_fp(struct r700_fragment_program *fp,
{ {
//Set dep. //Set dep.
pInstDeps[i].nSrcDeps[j] = puiTEMPwrites[pILInst->SrcReg[j].Index]; pInstDeps[i].nSrcDeps[j] = puiTEMPwrites[pILInst->SrcReg[j].Index];
//Set first read
if(puiTEMPreads[pILInst->SrcReg[j].Index] < 0 )
{
puiTEMPreads[pILInst->SrcReg[j].Index] = i;
}
} }
else else
{ {
@ -177,8 +186,6 @@ GLboolean Find_Instruction_Dependencies_fp(struct r700_fragment_program *fp,
fp->r700AsmCode.pInstDeps = pInstDeps; fp->r700AsmCode.pInstDeps = pInstDeps;
FREE(puiTEMPwrites);
//Find dep for tex inst //Find dep for tex inst
for(i=0; i<mesa_fp->Base.NumInstructions; i++) for(i=0; i<mesa_fp->Base.NumInstructions; i++)
{ {
@ -203,9 +210,25 @@ GLboolean Find_Instruction_Dependencies_fp(struct r700_fragment_program *fp,
{ //... other deps? { //... other deps?
} }
} }
// make sure that we dont overwrite src used earlier
nDepInstID = puiTEMPreads[pILInst->DstReg.Index];
if(nDepInstID < i)
{
pInstDeps[i].nDstDep = puiTEMPreads[pILInst->DstReg.Index];
texcoord_DepInst = &(mesa_fp->Base.Instructions[nDepInstID]);
if(GL_TRUE == IsAlu(texcoord_DepInst->Opcode) )
{
pInstDeps[nDepInstID].nDstDep = i;
}
}
} }
} }
FREE(puiTEMPwrites);
FREE(puiTEMPreads);
return GL_TRUE; return GL_TRUE;
} }