aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/gen6_wm_state.c
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2011-04-21 19:03:18 -0700
committerEric Anholt <[email protected]>2011-04-29 15:25:30 -0700
commit90c70123b830bead0ac622df94f2809ac056af95 (patch)
treeb81f57e262039ea8df633c437fbea02b695716a2 /src/mesa/drivers/dri/i965/gen6_wm_state.c
parent530de3a2f5f6c1f1a6ec7a5f781d90f7229cab2a (diff)
i965/gen6: Stream the WM push constants.
Improves 3DMMES taiji demo performance by 5.1% +/- 1.9% (n=15), by reducing CPU time spent thrashing around those tiny little constant BOs. Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen6_wm_state.c')
-rw-r--r--src/mesa/drivers/dri/i965/gen6_wm_state.c24
1 files changed, 10 insertions, 14 deletions
diff --git a/src/mesa/drivers/dri/i965/gen6_wm_state.c b/src/mesa/drivers/dri/i965/gen6_wm_state.c
index c4b57fe1f95..fe5c7a1120b 100644
--- a/src/mesa/drivers/dri/i965/gen6_wm_state.c
+++ b/src/mesa/drivers/dri/i965/gen6_wm_state.c
@@ -42,9 +42,6 @@ gen6_prepare_wm_push_constants(struct brw_context *brw)
const struct brw_fragment_program *fp =
brw_fragment_program_const(brw->fragment_program);
- drm_intel_bo_unreference(brw->wm.push_const_bo);
- brw->wm.push_const_bo = NULL;
-
/* Updates the ParamaterValues[i] pointers for all parameters of the
* basic type of PROGRAM_STATE_VAR.
*/
@@ -55,13 +52,11 @@ gen6_prepare_wm_push_constants(struct brw_context *brw)
float *constants;
unsigned int i;
- brw->wm.push_const_bo = drm_intel_bo_alloc(intel->bufmgr,
- "WM constant_bo",
- brw->wm.prog_data->nr_params *
- sizeof(float),
- 4096);
- drm_intel_gem_bo_map_gtt(brw->wm.push_const_bo);
- constants = brw->wm.push_const_bo->virtual;
+ constants = brw_state_batch(brw,
+ brw->wm.prog_data->nr_params *
+ sizeof(float),
+ 32, &brw->wm.push_const_offset);
+
for (i = 0; i < brw->wm.prog_data->nr_params; i++) {
constants[i] = convert_param(brw->wm.prog_data->param_convert[i],
*brw->wm.prog_data->param[i]);
@@ -80,15 +75,14 @@ gen6_prepare_wm_push_constants(struct brw_context *brw)
printf("\n");
printf("\n");
}
-
- drm_intel_gem_bo_unmap_gtt(brw->wm.push_const_bo);
}
}
const struct brw_tracked_state gen6_wm_constants = {
.dirty = {
.mesa = _NEW_PROGRAM_CONSTANTS,
- .brw = BRW_NEW_FRAGMENT_PROGRAM,
+ .brw = (BRW_NEW_BATCH |
+ BRW_NEW_FRAGMENT_PROGRAM),
.cache = 0,
},
.prepare = gen6_prepare_wm_push_constants,
@@ -118,8 +112,10 @@ upload_wm_state(struct brw_context *brw)
OUT_BATCH(_3DSTATE_CONSTANT_PS << 16 |
GEN6_CONSTANT_BUFFER_0_ENABLE |
(5 - 2));
- OUT_RELOC(brw->wm.push_const_bo,
+ /* This is also the set of state flags from gen6_prepare_wm_constants */
+ OUT_RELOC(intel->batch.bo,
I915_GEM_DOMAIN_RENDER, 0, /* XXX: bad domain */
+ brw->wm.push_const_offset +
ALIGN(brw->wm.prog_data->nr_params,
brw->wm.prog_data->dispatch_width) / 8 - 1);
OUT_BATCH(0);