summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/brw_program.c
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2012-10-26 11:52:23 -0700
committerKenneth Graunke <kenneth@whitecape.org>2012-11-01 14:29:36 -0700
commit60c008dde6c1ef884d2b4fdcd199e71e8ec597e4 (patch)
treeec4efb2d30face1d20041c3a89d35bc4a618c61b /src/mesa/drivers/dri/i965/brw_program.c
parent109a97dbd2748eaf4813d9f0c7d9ea396daeddbc (diff)
downloadexternal_mesa3d-60c008dde6c1ef884d2b4fdcd199e71e8ec597e4.zip
external_mesa3d-60c008dde6c1ef884d2b4fdcd199e71e8ec597e4.tar.gz
external_mesa3d-60c008dde6c1ef884d2b4fdcd199e71e8ec597e4.tar.bz2
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>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_program.c')
-rw-r--r--src/mesa/drivers/dri/i965/brw_program.c82
1 files changed, 0 insertions, 82 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c
index 0bf72d9..6bf5a6a 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;
}