Mesa (main): radv: Support Begin/EndRendering.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sun Dec 5 17:56:09 UTC 2021
Module: Mesa
Branch: main
Commit: 7f3aba37d217085590bd460bd7ff207f193181c6
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7f3aba37d217085590bd460bd7ff207f193181c6
Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date: Mon Nov 8 18:24:06 2021 +0100
radv: Support Begin/EndRendering.
This is just the naive implementation that create a new renderpass
and then destroys it at the end.
I do it this way because in meta operations we are still creating
temporary subpasses for a renderpass for e.g. the resolve.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13721>
---
src/amd/vulkan/radv_cmd_buffer.c | 311 +++++++++++++++++++++++++++++++++++++++
1 file changed, 311 insertions(+)
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index f3fcce1712e..ece4aface68 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -7300,6 +7300,317 @@ radv_CmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pS
radv_cmd_buffer_end_render_pass(cmd_buffer);
}
+VKAPI_ATTR void VKAPI_CALL
+radv_CmdBeginRenderingKHR(VkCommandBuffer commandBuffer, const VkRenderingInfoKHR *pRenderingInfo)
+{
+ RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
+ const VkRenderingFragmentShadingRateAttachmentInfoKHR *vrs_info = vk_find_struct_const(
+ pRenderingInfo->pNext, RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR);
+ VkResult result;
+ /* (normal + resolve) for color attachments and ds and a VRS attachment */
+ VkAttachmentDescription2 att_desc[MAX_RTS * 2 + 3];
+ VkAttachmentDescriptionStencilLayout ds_stencil_att, ds_stencil_resolve_att;
+ VkImageView iviews[MAX_RTS * 2 + 3];
+ VkAttachmentReference2 color_refs[MAX_RTS], color_resolve_refs[MAX_RTS];
+ VkAttachmentReference2 ds_ref, ds_resolve_ref, vrs_ref;
+ VkAttachmentReferenceStencilLayout ds_stencil_ref, ds_stencil_resolve_ref;
+ VkSubpassDescriptionDepthStencilResolve ds_resolve_info;
+ VkFragmentShadingRateAttachmentInfoKHR vrs_subpass_info;
+ VkClearValue clear_values[MAX_RTS * 2 + 3];
+ unsigned att_count = 0;
+
+ VkSubpassDescription2 subpass = {
+ .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,
+ .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
+ .viewMask = pRenderingInfo->viewMask,
+ .colorAttachmentCount = pRenderingInfo->colorAttachmentCount,
+ .pColorAttachments = color_refs,
+ .pResolveAttachments = color_resolve_refs,
+ };
+
+ for (unsigned i = 0; i < pRenderingInfo->colorAttachmentCount; ++i) {
+ color_refs[i] = (VkAttachmentReference2){
+ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ .attachment = VK_ATTACHMENT_UNUSED,
+ };
+ color_resolve_refs[i] = (VkAttachmentReference2){
+ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ .attachment = VK_ATTACHMENT_UNUSED,
+ };
+
+ if (pRenderingInfo->pColorAttachments[i].imageView == VK_NULL_HANDLE)
+ continue;
+
+ const VkRenderingAttachmentInfoKHR *info = &pRenderingInfo->pColorAttachments[i];
+ RADV_FROM_HANDLE(radv_image_view, iview, info->imageView);
+ color_refs[i] = (VkAttachmentReference2){.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ .attachment = att_count,
+ .layout = info->imageLayout,
+ .aspectMask = iview->aspect_mask};
+
+ iviews[att_count] = info->imageView;
+ clear_values[att_count] = info->clearValue;
+ VkAttachmentDescription2 *att = att_desc + att_count++;
+
+ memset(att, 0, sizeof(*att));
+ att->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
+ att->format = iview->vk_format;
+ att->samples = iview->image->info.samples;
+ att->loadOp = info->loadOp;
+ att->storeOp = info->storeOp;
+ att->initialLayout = info->imageLayout;
+ att->finalLayout = info->imageLayout;
+
+ if (pRenderingInfo->flags & VK_RENDERING_RESUMING_BIT_KHR)
+ att->loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
+
+ if (pRenderingInfo->flags & VK_RENDERING_SUSPENDING_BIT_KHR)
+ att->storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+
+ if (info->resolveMode != VK_RESOLVE_MODE_NONE &&
+ !(pRenderingInfo->flags & VK_RENDERING_SUSPENDING_BIT_KHR)) {
+ RADV_FROM_HANDLE(radv_image_view, resolve_iview, info->resolveImageView);
+ color_resolve_refs[i] =
+ (VkAttachmentReference2){.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ .attachment = att_count,
+ .layout = info->resolveImageLayout,
+ .aspectMask = resolve_iview->aspect_mask};
+
+ iviews[att_count] = info->resolveImageView;
+ att = att_desc + att_count++;
+
+ memset(att, 0, sizeof(*att));
+ att->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
+ att->format = resolve_iview->vk_format;
+ att->samples = resolve_iview->image->info.samples;
+ att->loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ att->storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+ att->initialLayout = info->resolveImageLayout;
+ att->finalLayout = info->resolveImageLayout;
+ }
+ }
+
+ if (pRenderingInfo->pDepthAttachment || pRenderingInfo->pStencilAttachment) {
+ const VkRenderingAttachmentInfoKHR *common_info = pRenderingInfo->pDepthAttachment
+ ? pRenderingInfo->pDepthAttachment
+ : pRenderingInfo->pStencilAttachment;
+ RADV_FROM_HANDLE(radv_image_view, iview, common_info->imageView);
+
+ if (common_info->imageView != VK_NULL_HANDLE) {
+ ds_ref = (VkAttachmentReference2){
+ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ .attachment = att_count,
+ .layout = common_info->imageLayout,
+ .aspectMask = (pRenderingInfo->pDepthAttachment ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) |
+ (pRenderingInfo->pStencilAttachment ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)};
+ subpass.pDepthStencilAttachment = &ds_ref;
+
+ iviews[att_count] = common_info->imageView;
+ if (pRenderingInfo->pDepthAttachment)
+ clear_values[att_count].depthStencil.depth =
+ pRenderingInfo->pDepthAttachment->clearValue.depthStencil.depth;
+ if (pRenderingInfo->pStencilAttachment)
+ clear_values[att_count].depthStencil.stencil =
+ pRenderingInfo->pStencilAttachment->clearValue.depthStencil.stencil;
+ VkAttachmentDescription2 *att = att_desc + att_count++;
+
+ memset(att, 0, sizeof(*att));
+ att->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
+ att->format = iview->vk_format;
+ att->samples = iview->image->info.samples;
+
+ if (pRenderingInfo->pDepthAttachment) {
+ att->loadOp = pRenderingInfo->pDepthAttachment->loadOp;
+ att->storeOp = pRenderingInfo->pDepthAttachment->storeOp;
+ } else {
+ att->loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
+ att->storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+ }
+
+ if (pRenderingInfo->pStencilAttachment) {
+ att->stencilLoadOp = pRenderingInfo->pStencilAttachment->loadOp;
+ att->stencilStoreOp = pRenderingInfo->pStencilAttachment->storeOp;
+ } else {
+ att->stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
+ att->stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
+ }
+ att->initialLayout = common_info->imageLayout;
+ att->finalLayout = common_info->imageLayout;
+
+ if (pRenderingInfo->pDepthAttachment && pRenderingInfo->pStencilAttachment) {
+ ds_ref.pNext = &ds_stencil_ref;
+ ds_stencil_ref = (VkAttachmentReferenceStencilLayout){
+ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT,
+ .stencilLayout = pRenderingInfo->pStencilAttachment->imageLayout};
+
+ att->pNext = &ds_stencil_att;
+ ds_stencil_att = (VkAttachmentDescriptionStencilLayout){
+ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT,
+ .stencilInitialLayout = pRenderingInfo->pStencilAttachment->imageLayout,
+ .stencilFinalLayout = pRenderingInfo->pStencilAttachment->imageLayout,
+ };
+ }
+
+ if ((pRenderingInfo->pDepthAttachment &&
+ pRenderingInfo->pDepthAttachment->resolveMode != VK_RESOLVE_MODE_NONE) ||
+ (pRenderingInfo->pStencilAttachment &&
+ pRenderingInfo->pStencilAttachment->resolveMode != VK_RESOLVE_MODE_NONE)) {
+ RADV_FROM_HANDLE(radv_image_view, resolve_iview, common_info->resolveImageView);
+ ds_resolve_ref =
+ (VkAttachmentReference2){.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ .attachment = att_count,
+ .layout = common_info->resolveImageLayout,
+ .aspectMask = resolve_iview->aspect_mask};
+
+ iviews[att_count] = common_info->resolveImageView;
+ att = att_desc + att_count++;
+
+ memset(att, 0, sizeof(*att));
+ att->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
+ att->format = resolve_iview->vk_format;
+ att->samples = resolve_iview->image->info.samples;
+ att->loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ att->storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+ att->initialLayout = common_info->resolveImageLayout;
+ att->finalLayout = common_info->resolveImageLayout;
+
+ ds_resolve_info = (VkSubpassDescriptionDepthStencilResolve){
+ .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE,
+ .pNext = subpass.pNext,
+ .depthResolveMode =
+ (pRenderingInfo->pDepthAttachment &&
+ pRenderingInfo->pDepthAttachment->resolveMode != VK_RESOLVE_MODE_NONE)
+ ? pRenderingInfo->pDepthAttachment->resolveMode
+ : VK_RESOLVE_MODE_NONE,
+ .stencilResolveMode =
+ (pRenderingInfo->pStencilAttachment &&
+ pRenderingInfo->pStencilAttachment->resolveMode != VK_RESOLVE_MODE_NONE)
+ ? pRenderingInfo->pStencilAttachment->resolveMode
+ : VK_RESOLVE_MODE_NONE,
+ .pDepthStencilResolveAttachment = &ds_resolve_ref};
+ subpass.pNext = &ds_resolve_info;
+
+ if (pRenderingInfo->pDepthAttachment && pRenderingInfo->pStencilAttachment &&
+ pRenderingInfo->pDepthAttachment->resolveMode != VK_RESOLVE_MODE_NONE &&
+ pRenderingInfo->pStencilAttachment->resolveMode != VK_RESOLVE_MODE_NONE) {
+ ds_resolve_ref.pNext = &ds_stencil_resolve_ref;
+ ds_stencil_resolve_ref = (VkAttachmentReferenceStencilLayout){
+ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT,
+ .stencilLayout = pRenderingInfo->pStencilAttachment->resolveImageLayout};
+
+ att->pNext = &ds_stencil_resolve_att;
+ ds_stencil_resolve_att = (VkAttachmentDescriptionStencilLayout){
+ .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT,
+ .stencilInitialLayout = pRenderingInfo->pStencilAttachment->resolveImageLayout,
+ .stencilFinalLayout = pRenderingInfo->pStencilAttachment->resolveImageLayout,
+ };
+ }
+ }
+ }
+ }
+
+ if (vrs_info && vrs_info->imageView) {
+ RADV_FROM_HANDLE(radv_image_view, iview, vrs_info->imageView);
+ vrs_ref = (VkAttachmentReference2){.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
+ .attachment = att_count,
+ .layout = vrs_info->imageLayout,
+ .aspectMask = iview->aspect_mask};
+
+ iviews[att_count] = vrs_info->imageView;
+ VkAttachmentDescription2 *att = att_desc + att_count++;
+
+ memset(att, 0, sizeof(*att));
+ att->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
+ att->format = iview->vk_format;
+ att->samples = iview->image->info.samples;
+ att->loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
+ att->storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ att->initialLayout = vrs_info->imageLayout;
+ att->finalLayout = vrs_info->imageLayout;
+
+ vrs_subpass_info = (VkFragmentShadingRateAttachmentInfoKHR){
+ .sType = VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR,
+ .pNext = subpass.pNext,
+ .pFragmentShadingRateAttachment = &vrs_ref,
+ .shadingRateAttachmentTexelSize = vrs_info->shadingRateAttachmentTexelSize,
+ };
+ subpass.pNext = &vrs_subpass_info;
+ }
+
+ VkRenderPassCreateInfo2 rp_create_info = {
+ .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,
+ .attachmentCount = att_count,
+ .pAttachments = att_desc,
+ .subpassCount = 1,
+ .pSubpasses = &subpass,
+ };
+
+ VkRenderPass rp;
+ result =
+ radv_CreateRenderPass2(radv_device_to_handle(cmd_buffer->device), &rp_create_info, NULL, &rp);
+ if (result != VK_SUCCESS) {
+ cmd_buffer->record_result = result;
+ return;
+ }
+
+ unsigned w = MAX_FRAMEBUFFER_WIDTH;
+ unsigned h = MAX_FRAMEBUFFER_HEIGHT;
+ for (unsigned i = 0; i < att_count; ++i) {
+ RADV_FROM_HANDLE(radv_image_view, iview, iviews[i]);
+ w = MIN2(w, iview->extent.width);
+ h = MIN2(h, iview->extent.height);
+ }
+ VkFramebufferCreateInfo fb_create_info = {
+ .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
+ .renderPass = rp,
+ .attachmentCount = att_count,
+ .pAttachments = iviews,
+ .width = w,
+ .height = h,
+ .layers = pRenderingInfo->layerCount,
+ };
+
+ VkFramebuffer fb;
+ result =
+ radv_CreateFramebuffer(radv_device_to_handle(cmd_buffer->device), &fb_create_info, NULL, &fb);
+ if (result != VK_SUCCESS) {
+ radv_DestroyRenderPass(radv_device_to_handle(cmd_buffer->device), rp, NULL);
+ cmd_buffer->record_result = result;
+ return;
+ }
+
+ VkRenderPassBeginInfo begin_info = {.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
+ .renderPass = rp,
+ .framebuffer = fb,
+ .renderArea = pRenderingInfo->renderArea,
+ .clearValueCount = att_count,
+ .pClearValues = clear_values};
+
+ const VkSubpassBeginInfo pass_begin_info = {
+ .sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO,
+ .contents = (pRenderingInfo->flags & VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR)
+ ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS
+ : VK_SUBPASS_CONTENTS_INLINE,
+ };
+
+ radv_CmdBeginRenderPass2(commandBuffer, &begin_info, &pass_begin_info);
+}
+
+VKAPI_ATTR void VKAPI_CALL
+radv_CmdEndRenderingKHR(VkCommandBuffer commandBuffer)
+{
+ RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
+ struct radv_render_pass *pass = cmd_buffer->state.pass;
+ struct radv_framebuffer *framebuffer = cmd_buffer->state.framebuffer;
+
+ radv_CmdEndRenderPass2(commandBuffer, NULL);
+
+ radv_DestroyFramebuffer(radv_device_to_handle(cmd_buffer->device),
+ radv_framebuffer_to_handle(framebuffer), NULL);
+ radv_DestroyRenderPass(radv_device_to_handle(cmd_buffer->device),
+ radv_render_pass_to_handle(pass), NULL);
+}
+
/*
* For HTILE we have the following interesting clear words:
* 0xfffff30f: Uncompressed, full depth range, for depth+stencil HTILE
More information about the mesa-commit
mailing list