[965] Add missing flagging of new stage programs for updating stage state.
authorEric Anholt <eric@anholt.net>
Wed, 5 Dec 2007 23:52:13 +0000 (15:52 -0800)
committerEric Anholt <eric@anholt.net>
Thu, 6 Dec 2007 00:44:49 +0000 (16:44 -0800)
Otherwise, choosing a new program wouldn't necessarily update the state, and
and an old program could be executed, leading to various sorts of pretty
pictures or hangs.

src/mesa/drivers/dri/i965/brw_clip.c
src/mesa/drivers/dri/i965/brw_gs.c
src/mesa/drivers/dri/i965/brw_sf.c
src/mesa/drivers/dri/i965/brw_vs.c
src/mesa/drivers/dri/i965/brw_wm.c

index 8287fd9edf3be7a0dde2e628bda9e229c64d0691..c548681aca5b2be16c4ae68f0604e55353ae0928 100644 (file)
@@ -128,25 +128,14 @@ static void compile_clip_prog( struct brw_context *brw,
                                                &brw->clip.prog_data );
 }
 
-
-static GLboolean search_cache( struct brw_context *brw, 
-                              struct brw_clip_prog_key *key )
-{
-   return brw_search_cache(&brw->cache[BRW_CLIP_PROG], 
-                          key, sizeof(*key),
-                          &brw->clip.prog_data,
-                          &brw->clip.prog_gs_offset);
-}
-
-
-
-
 /* Calculate interpolants for triangle and line rasterization.
  */
 static void upload_clip_prog( struct brw_context *brw )
 {
    GLcontext *ctx = &brw->intel.ctx;
    struct brw_clip_prog_key key;
+   struct brw_clip_prog_data *prog_data;
+   uint32_t offset;
 
    memset(&key, 0, sizeof(key));
 
@@ -252,8 +241,23 @@ static void upload_clip_prog( struct brw_context *brw )
       }
    }
 
-   if (!search_cache(brw, &key))
-      compile_clip_prog( brw, &key );
+   if (brw_search_cache(&brw->cache[BRW_CLIP_PROG],
+                       &key, sizeof(key),
+                       &prog_data,
+                       &offset)) {
+      if (offset != brw->clip.prog_gs_offset ||
+         !brw->clip.prog_data ||
+         memcmp(prog_data, &brw->clip.prog_data,
+                sizeof(*brw->clip.prog_data)) != 0)
+      {
+        brw->clip.prog_gs_offset = offset;
+        brw->clip.prog_data = prog_data;
+        brw->state.dirty.cache |= CACHE_NEW_CLIP_PROG;
+      }
+   } else {
+      compile_clip_prog(brw, &key);
+      brw->state.dirty.cache |= CACHE_NEW_CLIP_PROG;
+   }
 }
 
 
index 73263a5fff4ba2ca7b76c54973f184cb605a203b..fb419367db24753365c3618631568688b2cacf1b 100644 (file)
@@ -128,17 +128,6 @@ static void compile_gs_prog( struct brw_context *brw,
                                              &brw->gs.prog_data );
 }
 
-
-static GLboolean search_cache( struct brw_context *brw, 
-                              struct brw_gs_prog_key *key )
-{
-   return brw_search_cache(&brw->cache[BRW_GS_PROG], 
-                          key, sizeof(*key),
-                          &brw->gs.prog_data,
-                          &brw->gs.prog_gs_offset);
-}
-
-
 static const GLenum gs_prim[GL_POLYGON+1] = {  
    GL_POINTS,
    GL_LINES,
@@ -187,8 +176,26 @@ static void upload_gs_prog( struct brw_context *brw )
    }
 
    if (brw->gs.prog_active) {
-      if (!search_cache(brw, &key))
+      struct brw_gs_prog_data *prog_data;
+      uint32_t offset;
+
+      if (brw_search_cache(&brw->cache[BRW_GS_PROG],
+                          &key, sizeof(key),
+                          &prog_data,
+                          &offset)) {
+        if (offset != brw->gs.prog_gs_offset ||
+            !brw->gs.prog_data ||
+            memcmp(prog_data, &brw->gs.prog_data,
+                   sizeof(*brw->gs.prog_data)) != 0)
+        {
+           brw->gs.prog_gs_offset = offset;
+           brw->gs.prog_data = prog_data;
+           brw->state.dirty.cache |= CACHE_NEW_GS_PROG;
+        }
+      } else {
         compile_gs_prog( brw, &key );
+        brw->state.dirty.cache |= CACHE_NEW_GS_PROG;
+      }
    }
 }
 
index 738ceb0552ea95142555e83b9eaa71b04fd7dcf5..fd7fb9659f7d3902a99f2c8b1e83020431ed54b2 100644 (file)
@@ -1,3 +1,4 @@
+
 /*
  Copyright (C) Intel Corp.  2006.  All Rights Reserved.
  Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
@@ -125,22 +126,13 @@ static void compile_sf_prog( struct brw_context *brw,
                                              &brw->sf.prog_data );
 }
 
-
-static GLboolean search_cache( struct brw_context *brw, 
-                              struct brw_sf_prog_key *key )
-{
-   return brw_search_cache(&brw->cache[BRW_SF_PROG], 
-                          key, sizeof(*key),
-                          &brw->sf.prog_data,
-                          &brw->sf.prog_gs_offset);
-}
-
-
 /* Calculate interpolants for triangle and line rasterization.
  */
 static void upload_sf_prog( struct brw_context *brw )
 {
    struct brw_sf_prog_key key;
+   struct brw_sf_prog_data *prog_data;
+   uint32_t offset;
 
    memset(&key, 0, sizeof(key));
 
@@ -180,9 +172,23 @@ static void upload_sf_prog( struct brw_context *brw )
    if (key.do_twoside_color)
       key.frontface_ccw = (brw->attribs.Polygon->FrontFace == GL_CCW);
 
-
-   if (!search_cache(brw, &key))
+   if (brw_search_cache(&brw->cache[BRW_SF_PROG],
+                       &key, sizeof(key),
+                       &prog_data,
+                       &offset)) {
+      if (offset != brw->sf.prog_gs_offset ||
+         !brw->sf.prog_data ||
+         memcmp(prog_data, &brw->sf.prog_data,
+                sizeof(*brw->sf.prog_data)) != 0)
+      {
+        brw->sf.prog_gs_offset = offset;
+        brw->sf.prog_data = prog_data;
+        brw->state.dirty.cache |= CACHE_NEW_SF_PROG;
+      }
+   } else {
       compile_sf_prog( brw, &key );
+      brw->state.dirty.cache |= CACHE_NEW_SF_PROG;
+   }
 }
 
 
index e173f6fce3e8b6ec0c2abb3c7d5b8ab387ba1f58..a889a9900fe5601e44649d524dda755ad591082c 100644 (file)
@@ -90,6 +90,8 @@ static void brw_upload_vs_prog( struct brw_context *brw )
    struct brw_vs_prog_key key;
    struct brw_vertex_program *vp = 
       (struct brw_vertex_program *)brw->vertex_program;
+   struct brw_vs_prog_data *prog_data;
+   uint32_t offset;
 
    assert (vp && !vp->program.IsNVProgram);
    
@@ -110,13 +112,23 @@ static void brw_upload_vs_prog( struct brw_context *brw )
 
    /* Make an early check for the key.
     */
-   if (brw_search_cache(&brw->cache[BRW_VS_PROG], 
+   if (brw_search_cache(&brw->cache[BRW_VS_PROG],
                        &key, sizeof(key),
-                       &brw->vs.prog_data,
-                       &brw->vs.prog_gs_offset))
-       return;
-
-   do_vs_prog(brw, vp, &key);
+                       &prog_data,
+                       &offset)) {
+      if (offset != brw->vs.prog_gs_offset ||
+         !brw->vs.prog_data ||
+         memcmp(prog_data, &brw->vs.prog_data,
+                sizeof(*brw->vs.prog_data)) != 0)
+      {
+        brw->vs.prog_gs_offset = offset;
+        brw->vs.prog_data = prog_data;
+        brw->state.dirty.cache |= CACHE_NEW_VS_PROG;
+      }
+   } else {
+      do_vs_prog(brw, vp, &key);
+      brw->state.dirty.cache |= CACHE_NEW_VS_PROG;
+   }
 }
 
 
index 2d6249e3b562169852d52642847f16933f0e0d09..b7f027c5d695cc3ba2ce97ea39558da0d5db22b4 100644 (file)
@@ -326,18 +326,30 @@ static void brw_upload_wm_prog( struct brw_context *brw )
    struct brw_wm_prog_key key;
    struct brw_fragment_program *fp = (struct brw_fragment_program *)
       brw->fragment_program;
-     
+   struct brw_wm_prog_data *prog_data;
+   uint32_t offset;
+
    brw_wm_populate_key(brw, &key);
 
    /* Make an early check for the key.
     */
-   if (brw_search_cache(&brw->cache[BRW_WM_PROG], 
+   if (brw_search_cache(&brw->cache[BRW_WM_PROG],
                        &key, sizeof(key),
-                       &brw->wm.prog_data,
-                       &brw->wm.prog_gs_offset))
-      return;
-
-   do_wm_prog(brw, fp, &key);
+                       &prog_data,
+                       &offset)) {
+      if (offset != brw->wm.prog_gs_offset ||
+         !brw->wm.prog_data ||
+         memcmp(prog_data, &brw->wm.prog_data,
+                sizeof(*brw->wm.prog_data)) != 0)
+      {
+        brw->wm.prog_gs_offset = offset;
+        brw->wm.prog_data = prog_data;
+        brw->state.dirty.cache |= CACHE_NEW_WM_PROG;
+      }
+   } else {
+      do_wm_prog(brw, fp, &key);
+      brw->state.dirty.cache |= CACHE_NEW_WM_PROG;
+   }
 }