int EnumMtlTree(MtlBase *mb, int subMtl, MtlEnum &tenum) { for (int i=0; i<mb->NumSubTexmaps(); i++) { Texmap *st = mb->GetSubTexmap(i); if (st) { if (!EnumMtlTree(st,subMtl, tenum)) { return 0; } } } if (IsTex(mb)) { if (!tenum.proc(mb,subMtl)) { return 0; } } if (IsMtl(mb)) { Mtl *m = (Mtl *)mb; for (i=0; i<m->NumSubMtls(); i++) { Mtl *sm = m->GetSubMtl(i); int subm = (mb->IsMultiMtl()&&subMtl<0)?i:subMtl; if (sm) { if (!EnumMtlTree(sm,subm,tenum)) { return 0; } } } if (!tenum.proc(mb,subMtl)) { return 0; } } return 1; }
int GetMaps::proc(ReferenceMaker *rm) { if (IsTex((MtlBase*)rm)) mlib->AddMtl((MtlBase *)rm); return REF_ENUM_CONTINUE; }
void GetMaps::proc(ReferenceMaker *rm) { if (IsTex((MtlBase*)rm)) { mlib->AddMtl((MtlBase *)rm); } }
GLboolean Find_Instruction_Dependencies_fp(struct r700_fragment_program *fp, struct gl_fragment_program *mesa_fp) { GLuint i, j; GLint * puiTEMPwrites; GLint * puiTEMPreads; struct prog_instruction * pILInst; InstDeps *pInstDeps; struct prog_instruction * texcoord_DepInst; GLint nDepInstID; 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++) { puiTEMPwrites[i] = -1; puiTEMPreads[i] = -1; } pInstDeps = (InstDeps*)MALLOC(sizeof(InstDeps)*mesa_fp->Base.NumInstructions); for(i=0; i<mesa_fp->Base.NumInstructions; i++) { pInstDeps[i].nDstDep = -1; pILInst = &(mesa_fp->Base.Instructions[i]); //Dst if(pILInst->DstReg.File == PROGRAM_TEMPORARY) { //Set lastwrite for the temp puiTEMPwrites[pILInst->DstReg.Index] = i; } //Src for(j=0; j<3; j++) { if(pILInst->SrcReg[j].File == PROGRAM_TEMPORARY) { //Set dep. 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 { pInstDeps[i].nSrcDeps[j] = -1; } } } fp->r700AsmCode.pInstDeps = pInstDeps; //Find dep for tex inst for(i=0; i<mesa_fp->Base.NumInstructions; i++) { pILInst = &(mesa_fp->Base.Instructions[i]); if(GL_TRUE == IsTex(pILInst->Opcode)) { //src0 is the tex coord register, src1 is texunit, src2 is textype nDepInstID = pInstDeps[i].nSrcDeps[0]; if(nDepInstID >= 0) { texcoord_DepInst = &(mesa_fp->Base.Instructions[nDepInstID]); if(GL_TRUE == IsAlu(texcoord_DepInst->Opcode) ) { pInstDeps[nDepInstID].nDstDep = i; pInstDeps[i].nDstDep = i; } else if(GL_TRUE == IsTex(texcoord_DepInst->Opcode) ) { pInstDeps[i].nDstDep = i; } else { //... 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; }