Mesa (main): dzn: Emit missing transition barriers for rendering attachments
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jun 7 08:26:28 UTC 2022
Module: Mesa
Branch: main
Commit: c06b265ec75dfe311934e2bc52a22b2f17abb680
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c06b265ec75dfe311934e2bc52a22b2f17abb680
Author: Boris Brezillon <boris.brezillon at collabora.com>
Date: Mon May 30 03:00:43 2022 -0700
dzn: Emit missing transition barriers for rendering attachments
VkRenderingAttachmentInitialLayoutInfoMESA provides information about
the initialLayout -> currentLayout that's expected when we begin a
render pass. Let's take it into account.
Fixes: 2d0798440b4 ("dzn: Add support for dynamic rendering")
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16792>
---
src/microsoft/vulkan/dzn_cmd_buffer.c | 50 +++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c b/src/microsoft/vulkan/dzn_cmd_buffer.c
index 7a0ffc4fcb2..cd77b2414c7 100644
--- a/src/microsoft/vulkan/dzn_cmd_buffer.c
+++ b/src/microsoft/vulkan/dzn_cmd_buffer.c
@@ -3355,6 +3355,50 @@ dzn_cmd_buffer_resolve_rendering_attachment(struct dzn_cmd_buffer *cmdbuf,
}
}
+static void
+dzn_rendering_attachment_initial_transition(struct dzn_cmd_buffer *cmdbuf,
+ const VkRenderingAttachmentInfo *att,
+ VkImageAspectFlagBits aspect)
+{
+ const VkRenderingAttachmentInitialLayoutInfoMESA *initial_layout =
+ vk_find_struct_const(att->pNext, RENDERING_ATTACHMENT_INITIAL_LAYOUT_INFO_MESA);
+ VK_FROM_HANDLE(dzn_image_view, iview, att->imageView);
+
+ if (!initial_layout || !iview)
+ return;
+
+ struct dzn_image *image = container_of(iview->vk.image, struct dzn_image, vk);
+
+ D3D12_RESOURCE_BARRIER transition_barrier = {
+ .Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION,
+ .Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE,
+ .Transition = {
+ .pResource = image->res,
+ .StateBefore = dzn_image_layout_to_state(initial_layout->initialLayout, aspect),
+ .StateAfter = dzn_image_layout_to_state(att->imageLayout, aspect),
+ },
+ };
+
+ if (transition_barrier.Transition.StateBefore == transition_barrier.Transition.StateAfter)
+ return;
+
+ const VkImageSubresourceRange range = {
+ .aspectMask = aspect,
+ .baseMipLevel = iview->vk.base_mip_level,
+ .levelCount = iview->vk.level_count,
+ .baseArrayLayer = iview->vk.base_array_layer,
+ .layerCount = iview->vk.layer_count,
+ };
+
+ for (uint32_t layer = 0; layer < iview->vk.layer_count; layer++) {
+ for (uint32_t lvl = 0; lvl < iview->vk.level_count; lvl++) {
+ transition_barrier.Transition.Subresource =
+ dzn_image_range_get_subresource_index(image, &range, aspect, lvl, layer);
+ ID3D12GraphicsCommandList1_ResourceBarrier(cmdbuf->cmdlist, 1, &transition_barrier);
+ }
+ }
+}
+
VKAPI_ATTR void VKAPI_CALL
dzn_CmdBeginRendering(VkCommandBuffer commandBuffer,
const VkRenderingInfo *pRenderingInfo)
@@ -3400,6 +3444,8 @@ dzn_CmdBeginRendering(VkCommandBuffer commandBuffer,
struct dzn_image *img = container_of(iview->vk.image, struct dzn_image, vk);
rt_handles[i] = dzn_cmd_buffer_get_rtv(cmdbuf, img, &iview->rtv_desc);
+ dzn_rendering_attachment_initial_transition(cmdbuf, att,
+ VK_IMAGE_ASPECT_COLOR_BIT);
}
if (pRenderingInfo->pDepthAttachment) {
@@ -3414,6 +3460,8 @@ dzn_CmdBeginRendering(VkCommandBuffer commandBuffer,
cmdbuf->state.render.attachments.depth.resolve.layout =
att->resolveImageLayout;
cmdbuf->state.render.attachments.depth.store_op = att->storeOp;
+ dzn_rendering_attachment_initial_transition(cmdbuf, att,
+ VK_IMAGE_ASPECT_DEPTH_BIT);
}
if (pRenderingInfo->pStencilAttachment) {
@@ -3428,6 +3476,8 @@ dzn_CmdBeginRendering(VkCommandBuffer commandBuffer,
cmdbuf->state.render.attachments.stencil.resolve.layout =
att->resolveImageLayout;
cmdbuf->state.render.attachments.stencil.store_op = att->storeOp;
+ dzn_rendering_attachment_initial_transition(cmdbuf, att,
+ VK_IMAGE_ASPECT_STENCIL_BIT);
}
if (pRenderingInfo->pDepthAttachment || pRenderingInfo->pStencilAttachment) {
More information about the mesa-commit
mailing list