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:
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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=[ ");
|
||||||
|
@@ -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
@@ -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;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user