And add Gen7 implementation. v2: Fix off by one error in buffer size calculation.
Reviewed-by: Paul Berry <stereotype...@gmail.com> --- src/mesa/drivers/dri/i965/brw_context.h | 7 +++++ src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 35 +++++++++++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 0f88bad..a459c6a 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -926,6 +926,13 @@ struct brw_context uint32_t *out_offset, bool dword_pitch); + void (*create_raw_surface)(struct brw_context *brw, + drm_intel_bo *bo, + uint32_t offset, + uint32_t size, + uint32_t *out_offset, + bool rw); + /** Upload a SAMPLER_STATE table. */ void (*upload_sampler_state_table)(struct brw_context *brw, struct gl_program *prog, diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c index 89c0055..fb95842 100644 --- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c @@ -232,7 +232,8 @@ gen7_emit_buffer_surface_state(struct brw_context *brw, unsigned surface_format, unsigned buffer_size, unsigned pitch, - unsigned mocs) + unsigned mocs, + bool rw) { uint32_t *surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 8 * 4, 32, out_offset); @@ -259,7 +260,8 @@ gen7_emit_buffer_surface_state(struct brw_context *brw, /* Emit relocation to surface contents */ if (bo) { drm_intel_bo_emit_reloc(brw->batch.bo, *out_offset + 4, - bo, buffer_offset, I915_GEM_DOMAIN_SAMPLER, 0); + bo, buffer_offset, I915_GEM_DOMAIN_SAMPLER, + (rw ? I915_GEM_DOMAIN_SAMPLER : 0)); } gen7_check_surface_setup(surf, false /* is_render_target */); @@ -293,7 +295,8 @@ gen7_update_buffer_texture_surface(struct gl_context *ctx, surface_format, w, texel_size, - 0 /* mocs */); + 0 /* mocs */, + false /* rw */); } static void @@ -404,7 +407,27 @@ gen7_create_constant_surface(struct brw_context *brw, BRW_SURFACEFORMAT_R32G32B32A32_FLOAT, elements, stride, - 0 /* mocs */); + 0 /* mocs */, + false /* rw */); +} + +/** + * Create a raw surface for untyped R/W access. + */ +static void +gen7_create_raw_surface(struct brw_context *brw, drm_intel_bo *bo, + uint32_t offset, uint32_t size, + uint32_t *out_offset, bool rw) +{ + gen7_emit_buffer_surface_state(brw, + out_offset, + bo, + offset, + BRW_SURFACEFORMAT_RAW, + size, + 1, + 0 /* mocs */, + true /* rw */); } /** @@ -420,7 +443,8 @@ gen7_create_shader_time_surface(struct brw_context *brw, uint32_t *out_offset) BRW_SURFACEFORMAT_RAW, brw->shader_time.bo->size, 1, - 0 /* mocs */); + 0 /* mocs */, + true /* rw */); } static void @@ -592,4 +616,5 @@ gen7_init_vtable_surface_functions(struct brw_context *brw) brw->vtbl.update_null_renderbuffer_surface = gen7_update_null_renderbuffer_surface; brw->vtbl.create_constant_surface = gen7_create_constant_surface; + brw->vtbl.create_raw_surface = gen7_create_raw_surface; } -- 1.8.3.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev