i965: Remove unnecessary walk through Mesa IR in ProgramStringNotify().
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 26 Oct 2012 18:52:23 +0000 (11:52 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 1 Nov 2012 21:29:36 +0000 (14:29 -0700)
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>
src/mesa/drivers/dri/i965/brw_program.c

index 0bf72d9b5c7abe7790c34c6d826e69df863225f0..6bf5a6a000226cb792abaf1aabf1e1b008b636e8 100644 (file)
@@ -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;
 }