mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 22:49:13 +02:00
i965: Remove unnecessary walk through Mesa IR in ProgramStringNotify().
Variable indexing of non-uniform arrays only exists in GLSL. Likewise, OPCODE_CAL/OPCODE_RET only existed to try and support GLSL's function calls. We don't use Mesa IR for GLSL, and these features are explicitly disallowed by ARB_vertex_program/ARB_fragment_program and never generated by ffvertex_prog.c. Since they'll never happen, there's no need to check for them, which saves us from walking through all the Mesa IR instructions. Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
109a97dbd2
commit
60c008dde6
1 changed files with 0 additions and 82 deletions
|
|
@ -108,46 +108,22 @@ brwIsProgramNative(struct gl_context *ctx,
|
|||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
shader_error(struct gl_context *ctx, struct gl_program *prog, const char *msg)
|
||||
{
|
||||
struct gl_shader_program *shader;
|
||||
|
||||
shader = _mesa_lookup_shader_program(ctx, prog->Id);
|
||||
|
||||
if (shader) {
|
||||
ralloc_strcat(&shader->InfoLog, msg);
|
||||
shader->LinkStatus = false;
|
||||
}
|
||||
}
|
||||
|
||||
static GLboolean
|
||||
brwProgramStringNotify(struct gl_context *ctx,
|
||||
GLenum target,
|
||||
struct gl_program *prog)
|
||||
{
|
||||
struct brw_context *brw = brw_context(ctx);
|
||||
int i;
|
||||
|
||||
if (target == GL_FRAGMENT_PROGRAM_ARB) {
|
||||
struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog;
|
||||
struct brw_fragment_program *newFP = brw_fragment_program(fprog);
|
||||
const struct brw_fragment_program *curFP =
|
||||
brw_fragment_program_const(brw->fragment_program);
|
||||
struct gl_shader_program *shader_program;
|
||||
|
||||
if (newFP == curFP)
|
||||
brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
|
||||
newFP->id = brw->program_id++;
|
||||
|
||||
/* Don't reject fragment shaders for their Mesa IR state when we're
|
||||
* using the new FS backend.
|
||||
*/
|
||||
shader_program = _mesa_lookup_shader_program(ctx, prog->Id);
|
||||
if (shader_program
|
||||
&& shader_program->_LinkedShaders[MESA_SHADER_FRAGMENT]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (target == GL_VERTEX_PROGRAM_ARB) {
|
||||
struct gl_vertex_program *vprog = (struct gl_vertex_program *) prog;
|
||||
|
|
@ -167,64 +143,6 @@ brwProgramStringNotify(struct gl_context *ctx,
|
|||
_tnl_program_string(ctx, target, prog);
|
||||
}
|
||||
|
||||
/* Reject programs with subroutines, which are totally broken at the moment
|
||||
* (all program flows return when any program flow returns, and
|
||||
* the VS also hangs if a function call calls a function.
|
||||
*
|
||||
* See piglit glsl-{vs,fs}-functions-[23] tests.
|
||||
*/
|
||||
for (i = 0; i < prog->NumInstructions; i++) {
|
||||
struct prog_instruction *inst = prog->Instructions + i;
|
||||
int r;
|
||||
|
||||
if (prog->Instructions[i].Opcode == OPCODE_CAL) {
|
||||
shader_error(ctx, prog,
|
||||
"i965 driver doesn't yet support uninlined function "
|
||||
"calls. Move to using a single return statement at "
|
||||
"the end of the function to work around it.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (prog->Instructions[i].Opcode == OPCODE_RET) {
|
||||
shader_error(ctx, prog,
|
||||
"i965 driver doesn't yet support \"return\" "
|
||||
"from main().\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (r = 0; r < _mesa_num_inst_src_regs(inst->Opcode); r++) {
|
||||
if (prog->Instructions[i].SrcReg[r].RelAddr &&
|
||||
prog->Instructions[i].SrcReg[r].File == PROGRAM_INPUT) {
|
||||
shader_error(ctx, prog,
|
||||
"Variable indexing of shader inputs unsupported\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (target == GL_FRAGMENT_PROGRAM_ARB &&
|
||||
prog->Instructions[i].DstReg.RelAddr &&
|
||||
prog->Instructions[i].DstReg.File == PROGRAM_OUTPUT) {
|
||||
shader_error(ctx, prog,
|
||||
"Variable indexing of FS outputs unsupported\n");
|
||||
return false;
|
||||
}
|
||||
if (target == GL_FRAGMENT_PROGRAM_ARB) {
|
||||
if ((prog->Instructions[i].DstReg.RelAddr &&
|
||||
prog->Instructions[i].DstReg.File == PROGRAM_TEMPORARY) ||
|
||||
(prog->Instructions[i].SrcReg[0].RelAddr &&
|
||||
prog->Instructions[i].SrcReg[0].File == PROGRAM_TEMPORARY) ||
|
||||
(prog->Instructions[i].SrcReg[1].RelAddr &&
|
||||
prog->Instructions[i].SrcReg[1].File == PROGRAM_TEMPORARY) ||
|
||||
(prog->Instructions[i].SrcReg[2].RelAddr &&
|
||||
prog->Instructions[i].SrcReg[2].File == PROGRAM_TEMPORARY)) {
|
||||
shader_error(ctx, prog,
|
||||
"Variable indexing of variable arrays in the FS "
|
||||
"unsupported\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue