fixes to _mesa_combine_programs(), from gallium-0.1

This commit is contained in:
Brian Paul
2008-05-18 15:46:26 -06:00
parent 5976a6a75c
commit 0c78c766e4
2 changed files with 46 additions and 6 deletions

View File

@@ -214,11 +214,17 @@ _mesa_init_program_struct( GLcontext *ctx, struct gl_program *prog,
{ {
(void) ctx; (void) ctx;
if (prog) { if (prog) {
GLuint i;
_mesa_bzero(prog, sizeof(*prog));
prog->Id = id; prog->Id = id;
prog->Target = target; prog->Target = target;
prog->Resident = GL_TRUE; prog->Resident = GL_TRUE;
prog->RefCount = 1; prog->RefCount = 1;
prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB; prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
/* default mapping from samplers to texture units */
for (i = 0; i < MAX_SAMPLERS; i++)
prog->SamplerUnits[i] = i;
} }
return prog; return prog;
@@ -430,6 +436,7 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog)
prog->NumInstructions); prog->NumInstructions);
clone->InputsRead = prog->InputsRead; clone->InputsRead = prog->InputsRead;
clone->OutputsWritten = prog->OutputsWritten; clone->OutputsWritten = prog->OutputsWritten;
clone->SamplersUsed = prog->SamplersUsed;
memcpy(clone->TexturesUsed, prog->TexturesUsed, sizeof(prog->TexturesUsed)); memcpy(clone->TexturesUsed, prog->TexturesUsed, sizeof(prog->TexturesUsed));
if (prog->Parameters) if (prog->Parameters)
@@ -544,6 +551,7 @@ replace_registers(struct prog_instruction *inst, GLuint numInst,
{ {
GLuint i, j; GLuint i, j;
for (i = 0; i < numInst; i++) { for (i = 0; i < numInst; i++) {
/* src regs */
for (j = 0; j < _mesa_num_inst_src_regs(inst->Opcode); j++) { for (j = 0; j < _mesa_num_inst_src_regs(inst->Opcode); j++) {
if (inst[i].SrcReg[j].File == oldFile && if (inst[i].SrcReg[j].File == oldFile &&
inst[i].SrcReg[j].Index == oldIndex) { inst[i].SrcReg[j].Index == oldIndex) {
@@ -551,6 +559,11 @@ replace_registers(struct prog_instruction *inst, GLuint numInst,
inst[i].SrcReg[j].Index = newIndex; inst[i].SrcReg[j].Index = newIndex;
} }
} }
/* dst reg */
if (inst[i].DstReg.File == oldFile && inst[i].DstReg.Index == oldIndex) {
inst[i].DstReg.File = newFile;
inst[i].DstReg.Index = newIndex;
}
} }
} }
@@ -584,7 +597,8 @@ adjust_param_indexes(struct prog_instruction *inst, GLuint numInst,
*/ */
struct gl_program * struct gl_program *
_mesa_combine_programs(GLcontext *ctx, _mesa_combine_programs(GLcontext *ctx,
struct gl_program *progA, struct gl_program *progB) const struct gl_program *progA,
const struct gl_program *progB)
{ {
struct prog_instruction *newInst; struct prog_instruction *newInst;
struct gl_program *newProg; struct gl_program *newProg;
@@ -592,6 +606,7 @@ _mesa_combine_programs(GLcontext *ctx,
const GLuint lenB = progB->NumInstructions; const GLuint lenB = progB->NumInstructions;
const GLuint numParamsA = _mesa_num_parameters(progA->Parameters); const GLuint numParamsA = _mesa_num_parameters(progA->Parameters);
const GLuint newLength = lenA + lenB; const GLuint newLength = lenA + lenB;
GLbitfield inputsB;
GLuint i; GLuint i;
ASSERT(progA->Target == progB->Target); ASSERT(progA->Target == progB->Target);
@@ -613,17 +628,41 @@ _mesa_combine_programs(GLcontext *ctx,
newProg->NumInstructions = newLength; newProg->NumInstructions = newLength;
if (newProg->Target == GL_FRAGMENT_PROGRAM_ARB) { if (newProg->Target == GL_FRAGMENT_PROGRAM_ARB) {
/* connect color outputs/inputs */ struct gl_fragment_program *fprogA, *fprogB, *newFprog;
fprogA = (struct gl_fragment_program *) progA;
fprogB = (struct gl_fragment_program *) progB;
newFprog = (struct gl_fragment_program *) newProg;
newFprog->UsesKill = fprogA->UsesKill || fprogB->UsesKill;
/* Connect color outputs of fprogA to color inputs of fprogB, via a
* new temporary register.
*/
if ((progA->OutputsWritten & (1 << FRAG_RESULT_COLR)) && if ((progA->OutputsWritten & (1 << FRAG_RESULT_COLR)) &&
(progB->InputsRead & (1 << FRAG_ATTRIB_COL0))) { (progB->InputsRead & (1 << FRAG_ATTRIB_COL0))) {
GLint tempReg = _mesa_find_free_register(newProg, PROGRAM_TEMPORARY);
if (!tempReg) {
_mesa_problem(ctx, "No free temp regs found in "
"_mesa_combine_programs(), using 31");
tempReg = 31;
}
/* replace writes to result.color[0] with tempReg */
replace_registers(newInst, lenA,
PROGRAM_OUTPUT, FRAG_RESULT_COLR,
PROGRAM_TEMPORARY, tempReg);
/* replace reads from input.color[0] with tempReg */
replace_registers(newInst + lenA, lenB, replace_registers(newInst + lenA, lenB,
PROGRAM_INPUT, FRAG_ATTRIB_COL0, PROGRAM_INPUT, FRAG_ATTRIB_COL0,
PROGRAM_OUTPUT, FRAG_RESULT_COLR); PROGRAM_TEMPORARY, tempReg);
} }
newProg->InputsRead = progA->InputsRead; inputsB = progB->InputsRead;
newProg->InputsRead |= (progB->InputsRead & ~(1 << FRAG_ATTRIB_COL0)); if (progA->OutputsWritten & (1 << FRAG_RESULT_COLR)) {
inputsB &= ~(1 << FRAG_ATTRIB_COL0);
}
newProg->InputsRead = progA->InputsRead | inputsB;
newProg->OutputsWritten = progB->OutputsWritten; newProg->OutputsWritten = progB->OutputsWritten;
newProg->SamplersUsed = progA->SamplersUsed | progB->SamplersUsed;
} }
else { else {
/* vertex program */ /* vertex program */

View File

@@ -117,7 +117,8 @@ _mesa_insert_instructions(struct gl_program *prog, GLuint start, GLuint count);
extern struct gl_program * extern struct gl_program *
_mesa_combine_programs(GLcontext *ctx, _mesa_combine_programs(GLcontext *ctx,
struct gl_program *progA, struct gl_program *progB); const struct gl_program *progA,
const struct gl_program *progB);
extern GLint extern GLint
_mesa_find_free_register(const struct gl_program *prog, GLuint regFile); _mesa_find_free_register(const struct gl_program *prog, GLuint regFile);