Path: blob/21.2-virgl/src/vulkan/util/vk_render_pass.c
7132 views
/*1* Copyright © 2020 Valve Corporation2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*/2223#include "vk_alloc.h"24#include "vk_common_entrypoints.h"25#include "vk_device.h"26#include "vk_format.h"27#include "vk_util.h"2829#include "util/log.h"3031static void32translate_references(VkAttachmentReference2 **reference_ptr,33uint32_t reference_count,34const VkAttachmentReference *reference,35const VkRenderPassCreateInfo *pass_info,36bool is_input_attachment)37{38VkAttachmentReference2 *reference2 = *reference_ptr;39*reference_ptr += reference_count;40for (uint32_t i = 0; i < reference_count; i++) {41reference2[i] = (VkAttachmentReference2) {42.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,43.pNext = NULL,44.attachment = reference[i].attachment,45.layout = reference[i].layout,46};4748if (is_input_attachment &&49reference2[i].attachment != VK_ATTACHMENT_UNUSED) {50assert(reference2[i].attachment < pass_info->attachmentCount);51const VkAttachmentDescription *att =52&pass_info->pAttachments[reference2[i].attachment];53reference2[i].aspectMask = vk_format_aspects(att->format);54}55}56}5758VKAPI_ATTR VkResult VKAPI_CALL59vk_common_CreateRenderPass(VkDevice _device,60const VkRenderPassCreateInfo *pCreateInfo,61const VkAllocationCallbacks *pAllocator,62VkRenderPass *pRenderPass)63{64VK_FROM_HANDLE(vk_device, device, _device);6566uint32_t reference_count = 0;67for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {68reference_count += pCreateInfo->pSubpasses[i].inputAttachmentCount;69reference_count += pCreateInfo->pSubpasses[i].colorAttachmentCount;70if (pCreateInfo->pSubpasses[i].pResolveAttachments)71reference_count += pCreateInfo->pSubpasses[i].colorAttachmentCount;72if (pCreateInfo->pSubpasses[i].pDepthStencilAttachment)73reference_count += 1;74}7576VK_MULTIALLOC(ma);77VK_MULTIALLOC_DECL(&ma, VkRenderPassCreateInfo2, create_info, 1);78VK_MULTIALLOC_DECL(&ma, VkSubpassDescription2, subpasses,79pCreateInfo->subpassCount);80VK_MULTIALLOC_DECL(&ma, VkAttachmentDescription2, attachments,81pCreateInfo->attachmentCount);82VK_MULTIALLOC_DECL(&ma, VkSubpassDependency2, dependencies,83pCreateInfo->dependencyCount);84VK_MULTIALLOC_DECL(&ma, VkAttachmentReference2, references,85reference_count);86if (!vk_multialloc_alloc2(&ma, &device->alloc, pAllocator,87VK_SYSTEM_ALLOCATION_SCOPE_COMMAND))88return VK_ERROR_OUT_OF_HOST_MEMORY;8990VkAttachmentReference2 *reference_ptr = references;9192const VkRenderPassMultiviewCreateInfo *multiview_info = NULL;93const VkRenderPassInputAttachmentAspectCreateInfo *aspect_info = NULL;94vk_foreach_struct(ext, pCreateInfo->pNext) {95switch (ext->sType) {96case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:97aspect_info = (const VkRenderPassInputAttachmentAspectCreateInfo *)ext;98/* We don't care about this information */99break;100101case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:102multiview_info = (const VkRenderPassMultiviewCreateInfo*) ext;103break;104105default:106mesa_logd("%s: ignored VkStructureType %u\n", __func__, ext->sType);107break;108}109}110111for (uint32_t i = 0; i < pCreateInfo->attachmentCount; i++) {112attachments[i] = (VkAttachmentDescription2) {113.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,114.pNext = NULL,115.flags = pCreateInfo->pAttachments[i].flags,116.format = pCreateInfo->pAttachments[i].format,117.samples = pCreateInfo->pAttachments[i].samples,118.loadOp = pCreateInfo->pAttachments[i].loadOp,119.storeOp = pCreateInfo->pAttachments[i].storeOp,120.stencilLoadOp = pCreateInfo->pAttachments[i].stencilLoadOp,121.stencilStoreOp = pCreateInfo->pAttachments[i].stencilStoreOp,122.initialLayout = pCreateInfo->pAttachments[i].initialLayout,123.finalLayout = pCreateInfo->pAttachments[i].finalLayout,124};125}126127for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {128subpasses[i] = (VkSubpassDescription2) {129.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,130.pNext = NULL,131.flags = pCreateInfo->pSubpasses[i].flags,132.pipelineBindPoint = pCreateInfo->pSubpasses[i].pipelineBindPoint,133.viewMask = 0,134.inputAttachmentCount = pCreateInfo->pSubpasses[i].inputAttachmentCount,135.colorAttachmentCount = pCreateInfo->pSubpasses[i].colorAttachmentCount,136.preserveAttachmentCount = pCreateInfo->pSubpasses[i].preserveAttachmentCount,137.pPreserveAttachments = pCreateInfo->pSubpasses[i].pPreserveAttachments,138};139140if (multiview_info && multiview_info->subpassCount) {141assert(multiview_info->subpassCount == pCreateInfo->subpassCount);142subpasses[i].viewMask = multiview_info->pViewMasks[i];143}144145subpasses[i].pInputAttachments = reference_ptr;146translate_references(&reference_ptr,147subpasses[i].inputAttachmentCount,148pCreateInfo->pSubpasses[i].pInputAttachments,149pCreateInfo, true);150subpasses[i].pColorAttachments = reference_ptr;151translate_references(&reference_ptr,152subpasses[i].colorAttachmentCount,153pCreateInfo->pSubpasses[i].pColorAttachments,154pCreateInfo, false);155subpasses[i].pResolveAttachments = NULL;156if (pCreateInfo->pSubpasses[i].pResolveAttachments) {157subpasses[i].pResolveAttachments = reference_ptr;158translate_references(&reference_ptr,159subpasses[i].colorAttachmentCount,160pCreateInfo->pSubpasses[i].pResolveAttachments,161pCreateInfo, false);162}163subpasses[i].pDepthStencilAttachment = NULL;164if (pCreateInfo->pSubpasses[i].pDepthStencilAttachment) {165subpasses[i].pDepthStencilAttachment = reference_ptr;166translate_references(&reference_ptr, 1,167pCreateInfo->pSubpasses[i].pDepthStencilAttachment,168pCreateInfo, false);169}170}171172assert(reference_ptr == references + reference_count);173174if (aspect_info != NULL) {175for (uint32_t i = 0; i < aspect_info->aspectReferenceCount; i++) {176const VkInputAttachmentAspectReference *ref =177&aspect_info->pAspectReferences[i];178179assert(ref->subpass < pCreateInfo->subpassCount);180VkSubpassDescription2 *subpass = &subpasses[ref->subpass];181182assert(ref->inputAttachmentIndex < subpass->inputAttachmentCount);183VkAttachmentReference2 *att = (VkAttachmentReference2 *)184&subpass->pInputAttachments[ref->inputAttachmentIndex];185186att->aspectMask = ref->aspectMask;187}188}189190for (uint32_t i = 0; i < pCreateInfo->dependencyCount; i++) {191dependencies[i] = (VkSubpassDependency2) {192.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,193.pNext = NULL,194.srcSubpass = pCreateInfo->pDependencies[i].srcSubpass,195.dstSubpass = pCreateInfo->pDependencies[i].dstSubpass,196.srcStageMask = pCreateInfo->pDependencies[i].srcStageMask,197.dstStageMask = pCreateInfo->pDependencies[i].dstStageMask,198.srcAccessMask = pCreateInfo->pDependencies[i].srcAccessMask,199.dstAccessMask = pCreateInfo->pDependencies[i].dstAccessMask,200.dependencyFlags = pCreateInfo->pDependencies[i].dependencyFlags,201.viewOffset = 0,202};203204if (multiview_info && multiview_info->dependencyCount) {205assert(multiview_info->dependencyCount == pCreateInfo->dependencyCount);206dependencies[i].viewOffset = multiview_info->pViewOffsets[i];207}208}209210*create_info = (VkRenderPassCreateInfo2) {211.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,212.pNext = pCreateInfo->pNext,213.flags = pCreateInfo->flags,214.attachmentCount = pCreateInfo->attachmentCount,215.pAttachments = attachments,216.subpassCount = pCreateInfo->subpassCount,217.pSubpasses = subpasses,218.dependencyCount = pCreateInfo->dependencyCount,219.pDependencies = dependencies,220};221222if (multiview_info && multiview_info->correlationMaskCount > 0) {223create_info->correlatedViewMaskCount = multiview_info->correlationMaskCount;224create_info->pCorrelatedViewMasks = multiview_info->pCorrelationMasks;225}226227VkResult result =228device->dispatch_table.CreateRenderPass2(_device, create_info,229pAllocator, pRenderPass);230231vk_free2(&device->alloc, pAllocator, create_info);232233return result;234}235236VKAPI_ATTR void VKAPI_CALL237vk_common_CmdBeginRenderPass(VkCommandBuffer commandBuffer,238const VkRenderPassBeginInfo* pRenderPassBegin,239VkSubpassContents contents)240{241/* We don't have a vk_command_buffer object but we can assume, since we're242* using common dispatch, that it's a vk_object of some sort.243*/244struct vk_object_base *disp = (struct vk_object_base *)commandBuffer;245246VkSubpassBeginInfo info = {247.sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO,248.contents = contents,249};250251disp->device->dispatch_table.CmdBeginRenderPass2(commandBuffer,252pRenderPassBegin, &info);253}254255VKAPI_ATTR void VKAPI_CALL256vk_common_CmdEndRenderPass(VkCommandBuffer commandBuffer)257{258/* We don't have a vk_command_buffer object but we can assume, since we're259* using common dispatch, that it's a vk_object of some sort.260*/261struct vk_object_base *disp = (struct vk_object_base *)commandBuffer;262263VkSubpassEndInfo info = {264.sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO,265};266267disp->device->dispatch_table.CmdEndRenderPass2(commandBuffer, &info);268}269270VKAPI_ATTR void VKAPI_CALL271vk_common_CmdNextSubpass(VkCommandBuffer commandBuffer,272VkSubpassContents contents)273{274/* We don't have a vk_command_buffer object but we can assume, since we're275* using common dispatch, that it's a vk_object of some sort.276*/277struct vk_object_base *disp = (struct vk_object_base *)commandBuffer;278279VkSubpassBeginInfo begin_info = {280.sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO,281.contents = contents,282};283284VkSubpassEndInfo end_info = {285.sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO,286};287288disp->device->dispatch_table.CmdNextSubpass2(commandBuffer, &begin_info,289&end_info);290}291292293