From 178414eba402f9087ea505e7ef19f1becdd7a36d Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 10 Jun 2010 23:45:51 -0700 Subject: i965: Remove caching of surface state objects. It turns out that computing a 56 byte key to look up a 20-byte object out of a hash table was some sort of a bad idea. Whoops. before: [ # ] backend test min(s) median(s) stddev. count [ 0] gl firefox-talos-gfx 37.799 38.203 0.39% 6/6 after: [ 0] gl firefox-talos-gfx 34.761 34.784 0.17% 5/6 --- src/mesa/drivers/dri/i965/brw_vs_surface_state.c | 33 +++++++----------------- 1 file changed, 10 insertions(+), 23 deletions(-) (limited to 'src/mesa/drivers/dri/i965/brw_vs_surface_state.c') diff --git a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c index d946756af7..611d77d1f7 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c @@ -139,41 +139,25 @@ brw_update_vs_constant_surface( GLcontext *ctx, key.width, key.height, key.depth, key.cpp, key.pitch); */ - drm_intel_bo_unreference(brw->vs.surf_bo[surf]); - brw->vs.surf_bo[surf] = brw_search_cache(&brw->surface_cache, - BRW_SS_SURFACE, - &key, sizeof(key), - &key.bo, 1, - NULL); - if (brw->vs.surf_bo[surf] == NULL) { - brw->vs.surf_bo[surf] = brw_create_constant_surface(brw, &key); - } + brw_create_constant_surface(brw, &key, &brw->vs.surf_bo[surf], + &brw->vs.surf_offset[surf]); } static void prepare_vs_surfaces(struct brw_context *brw) { - GLcontext *ctx = &brw->intel.ctx; - int i; int nr_surfaces = 0; - brw_update_vs_constant_surface(ctx, SURF_INDEX_VERT_CONST_BUFFER); - - for (i = 0; i < BRW_VS_MAX_SURF; i++) { - if (brw->vs.surf_bo[i] != NULL) { - nr_surfaces = i + 1; - } + if (brw->vs.const_bo) { + brw_add_validated_bo(brw, brw->vs.const_bo); + nr_surfaces = 1; } if (brw->vs.nr_surfaces != nr_surfaces) { brw->state.dirty.brw |= BRW_NEW_NR_VS_SURFACES; brw->vs.nr_surfaces = nr_surfaces; } - - for (i = 0; i < BRW_VS_MAX_SURF; i++) { - brw_add_validated_bo(brw, brw->vs.surf_bo[i]); - } } /** @@ -185,6 +169,7 @@ prepare_vs_surfaces(struct brw_context *brw) */ static void upload_vs_surfaces(struct brw_context *brw) { + GLcontext *ctx = &brw->intel.ctx; uint32_t *bind; int i; @@ -198,6 +183,8 @@ static void upload_vs_surfaces(struct brw_context *brw) return; } + brw_update_vs_constant_surface(ctx, SURF_INDEX_VERT_CONST_BUFFER); + /* Might want to calculate nr_surfaces first, to avoid taking up so much * space for the binding table. (once we have vs samplers) */ @@ -209,9 +196,9 @@ static void upload_vs_surfaces(struct brw_context *brw) if (brw->vs.surf_bo[i]) { drm_intel_bo_emit_reloc(brw->vs.bind_bo, brw->vs.bind_bo_offset + i * sizeof(uint32_t), - brw->vs.surf_bo[i], 0, + brw->vs.surf_bo[i], brw->vs.surf_offset[i], I915_GEM_DOMAIN_INSTRUCTION, 0); - bind[i] = brw->vs.surf_bo[i]->offset; + bind[i] = brw->vs.surf_bo[i]->offset + brw->vs.surf_offset[i]; } else { bind[i] = 0; } -- cgit v1.2.3