summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2013-10-31 18:16:45 -0700
committerEric Anholt <eric@anholt.net>2014-03-26 13:14:57 -0700
commitb02bcea7157020b01d5f4fdcb5da69c10013a818 (patch)
treeaf68922ac8dba42048684f1daed8435467b5e9cc /src/mesa/drivers/dri/i965/brw_wm_surface_state.c
parent3b579882903c577daa1af286a5e0bf5bc122a34d (diff)
downloadexternal_mesa3d-b02bcea7157020b01d5f4fdcb5da69c10013a818.zip
external_mesa3d-b02bcea7157020b01d5f4fdcb5da69c10013a818.tar.gz
external_mesa3d-b02bcea7157020b01d5f4fdcb5da69c10013a818.tar.bz2
i965: Use intel_upload_space() for pull constant uploads.
This also happens to fix a leak of the current GS pull constant BO on context destroy, by just not holding on to the pull const bos after the surface state is generated. No statistically significant performance difference on GLB2.7 on HSW at 1024x768 (n=40) or 320x240 (n=44), or on BYT at 320x240 (n=47). v2: Rebase on intel_upload simplification. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_wm_surface_state.c')
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm_surface_state.c19
1 files changed, 7 insertions, 12 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
index 61f7ba5..443820b 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
@@ -467,37 +467,32 @@ brw_upload_wm_pull_constants(struct brw_context *brw)
const int size = brw->wm.prog_data->base.nr_pull_params * sizeof(float);
const int surf_index =
brw->wm.prog_data->base.binding_table.pull_constants_start;
- float *constants;
unsigned int i;
_mesa_load_state_parameters(ctx, params);
/* CACHE_NEW_WM_PROG */
if (brw->wm.prog_data->base.nr_pull_params == 0) {
- if (brw->wm.base.const_bo) {
- drm_intel_bo_unreference(brw->wm.base.const_bo);
- brw->wm.base.const_bo = NULL;
+ if (brw->wm.base.surf_offset[surf_index]) {
brw->wm.base.surf_offset[surf_index] = 0;
brw->state.dirty.brw |= BRW_NEW_SURFACES;
}
return;
}
- drm_intel_bo_unreference(brw->wm.base.const_bo);
- brw->wm.base.const_bo = drm_intel_bo_alloc(brw->bufmgr, "WM const bo",
- size, 64);
-
/* _NEW_PROGRAM_CONSTANTS */
- drm_intel_gem_bo_map_gtt(brw->wm.base.const_bo);
- constants = brw->wm.base.const_bo->virtual;
+ drm_intel_bo *const_bo = NULL;
+ uint32_t const_offset;
+ float *constants = intel_upload_space(brw, size, 64,
+ &const_bo, &const_offset);
for (i = 0; i < brw->wm.prog_data->base.nr_pull_params; i++) {
constants[i] = *brw->wm.prog_data->base.pull_param[i];
}
- drm_intel_gem_bo_unmap_gtt(brw->wm.base.const_bo);
- brw_create_constant_surface(brw, brw->wm.base.const_bo, 0, size,
+ brw_create_constant_surface(brw, const_bo, const_offset, size,
&brw->wm.base.surf_offset[surf_index],
true);
+ drm_intel_bo_unreference(const_bo);
brw->state.dirty.brw |= BRW_NEW_SURFACES;
}