From: Nanley Chery Date: Mon, 2 Jan 2017 08:44:08 +0000 (-0800) Subject: anv: Store depth stencil layouts X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=104ce1dbab44f8d11d5dcc90d3f1cc8c466893d8;p=mesa.git anv: Store depth stencil layouts Store the current and requested depth stencil layouts so that we can perform the appropriate HiZ resolves for a given transition while recording a render pass. Signed-off-by: Nanley Chery Reviewed-by: Jason Ekstrand --- diff --git a/src/intel/vulkan/anv_pass.c b/src/intel/vulkan/anv_pass.c index c1c149b48b5..ea86fa9ff28 100644 --- a/src/intel/vulkan/anv_pass.c +++ b/src/intel/vulkan/anv_pass.c @@ -74,6 +74,8 @@ VkResult anv_CreateRenderPass( att->load_op = pCreateInfo->pAttachments[i].loadOp; att->store_op = pCreateInfo->pAttachments[i].storeOp; att->stencil_load_op = pCreateInfo->pAttachments[i].stencilLoadOp; + att->initial_layout = pCreateInfo->pAttachments[i].initialLayout; + att->final_layout = pCreateInfo->pAttachments[i].finalLayout; att->subpass_usage = usages; usages += pass->subpass_count; } @@ -161,6 +163,8 @@ VkResult anv_CreateRenderPass( if (desc->pDepthStencilAttachment) { uint32_t a = desc->pDepthStencilAttachment->attachment; subpass->depth_stencil_attachment = a; + subpass->depth_stencil_layout = + desc->pDepthStencilAttachment->layout; if (a != VK_ATTACHMENT_UNUSED) { pass->attachments[a].usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; @@ -168,6 +172,7 @@ VkResult anv_CreateRenderPass( } } else { subpass->depth_stencil_attachment = VK_ATTACHMENT_UNUSED; + subpass->depth_stencil_layout = VK_IMAGE_LAYOUT_UNDEFINED; } } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 096d9011be0..a4e6cb282b8 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1097,6 +1097,7 @@ struct anv_attachment_state { struct anv_state color_rt_state; struct anv_state input_att_state; + VkImageLayout current_layout; VkImageAspectFlags pending_clear_aspects; bool fast_clear; VkClearValue clear_value; @@ -1733,7 +1734,12 @@ struct anv_subpass { uint32_t color_count; uint32_t * color_attachments; uint32_t * resolve_attachments; + + /* TODO: Consider storing the depth/stencil VkAttachmentReference + * instead of its two structure members (below) individually. + */ uint32_t depth_stencil_attachment; + VkImageLayout depth_stencil_layout; /** Subpass has a depth/stencil self-dependency */ bool has_ds_self_dep; @@ -1750,12 +1756,17 @@ enum anv_subpass_usage { }; struct anv_render_pass_attachment { + /* TODO: Consider using VkAttachmentDescription instead of storing each of + * its members individually. + */ VkFormat format; uint32_t samples; VkImageUsageFlags usage; VkAttachmentLoadOp load_op; VkAttachmentStoreOp store_op; VkAttachmentLoadOp stencil_load_op; + VkImageLayout initial_layout; + VkImageLayout final_layout; /* An array, indexed by subpass id, of how the attachment will be used. */ enum anv_subpass_usage * subpass_usage; diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index fff9bd37c0d..95d0cfc983b 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -480,6 +480,7 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer, } } + state->attachments[i].current_layout = att->initial_layout; state->attachments[i].pending_clear_aspects = clear_aspects; if (clear_aspects) state->attachments[i].clear_value = begin->pClearValues[i];