From 60c008dde6c1ef884d2b4fdcd199e71e8ec597e4 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Fri, 26 Oct 2012 11:52:23 -0700 Subject: 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 --- src/mesa/drivers/dri/i965/brw_program.c | 82 --------------------------------- 1 file changed, 82 deletions(-) (limited to 'src/mesa/drivers/dri/i965') diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c index 0bf72d9b5c7..6bf5a6a0002 100644 --- a/src/mesa/drivers/dri/i965/brw_program.c +++ b/src/mesa/drivers/dri/i965/brw_program.c @@ -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; } -- cgit v1.2.3