[Mesa-dev] [PATCH] :( fail. (i965 TXD state dependent recompiles)
Kenneth Graunke
kenneth at whitecape.org
Wed Jun 15 11:03:34 PDT 2011
On first compile...
- brw_prepare_wm_prog populates the key with depth_compare_func = 0
and searches the cache. No hit.
- It then sets depth_compare_func and searches the cache again. No hit.
(This is an additional cost.)
- It resets depth_compare_func to 0 and compiles.
- During compilation, emit_texture_gen5 will set key->depth_compare_func
only if manual shadow comparisons are required (otherwise it stays 0).
- The newly compiled shader is added to the cache.
Subsequently...
- For most shaders:
- brw_prepare_wm_prog searches the cache with depth_compare_func = 0.
The shader is immediately found (no additional cost).
- If manual compares are required:
- brw_prepare_wm_prog searches the cache with depth_compare_func = 0.
No hit. It then depth_compare_func and searches again. If we've
seen this DepthFunc before, we find the shader. Total cost is two
cache searches. If we haven't seen DepthFunc before, compile.
---
src/mesa/drivers/dri/i965/brw_wm.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 1aebd12..ffbc3b3 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -484,6 +484,14 @@ static void brw_prepare_wm_prog(struct brw_context *brw)
&key, sizeof(key),
&brw->wm.prog_data);
if (brw->wm.prog_bo == NULL) {
+ key->depth_compare_func = ctx->Depth.Func;
+ brw->wm.prog_bo = brw_search_cache(&brw->cache, BRW_WM_PROG,
+ &key, sizeof(key),
+ &brw->wm.prog_data);
+ }
+
+ if (brw->wm.prog_bo == NULL) {
+ key->depth_compare_func = 0;
bool success = do_wm_prog(brw, ctx->Shader.CurrentFragmentProgram, fp,
&key);
assert(success);
--
1.7.5.4
More information about the mesa-dev
mailing list