mesa: added gl_program::IndirectRegisterFiles field

Now drivers, etc. can know which register files are accessed with
indirect addressing.  Before we just checked gl_program::NumAddressRegs
but didn't know if that was the constant buffer, temp regs, or what.

The only user of this new field so far will be the gallium state tracker.
This commit is contained in:
Brian Paul
2010-07-30 14:24:23 -06:00
parent 79ab5b9798
commit 56643096f1
8 changed files with 234 additions and 210 deletions

View File

@@ -1808,6 +1808,11 @@ struct gl_program
/** Which texture target is being sampled (TEXTURE_1D/2D/3D/etc_INDEX) */ /** Which texture target is being sampled (TEXTURE_1D/2D/3D/etc_INDEX) */
gl_texture_index SamplerTargets[MAX_SAMPLERS]; gl_texture_index SamplerTargets[MAX_SAMPLERS];
/** Bitmask of which register files are read/written with indirect
* addressing. Mask of (1 << PROGRAM_x) bits.
*/
GLbitfield IndirectRegisterFiles;
/** Logical counts */ /** Logical counts */
/*@{*/ /*@{*/
GLuint NumInstructions; GLuint NumInstructions;

View File

@@ -109,6 +109,7 @@ _mesa_parse_arb_fragment_program(GLcontext* ctx, GLenum target,
program->Base.NumNativeTexIndirections = prog.NumTexIndirections; program->Base.NumNativeTexIndirections = prog.NumTexIndirections;
program->Base.InputsRead = prog.InputsRead; program->Base.InputsRead = prog.InputsRead;
program->Base.OutputsWritten = prog.OutputsWritten; program->Base.OutputsWritten = prog.OutputsWritten;
program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles;
for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) { for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) {
program->Base.TexturesUsed[i] = prog.TexturesUsed[i]; program->Base.TexturesUsed[i] = prog.TexturesUsed[i];
if (prog.TexturesUsed[i]) if (prog.TexturesUsed[i])
@@ -199,6 +200,7 @@ _mesa_parse_arb_vertex_program(GLcontext *ctx, GLenum target,
program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs; program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs;
program->Base.InputsRead = prog.InputsRead; program->Base.InputsRead = prog.InputsRead;
program->Base.OutputsWritten = prog.OutputsWritten; program->Base.OutputsWritten = prog.OutputsWritten;
program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles;
program->IsPositionInvariant = (state.option.PositionInvariant) program->IsPositionInvariant = (state.option.PositionInvariant)
? GL_TRUE : GL_FALSE; ? GL_TRUE : GL_FALSE;

View File

@@ -64,6 +64,7 @@ struct parse_state {
GLbitfield inputsRead; GLbitfield inputsRead;
GLbitfield outputsWritten; GLbitfield outputsWritten;
GLboolean anyProgRegsWritten; GLboolean anyProgRegsWritten;
GLboolean indirectRegisterFiles;
GLuint numInst; /* number of instructions parsed */ GLuint numInst; /* number of instructions parsed */
}; };
@@ -410,6 +411,7 @@ Parse_ParamReg(struct parse_state *parseState, struct prog_src_register *srcReg)
srcReg->RelAddr = GL_TRUE; srcReg->RelAddr = GL_TRUE;
srcReg->File = PROGRAM_ENV_PARAM; srcReg->File = PROGRAM_ENV_PARAM;
parseState->indirectRegisterFiles |= (1 << srcReg->File);
/* Look for +/-N offset */ /* Look for +/-N offset */
if (!Peek_Token(parseState, token)) if (!Peek_Token(parseState, token))
RETURN_ERROR; RETURN_ERROR;
@@ -1308,6 +1310,7 @@ _mesa_parse_nv_vertex_program(GLcontext *ctx, GLenum dstTarget,
parseState.inputsRead = 0; parseState.inputsRead = 0;
parseState.outputsWritten = 0; parseState.outputsWritten = 0;
parseState.anyProgRegsWritten = GL_FALSE; parseState.anyProgRegsWritten = GL_FALSE;
parseState.indirectRegisterFiles = 0x0;
/* Reset error state */ /* Reset error state */
_mesa_set_program_error(ctx, -1, NULL); _mesa_set_program_error(ctx, -1, NULL);
@@ -1408,6 +1411,8 @@ _mesa_parse_nv_vertex_program(GLcontext *ctx, GLenum dstTarget,
program->Base.Parameters = _mesa_new_parameter_list (); program->Base.Parameters = _mesa_new_parameter_list ();
program->Base.NumParameters = 0; program->Base.NumParameters = 0;
program->Base.IndirectRegisterFiles = parseState.indirectRegisterFiles;
state_tokens[0] = STATE_VERTEX_PROGRAM; state_tokens[0] = STATE_VERTEX_PROGRAM;
state_tokens[1] = STATE_ENV; state_tokens[1] = STATE_ENV;
/* Add refs to all of the potential params, in order. If we want to not /* Add refs to all of the potential params, in order. If we want to not

View File

@@ -924,6 +924,8 @@ _mesa_fprint_program_parameters(FILE *f,
fprintf(f, "NumParameters=%d\n", prog->NumParameters); fprintf(f, "NumParameters=%d\n", prog->NumParameters);
fprintf(f, "NumAttributes=%d\n", prog->NumAttributes); fprintf(f, "NumAttributes=%d\n", prog->NumAttributes);
fprintf(f, "NumAddressRegs=%d\n", prog->NumAddressRegs); fprintf(f, "NumAddressRegs=%d\n", prog->NumAddressRegs);
fprintf(f, "IndirectRegisterFiles: 0x%x (0b%s)\n",
prog->IndirectRegisterFiles, binary(prog->IndirectRegisterFiles));
fprintf(f, "SamplersUsed: 0x%x (0b%s)\n", fprintf(f, "SamplersUsed: 0x%x (0b%s)\n",
prog->SamplersUsed, binary(prog->SamplersUsed)); prog->SamplersUsed, binary(prog->SamplersUsed));
fprintf(f, "Samplers=[ "); fprintf(f, "Samplers=[ ");

View File

@@ -512,6 +512,7 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog)
if (prog->Attributes) if (prog->Attributes)
clone->Attributes = _mesa_clone_parameter_list(prog->Attributes); clone->Attributes = _mesa_clone_parameter_list(prog->Attributes);
memcpy(clone->LocalParams, prog->LocalParams, sizeof(clone->LocalParams)); memcpy(clone->LocalParams, prog->LocalParams, sizeof(clone->LocalParams));
clone->IndirectRegisterFiles = prog->IndirectRegisterFiles;
clone->NumInstructions = prog->NumInstructions; clone->NumInstructions = prog->NumInstructions;
clone->NumTemporaries = prog->NumTemporaries; clone->NumTemporaries = prog->NumTemporaries;
clone->NumParameters = prog->NumParameters; clone->NumParameters = prog->NumParameters;

File diff suppressed because it is too large Load Diff

View File

@@ -835,6 +835,7 @@ srcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */
$$.Base.File = $1->param_binding_type; $$.Base.File = $1->param_binding_type;
if ($3.Base.RelAddr) { if ($3.Base.RelAddr) {
state->prog->IndirectRegisterFiles |= (1 << $$.Base.File);
$1->param_accessed_indirectly = 1; $1->param_accessed_indirectly = 1;
$$.Base.RelAddr = 1; $$.Base.RelAddr = 1;

View File

@@ -756,6 +756,8 @@ _slang_update_inputs_outputs(struct gl_program *prog)
prog->InputsRead = 0x0; prog->InputsRead = 0x0;
prog->OutputsWritten = 0x0; prog->OutputsWritten = 0x0;
prog->IndirectRegisterFiles = 0x0;
for (i = 0; i < prog->NumInstructions; i++) { for (i = 0; i < prog->NumInstructions; i++) {
const struct prog_instruction *inst = prog->Instructions + i; const struct prog_instruction *inst = prog->Instructions + i;
const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode); const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode);
@@ -774,6 +776,9 @@ _slang_update_inputs_outputs(struct gl_program *prog)
else if (inst->SrcReg[j].File == PROGRAM_ADDRESS) { else if (inst->SrcReg[j].File == PROGRAM_ADDRESS) {
maxAddrReg = MAX2(maxAddrReg, (GLuint) (inst->SrcReg[j].Index + 1)); maxAddrReg = MAX2(maxAddrReg, (GLuint) (inst->SrcReg[j].Index + 1));
} }
if (inst->SrcReg[j].RelAddr)
prog->IndirectRegisterFiles |= (1 << inst->SrcReg[j].File);
} }
if (inst->DstReg.File == PROGRAM_OUTPUT) { if (inst->DstReg.File == PROGRAM_OUTPUT) {
@@ -784,6 +789,8 @@ _slang_update_inputs_outputs(struct gl_program *prog)
else if (inst->DstReg.File == PROGRAM_ADDRESS) { else if (inst->DstReg.File == PROGRAM_ADDRESS) {
maxAddrReg = MAX2(maxAddrReg, inst->DstReg.Index + 1); maxAddrReg = MAX2(maxAddrReg, inst->DstReg.Index + 1);
} }
if (inst->DstReg.RelAddr)
prog->IndirectRegisterFiles |= (1 << inst->DstReg.File);
} }
prog->NumAddressRegs = maxAddrReg; prog->NumAddressRegs = maxAddrReg;
} }