summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2007-12-05 15:52:13 -0800
committerEric Anholt <eric@anholt.net>2007-12-05 16:44:49 -0800
commita4642f3d18bdaebaba31e5dee72fe5de9d890ffb (patch)
treeaaed9266b2b92529cf11be514214deba53329c77
parent259eacfa94a1086e4c99db83516989cc27832ef4 (diff)
[965] Add missing flagging of new stage programs for updating stage state.
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.
-rw-r--r--src/mesa/drivers/dri/i965/brw_clip.c34
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.c31
-rw-r--r--src/mesa/drivers/dri/i965/brw_sf.c32
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.c24
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm.c26
5 files changed, 94 insertions, 53 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_clip.c b/src/mesa/drivers/dri/i965/brw_clip.c
index 8287fd9edf..c548681aca 100644
--- a/src/mesa/drivers/dri/i965/brw_clip.c
+++ b/src/mesa/drivers/dri/i965/brw_clip.c
@@ -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;
+ }
}
diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
index 73263a5fff..fb419367db 100644
--- a/src/mesa/drivers/dri/i965/brw_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_gs.c
@@ -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;
+ }
}
}
diff --git a/src/mesa/drivers/dri/i965/brw_sf.c b/src/mesa/drivers/dri/i965/brw_sf.c
index 738ceb0552..fd7fb9659f 100644
--- a/src/mesa/drivers/dri/i965/brw_sf.c
+++ b/src/mesa/drivers/dri/i965/brw_sf.c
@@ -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;
+ }
}
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
index e173f6fce3..a889a9900f 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -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;
+ }
}
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 2d6249e3b5..b7f027c5d6 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -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;
+ }
}