r600: set barrier for tex inst if dst is used earlier, might overwrite it otherwise
This commit is contained in:
parent
a88c9296cb
commit
869e20bcb7
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue