i965: avoid unnecessary calls to brw_wm_is_glsl()
authorBrian Paul <brianp@vmware.com>
Fri, 6 Mar 2009 23:04:53 +0000 (16:04 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 6 Mar 2009 23:21:20 +0000 (16:21 -0700)
This function scans the shader to see if it has any GLSL features like
conditionals and loops.  Calling this during state validation is expensive.
Just call it when the shader is given to the driver and save the result.

There's some new/temporary assertions to be sure we don't get out of sync
on this.

src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_program.c
src/mesa/drivers/dri/i965/brw_wm.c
src/mesa/drivers/dri/i965/brw_wm_state.c

index 2e2eaf572192bab8b6ad34fedd29a4d07f504113..af904ee6d658917a4afa329b6ee79a11fdb58b82 100644 (file)
@@ -164,6 +164,7 @@ struct brw_vertex_program {
 struct brw_fragment_program {
    struct gl_fragment_program program;
    GLuint id;  /**< serial no. to identify frag progs, never re-used */
+   GLboolean isGLSL;  /**< really, any IF/LOOP/CONT/BREAK instructions */
 };
 
 
index 774180c28c7aacb6552592e975d3d1bf1bd08da2..2894cce3d6bf4a4caeb55f21ac0ec4f1f439d384 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "brw_context.h"
 #include "brw_util.h"
+#include "brw_wm.h"
 
 static void brwBindProgram( GLcontext *ctx,
                            GLenum target, 
@@ -122,6 +123,7 @@ static void brwProgramStringNotify( GLcontext *ctx,
       if (newFP == curFP)
         brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
       newFP->id = brw->program_id++;      
+      newFP->isGLSL = brw_wm_is_glsl(fprog);
    }
    else if (target == GL_VERTEX_PROGRAM_ARB) {
       struct brw_vertex_program *newVP = (struct brw_vertex_program *) prog;
index 879000644b21d6f34d72aca8e54651f54e8f456d..1645ca0b70e7ce3cfe8bb57074c10b54e0c52e87 100644 (file)
@@ -149,11 +149,14 @@ static void do_wm_prog( struct brw_context *brw,
 
    brw_init_compile(brw, &c->func);
 
+   /* temporary sanity check assertion */
+   ASSERT(fp->isGLSL == brw_wm_is_glsl(&c->fp->program));
+
    /*
     * Shader which use GLSL features such as flow control are handled
     * differently from "simple" shaders.
     */
-   if (brw_wm_is_glsl(&c->fp->program)) {
+   if (fp->isGLSL) {
       brw_wm_glsl_emit(brw, c);
    }
    else {
index f7ea756fb0de5524cf248ee3b3fa24984dd799c7..63fc8a004fd466a833675edef355a6d4279949f8 100644 (file)
@@ -62,6 +62,7 @@ wm_unit_populate_key(struct brw_context *brw, struct brw_wm_unit_key *key)
 {
    GLcontext *ctx = &brw->intel.ctx;
    const struct gl_fragment_program *fp = brw->fragment_program;
+   const struct brw_fragment_program *bfp = (struct brw_fragment_program *) fp;
    struct intel_context *intel = &brw->intel;
 
    memset(key, 0, sizeof(*key));
@@ -107,7 +108,10 @@ wm_unit_populate_key(struct brw_context *brw, struct brw_wm_unit_key *key)
 
    /* _NEW_COLOR */
    key->uses_kill = fp->UsesKill || ctx->Color.AlphaEnabled;
-   key->is_glsl = brw_wm_is_glsl(fp);
+   key->is_glsl = bfp->isGLSL;
+
+   /* temporary sanity check assertion */
+   ASSERT(bfp->isGLSL == brw_wm_is_glsl(fp));
 
    /* XXX: This needs a flag to indicate when it changes. */
    key->stats_wm = intel->stats_wm;