[Mesa-dev] [PATCH 11/22] intel/blorp: Add a flag to make blorp not re-emit dept/stencil buffers
Pohjolainen, Topi
topi.pohjolainen at gmail.com
Mon Oct 10 05:49:09 UTC 2016
On Fri, Oct 07, 2016 at 09:41:09PM -0700, Jason Ekstrand wrote:
> In Vulkan, we want to be able to use blorp to perform clears inside of a
> render pass. If blorp stomps the depth/stencil buffers packets then we'll
> have to re-emit them. This gets tricky when secondary command buffers get
> involved. Instead, we'll simply guarantee that the depth and stencil
> buffers we pass to blorp (if any) match those already set in the hardware.
Patches 8,9 and 11 are:
Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
>
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> ---
> src/intel/blorp/blorp.c | 4 +++-
> src/intel/blorp/blorp.h | 13 ++++++++++++-
> src/intel/blorp/blorp_genX_exec.h | 3 ++-
> src/intel/vulkan/anv_blorp.c | 18 +++++++++---------
> src/mesa/drivers/dri/i965/brw_blorp.c | 12 ++++++------
> 5 files changed, 32 insertions(+), 18 deletions(-)
>
> diff --git a/src/intel/blorp/blorp.c b/src/intel/blorp/blorp.c
> index 91513a0..08afffe 100644
> --- a/src/intel/blorp/blorp.c
> +++ b/src/intel/blorp/blorp.c
> @@ -45,10 +45,12 @@ blorp_finish(struct blorp_context *blorp)
>
> void
> blorp_batch_init(struct blorp_context *blorp,
> - struct blorp_batch *batch, void *driver_batch)
> + struct blorp_batch *batch, void *driver_batch,
> + enum blorp_batch_flags flags)
> {
> batch->blorp = blorp;
> batch->driver_batch = driver_batch;
> + batch->flags = flags;
> }
>
> void
> diff --git a/src/intel/blorp/blorp.h b/src/intel/blorp/blorp.h
> index 263d194..7a3e3de 100644
> --- a/src/intel/blorp/blorp.h
> +++ b/src/intel/blorp/blorp.h
> @@ -66,13 +66,24 @@ void blorp_init(struct blorp_context *blorp, void *driver_ctx,
> struct isl_device *isl_dev);
> void blorp_finish(struct blorp_context *blorp);
>
> +enum blorp_batch_flags {
> + /**
> + * This flag indicates that blorp should *not* re-emit the depth and
> + * stencil buffer packets. Instead, the driver guarantees that all depth
> + * and stencil images passed in will match what is currently set in the
> + * hardware.
> + */
> + BLORP_BATCH_NO_EMIT_DEPTH_STENCIL = (1 << 0),
> +};
> +
> struct blorp_batch {
> struct blorp_context *blorp;
> void *driver_batch;
> + enum blorp_batch_flags flags;
> };
>
> void blorp_batch_init(struct blorp_context *blorp, struct blorp_batch *batch,
> - void *driver_batch);
> + void *driver_batch, enum blorp_batch_flags flags);
> void blorp_batch_finish(struct blorp_batch *batch);
>
> struct blorp_address {
> diff --git a/src/intel/blorp/blorp_genX_exec.h b/src/intel/blorp/blorp_genX_exec.h
> index 1615d42..ff9e68b 100644
> --- a/src/intel/blorp/blorp_genX_exec.h
> +++ b/src/intel/blorp/blorp_genX_exec.h
> @@ -1281,7 +1281,8 @@ blorp_exec(struct blorp_batch *batch, const struct blorp_params *params)
>
> blorp_emit_viewport_state(batch, params);
>
> - blorp_emit_depth_stencil_config(batch, params);
> + if (!(batch->flags & BLORP_BATCH_NO_EMIT_DEPTH_STENCIL))
> + blorp_emit_depth_stencil_config(batch, params);
>
> blorp_emit(batch, GENX(3DPRIMITIVE), prim) {
> prim.VertexAccessType = SEQUENTIAL;
> diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> index f149f84..d7a1fd3 100644
> --- a/src/intel/vulkan/anv_blorp.c
> +++ b/src/intel/vulkan/anv_blorp.c
> @@ -182,7 +182,7 @@ void anv_CmdCopyImage(
> ANV_FROM_HANDLE(anv_image, dst_image, dstImage);
>
> struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer);
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
>
> for (unsigned r = 0; r < regionCount; r++) {
> VkOffset3D srcOffset =
> @@ -244,7 +244,7 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer,
> bool buffer_to_image)
> {
> struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer);
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
>
> struct {
> struct blorp_surf surf;
> @@ -404,7 +404,7 @@ void anv_CmdBlitImage(
> }
>
> struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer);
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
>
> for (unsigned r = 0; r < regionCount; r++) {
> const VkImageSubresourceLayers *src_res = &pRegions[r].srcSubresource;
> @@ -575,7 +575,7 @@ void anv_CmdCopyBuffer(
> ANV_FROM_HANDLE(anv_buffer, dst_buffer, dstBuffer);
>
> struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer);
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
>
> for (unsigned r = 0; r < regionCount; r++) {
> uint64_t src_offset = src_buffer->offset + pRegions[r].srcOffset;
> @@ -636,7 +636,7 @@ void anv_CmdUpdateBuffer(
> ANV_FROM_HANDLE(anv_buffer, dst_buffer, dstBuffer);
>
> struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer);
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
>
> /* We can't quite grab a full block because the state stream needs a
> * little data at the top to build its linked list.
> @@ -685,7 +685,7 @@ void anv_CmdFillBuffer(
> struct isl_surf isl_surf;
>
> struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer);
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
>
> if (fillSize == VK_WHOLE_SIZE) {
> fillSize = dst_buffer->size - dstOffset;
> @@ -767,7 +767,7 @@ void anv_CmdClearColorImage(
> static const bool color_write_disable[4] = { false, false, false, false };
>
> struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer);
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
>
> union isl_color_value clear_color;
> memcpy(clear_color.u32, pColor->uint32, sizeof(pColor->uint32));
> @@ -857,7 +857,7 @@ void anv_CmdResolveImage(
> ANV_FROM_HANDLE(anv_image, dst_image, dstImage);
>
> struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer);
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
>
> for (uint32_t r = 0; r < regionCount; r++) {
> assert(pRegions[r].srcSubresource.aspectMask ==
> @@ -902,7 +902,7 @@ anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer)
> return;
>
> struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer);
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
>
> for (uint32_t i = 0; i < subpass->color_count; ++i) {
> uint32_t src_att = subpass->color_attachments[i];
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c b/src/mesa/drivers/dri/i965/brw_blorp.c
> index 23fe3aa..9484574 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp.c
> +++ b/src/mesa/drivers/dri/i965/brw_blorp.c
> @@ -388,7 +388,7 @@ brw_blorp_blit_miptrees(struct brw_context *brw,
> };
>
> struct blorp_batch batch;
> - blorp_batch_init(&brw->blorp, &batch, brw);
> + blorp_batch_init(&brw->blorp, &batch, brw, 0);
> blorp_blit(&batch, &src_surf, src_level,
> physical_to_logical_layer(src_mt, src_layer),
> brw_blorp_to_isl_format(brw, src_format, false), src_isl_swizzle,
> @@ -447,7 +447,7 @@ brw_blorp_copy_miptrees(struct brw_context *brw,
> &dst_level, &tmp_surfs[2]);
>
> struct blorp_batch batch;
> - blorp_batch_init(&brw->blorp, &batch, brw);
> + blorp_batch_init(&brw->blorp, &batch, brw, 0);
> blorp_copy(&batch, &src_surf, src_level, src_layer,
> &dst_surf, dst_level, dst_layer,
> src_x, src_y, dst_x, dst_y, src_width, src_height);
> @@ -852,7 +852,7 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
> irb->mt, irb->mt_level, irb->mt_layer, num_layers);
>
> struct blorp_batch batch;
> - blorp_batch_init(&brw->blorp, &batch, brw);
> + blorp_batch_init(&brw->blorp, &batch, brw, 0);
> blorp_fast_clear(&batch, &surf,
> (enum isl_format)brw->render_target_format[format],
> level, irb_logical_mt_layer(irb), num_layers,
> @@ -872,7 +872,7 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
> memcpy(clear_color.f32, ctx->Color.ClearColor.f, sizeof(float) * 4);
>
> struct blorp_batch batch;
> - blorp_batch_init(&brw->blorp, &batch, brw);
> + blorp_batch_init(&brw->blorp, &batch, brw, 0);
> blorp_clear(&batch, &surf,
> (enum isl_format)brw->render_target_format[format],
> ISL_SWIZZLE_IDENTITY,
> @@ -944,7 +944,7 @@ brw_blorp_resolve_color(struct brw_context *brw, struct intel_mipmap_tree *mt)
> blorp_surf_for_miptree(brw, &surf, mt, true, &level, isl_tmp);
>
> struct blorp_batch batch;
> - blorp_batch_init(&brw->blorp, &batch, brw);
> + blorp_batch_init(&brw->blorp, &batch, brw, 0);
> blorp_ccs_resolve(&batch, &surf,
> brw_blorp_to_isl_format(brw, format, true));
> blorp_batch_finish(&batch);
> @@ -966,7 +966,7 @@ gen6_blorp_hiz_exec(struct brw_context *brw, struct intel_mipmap_tree *mt,
> blorp_surf_for_miptree(brw, &surf, mt, true, &level, isl_tmp);
>
> struct blorp_batch batch;
> - blorp_batch_init(&brw->blorp, &batch, brw);
> + blorp_batch_init(&brw->blorp, &batch, brw, 0);
> blorp_gen6_hiz_op(&batch, &surf, level, layer, op);
> blorp_batch_finish(&batch);
> }
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list