[Mesa-dev] [PATCH 17/22] anv: Use blorp for ClearAttachments
Pohjolainen, Topi
topi.pohjolainen at gmail.com
Wed Oct 12 09:26:05 UTC 2016
On Fri, Oct 07, 2016 at 09:41:15PM -0700, Jason Ekstrand wrote:
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> ---
> src/intel/vulkan/anv_blorp.c | 113 ++++++++++++++++++++++++++++++++++++++
> src/intel/vulkan/anv_meta_clear.c | 24 --------
> 2 files changed, 113 insertions(+), 24 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> index 546737b..4279f62 100644
> --- a/src/intel/vulkan/anv_blorp.c
> +++ b/src/intel/vulkan/anv_blorp.c
> @@ -870,6 +870,119 @@ void anv_CmdClearDepthStencilImage(
> }
>
> static void
> +clear_color_attachment(struct anv_cmd_buffer *cmd_buffer,
> + struct blorp_batch *batch,
> + const VkClearAttachment *attachment,
> + uint32_t rectCount, const VkClearRect *pRects)
> +{
> + const struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
> + const struct anv_subpass *subpass = cmd_buffer->state.subpass;
> + const uint32_t att = attachment->colorAttachment;
> + const struct anv_image_view *iview =
> + fb->attachments[subpass->color_attachments[att]];
> + const struct anv_image *image = iview->image;
> +
> + struct blorp_surf surf;
> + get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT, &surf);
> +
> + union isl_color_value clear_color;
> + memcpy(clear_color.u32, attachment->clearValue.color.uint32,
> + sizeof(clear_color.u32));
> +
> + static const bool color_write_disable[4] = { false, false, false, false };
> +
> + for (uint32_t r = 0; r < rectCount; ++r) {
> + const VkOffset2D offset = pRects[r].rect.offset;
> + const VkExtent2D extent = pRects[r].rect.extent;
> + blorp_clear(batch, &surf, iview->isl.format, iview->isl.swizzle,
> + iview->isl.base_level,
> + iview->isl.base_array_layer + pRects[r].baseArrayLayer,
I'm not that familiar with vulkan yet and looking emit_color_clear() does not
directly tell me if "pRects[r].baseArrayLayer" is relative to the view base
layer. If that is the case then this patch looks good to me:
Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> + pRects[r].layerCount,
> + offset.x, offset.y,
> + offset.x + extent.width, offset.y + extent.height,
> + clear_color, color_write_disable);
> + }
> +}
> +
> +static void
> +clear_depth_stencil_attachment(struct anv_cmd_buffer *cmd_buffer,
> + struct blorp_batch *batch,
> + const VkClearAttachment *attachment,
> + uint32_t rectCount, const VkClearRect *pRects)
> +{
> + const struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
> + const struct anv_subpass *subpass = cmd_buffer->state.subpass;
> + const struct anv_image_view *iview =
> + fb->attachments[subpass->depth_stencil_attachment];
> + const struct anv_image *image = iview->image;
> +
> + bool clear_depth = attachment->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT;
> + bool clear_stencil = attachment->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT;
These two could be const.
> +
> + struct blorp_surf depth, stencil;
> + if (clear_depth) {
> + get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_DEPTH_BIT,
> + &depth);
> + } else {
> + memset(&depth, 0, sizeof(depth));
> + }
> +
> + if (clear_stencil) {
> + get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_STENCIL_BIT,
> + &stencil);
> + } else {
> + memset(&stencil, 0, sizeof(stencil));
> + }
> +
> + for (uint32_t r = 0; r < rectCount; ++r) {
> + const VkOffset2D offset = pRects[r].rect.offset;
> + const VkExtent2D extent = pRects[r].rect.extent;
> + VkClearDepthStencilValue value = attachment->clearValue.depthStencil;
> + blorp_clear_depth_stencil(batch, &depth, &stencil,
> + iview->isl.base_level,
> + iview->isl.base_array_layer +
> + pRects[r].baseArrayLayer,
> + pRects[r].layerCount,
> + offset.x, offset.y,
> + offset.x + extent.width,
> + offset.y + extent.height,
> + clear_depth, value.depth,
> + clear_stencil, value.stencil);
> + }
> +}
> +
> +void anv_CmdClearAttachments(
> + VkCommandBuffer commandBuffer,
> + uint32_t attachmentCount,
> + const VkClearAttachment* pAttachments,
> + uint32_t rectCount,
> + const VkClearRect* pRects)
> +{
> + ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
> +
> + /* Because this gets called within a render pass, we tell blorp not to
> + * trash our depth and stencil buffers.
> + */
> + struct blorp_batch batch;
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer,
> + BLORP_BATCH_NO_EMIT_DEPTH_STENCIL);
> +
> + for (uint32_t a = 0; a < attachmentCount; ++a) {
> + if (pAttachments[a].aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) {
> + clear_color_attachment(cmd_buffer, &batch,
> + &pAttachments[a],
> + rectCount, pRects);
> + } else {
> + clear_depth_stencil_attachment(cmd_buffer, &batch,
> + &pAttachments[a],
> + rectCount, pRects);
> + }
> + }
> +
> + blorp_batch_finish(&batch);
> +}
> +
> +static void
> resolve_image(struct blorp_batch *batch,
> const struct anv_image *src_image,
> uint32_t src_level, uint32_t src_layer,
> diff --git a/src/intel/vulkan/anv_meta_clear.c b/src/intel/vulkan/anv_meta_clear.c
> index ce7f8a7..6802229 100644
> --- a/src/intel/vulkan/anv_meta_clear.c
> +++ b/src/intel/vulkan/anv_meta_clear.c
> @@ -751,27 +751,3 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer *cmd_buffer)
>
> meta_clear_end(&saved_state, cmd_buffer);
> }
> -
> -void anv_CmdClearAttachments(
> - VkCommandBuffer commandBuffer,
> - uint32_t attachmentCount,
> - const VkClearAttachment* pAttachments,
> - uint32_t rectCount,
> - const VkClearRect* pRects)
> -{
> - ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
> - struct anv_meta_saved_state saved_state;
> -
> - meta_clear_begin(&saved_state, cmd_buffer);
> -
> - /* FINISHME: We can do better than this dumb loop. It thrashes too much
> - * state.
> - */
> - for (uint32_t a = 0; a < attachmentCount; ++a) {
> - for (uint32_t r = 0; r < rectCount; ++r) {
> - emit_clear(cmd_buffer, &pAttachments[a], &pRects[r]);
> - }
> - }
> -
> - meta_clear_end(&saved_state, cmd_buffer);
> -}
> --
> 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