xref: /aosp_15_r20/external/vulkan-validation-layers/layers/convert_to_renderpass2.cpp (revision b7893ccf7851cd6a48cc5a1e965257d8a5cdcc70)
1*b7893ccfSSadaf Ebrahimi /* Copyright (c) 2015-2018 The Khronos Group Inc.
2*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2018 Valve Corporation
3*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2018 LunarG, Inc.
4*b7893ccfSSadaf Ebrahimi  * Copyright (C) 2015-2018 Google Inc.
5*b7893ccfSSadaf Ebrahimi  *
6*b7893ccfSSadaf Ebrahimi  * Licensed under the Apache License, Version 2.0 (the "License");
7*b7893ccfSSadaf Ebrahimi  * you may not use this file except in compliance with the License.
8*b7893ccfSSadaf Ebrahimi  * You may obtain a copy of the License at
9*b7893ccfSSadaf Ebrahimi  *
10*b7893ccfSSadaf Ebrahimi  *     http://www.apache.org/licenses/LICENSE-2.0
11*b7893ccfSSadaf Ebrahimi  *
12*b7893ccfSSadaf Ebrahimi  * Unless required by applicable law or agreed to in writing, software
13*b7893ccfSSadaf Ebrahimi  * distributed under the License is distributed on an "AS IS" BASIS,
14*b7893ccfSSadaf Ebrahimi  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*b7893ccfSSadaf Ebrahimi  * See the License for the specific language governing permissions and
16*b7893ccfSSadaf Ebrahimi  * limitations under the License.
17*b7893ccfSSadaf Ebrahimi  *
18*b7893ccfSSadaf Ebrahimi  * Author: Tobias Hector <@tobski>
19*b7893ccfSSadaf Ebrahimi  */
20*b7893ccfSSadaf Ebrahimi 
21*b7893ccfSSadaf Ebrahimi #include <string.h>
22*b7893ccfSSadaf Ebrahimi 
23*b7893ccfSSadaf Ebrahimi #include "convert_to_renderpass2.h"
24*b7893ccfSSadaf Ebrahimi #include "vk_typemap_helper.h"
25*b7893ccfSSadaf Ebrahimi #include "vk_format_utils.h"
26*b7893ccfSSadaf Ebrahimi 
ConvertVkAttachmentReferenceToV2KHR(const VkAttachmentReference * in_struct,safe_VkAttachmentReference2KHR * out_struct)27*b7893ccfSSadaf Ebrahimi static void ConvertVkAttachmentReferenceToV2KHR(const VkAttachmentReference* in_struct,
28*b7893ccfSSadaf Ebrahimi                                                 safe_VkAttachmentReference2KHR* out_struct) {
29*b7893ccfSSadaf Ebrahimi     out_struct->sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
30*b7893ccfSSadaf Ebrahimi     out_struct->pNext = nullptr;
31*b7893ccfSSadaf Ebrahimi     out_struct->attachment = in_struct->attachment;
32*b7893ccfSSadaf Ebrahimi     out_struct->layout = in_struct->layout;
33*b7893ccfSSadaf Ebrahimi     out_struct->aspectMask =
34*b7893ccfSSadaf Ebrahimi         VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM;  // Uninitialized - must be filled in by top level struct for input attachments
35*b7893ccfSSadaf Ebrahimi }
36*b7893ccfSSadaf Ebrahimi 
ConvertVkSubpassDependencyToV2KHR(const VkSubpassDependency * in_struct,safe_VkSubpassDependency2KHR * out_struct)37*b7893ccfSSadaf Ebrahimi static void ConvertVkSubpassDependencyToV2KHR(const VkSubpassDependency* in_struct, safe_VkSubpassDependency2KHR* out_struct) {
38*b7893ccfSSadaf Ebrahimi     out_struct->sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR;
39*b7893ccfSSadaf Ebrahimi     out_struct->pNext = nullptr;
40*b7893ccfSSadaf Ebrahimi     out_struct->srcSubpass = in_struct->srcSubpass;
41*b7893ccfSSadaf Ebrahimi     out_struct->dstSubpass = in_struct->dstSubpass;
42*b7893ccfSSadaf Ebrahimi     out_struct->srcStageMask = in_struct->srcStageMask;
43*b7893ccfSSadaf Ebrahimi     out_struct->dstStageMask = in_struct->dstStageMask;
44*b7893ccfSSadaf Ebrahimi     out_struct->srcAccessMask = in_struct->srcAccessMask;
45*b7893ccfSSadaf Ebrahimi     out_struct->dstAccessMask = in_struct->dstAccessMask;
46*b7893ccfSSadaf Ebrahimi     out_struct->dependencyFlags = in_struct->dependencyFlags;
47*b7893ccfSSadaf Ebrahimi     out_struct->viewOffset = 0;
48*b7893ccfSSadaf Ebrahimi }
49*b7893ccfSSadaf Ebrahimi 
ConvertVkSubpassDescriptionToV2KHR(const VkSubpassDescription * in_struct,safe_VkSubpassDescription2KHR * out_struct)50*b7893ccfSSadaf Ebrahimi static void ConvertVkSubpassDescriptionToV2KHR(const VkSubpassDescription* in_struct, safe_VkSubpassDescription2KHR* out_struct) {
51*b7893ccfSSadaf Ebrahimi     out_struct->sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR;
52*b7893ccfSSadaf Ebrahimi     out_struct->pNext = nullptr;
53*b7893ccfSSadaf Ebrahimi     out_struct->flags = in_struct->flags;
54*b7893ccfSSadaf Ebrahimi     out_struct->pipelineBindPoint = in_struct->pipelineBindPoint;
55*b7893ccfSSadaf Ebrahimi     out_struct->viewMask = 0;
56*b7893ccfSSadaf Ebrahimi     out_struct->inputAttachmentCount = in_struct->inputAttachmentCount;
57*b7893ccfSSadaf Ebrahimi     out_struct->pInputAttachments = nullptr;
58*b7893ccfSSadaf Ebrahimi     out_struct->colorAttachmentCount = in_struct->colorAttachmentCount;
59*b7893ccfSSadaf Ebrahimi     out_struct->pColorAttachments = nullptr;
60*b7893ccfSSadaf Ebrahimi     out_struct->pResolveAttachments = nullptr;
61*b7893ccfSSadaf Ebrahimi     out_struct->preserveAttachmentCount = in_struct->preserveAttachmentCount;
62*b7893ccfSSadaf Ebrahimi     out_struct->pPreserveAttachments = nullptr;
63*b7893ccfSSadaf Ebrahimi 
64*b7893ccfSSadaf Ebrahimi     if (out_struct->inputAttachmentCount && in_struct->pInputAttachments) {
65*b7893ccfSSadaf Ebrahimi         out_struct->pInputAttachments = new safe_VkAttachmentReference2KHR[out_struct->inputAttachmentCount];
66*b7893ccfSSadaf Ebrahimi         for (uint32_t i = 0; i < out_struct->inputAttachmentCount; ++i) {
67*b7893ccfSSadaf Ebrahimi             ConvertVkAttachmentReferenceToV2KHR(&in_struct->pInputAttachments[i], &out_struct->pInputAttachments[i]);
68*b7893ccfSSadaf Ebrahimi         }
69*b7893ccfSSadaf Ebrahimi     }
70*b7893ccfSSadaf Ebrahimi     if (out_struct->colorAttachmentCount && in_struct->pColorAttachments) {
71*b7893ccfSSadaf Ebrahimi         out_struct->pColorAttachments = new safe_VkAttachmentReference2KHR[out_struct->colorAttachmentCount];
72*b7893ccfSSadaf Ebrahimi         for (uint32_t i = 0; i < out_struct->colorAttachmentCount; ++i) {
73*b7893ccfSSadaf Ebrahimi             ConvertVkAttachmentReferenceToV2KHR(&in_struct->pColorAttachments[i], &out_struct->pColorAttachments[i]);
74*b7893ccfSSadaf Ebrahimi         }
75*b7893ccfSSadaf Ebrahimi     }
76*b7893ccfSSadaf Ebrahimi     if (out_struct->colorAttachmentCount && in_struct->pResolveAttachments) {
77*b7893ccfSSadaf Ebrahimi         out_struct->pResolveAttachments = new safe_VkAttachmentReference2KHR[out_struct->colorAttachmentCount];
78*b7893ccfSSadaf Ebrahimi         for (uint32_t i = 0; i < out_struct->colorAttachmentCount; ++i) {
79*b7893ccfSSadaf Ebrahimi             ConvertVkAttachmentReferenceToV2KHR(&in_struct->pResolveAttachments[i], &out_struct->pResolveAttachments[i]);
80*b7893ccfSSadaf Ebrahimi         }
81*b7893ccfSSadaf Ebrahimi     }
82*b7893ccfSSadaf Ebrahimi     if (in_struct->pDepthStencilAttachment) {
83*b7893ccfSSadaf Ebrahimi         out_struct->pDepthStencilAttachment = new safe_VkAttachmentReference2KHR();
84*b7893ccfSSadaf Ebrahimi         ConvertVkAttachmentReferenceToV2KHR(in_struct->pDepthStencilAttachment, out_struct->pDepthStencilAttachment);
85*b7893ccfSSadaf Ebrahimi     } else {
86*b7893ccfSSadaf Ebrahimi         out_struct->pDepthStencilAttachment = NULL;
87*b7893ccfSSadaf Ebrahimi     }
88*b7893ccfSSadaf Ebrahimi     if (in_struct->pPreserveAttachments) {
89*b7893ccfSSadaf Ebrahimi         out_struct->pPreserveAttachments = new uint32_t[in_struct->preserveAttachmentCount];
90*b7893ccfSSadaf Ebrahimi         memcpy((void*)out_struct->pPreserveAttachments, (void*)in_struct->pPreserveAttachments,
91*b7893ccfSSadaf Ebrahimi                sizeof(uint32_t) * in_struct->preserveAttachmentCount);
92*b7893ccfSSadaf Ebrahimi     }
93*b7893ccfSSadaf Ebrahimi }
94*b7893ccfSSadaf Ebrahimi 
ConvertVkAttachmentDescriptionToV2KHR(const VkAttachmentDescription * in_struct,safe_VkAttachmentDescription2KHR * out_struct)95*b7893ccfSSadaf Ebrahimi static void ConvertVkAttachmentDescriptionToV2KHR(const VkAttachmentDescription* in_struct,
96*b7893ccfSSadaf Ebrahimi                                                   safe_VkAttachmentDescription2KHR* out_struct) {
97*b7893ccfSSadaf Ebrahimi     out_struct->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR;
98*b7893ccfSSadaf Ebrahimi     out_struct->pNext = nullptr;
99*b7893ccfSSadaf Ebrahimi     out_struct->flags = in_struct->flags;
100*b7893ccfSSadaf Ebrahimi     out_struct->format = in_struct->format;
101*b7893ccfSSadaf Ebrahimi     out_struct->samples = in_struct->samples;
102*b7893ccfSSadaf Ebrahimi     out_struct->loadOp = in_struct->loadOp;
103*b7893ccfSSadaf Ebrahimi     out_struct->storeOp = in_struct->storeOp;
104*b7893ccfSSadaf Ebrahimi     out_struct->stencilLoadOp = in_struct->stencilLoadOp;
105*b7893ccfSSadaf Ebrahimi     out_struct->stencilStoreOp = in_struct->stencilStoreOp;
106*b7893ccfSSadaf Ebrahimi     out_struct->initialLayout = in_struct->initialLayout;
107*b7893ccfSSadaf Ebrahimi     out_struct->finalLayout = in_struct->finalLayout;
108*b7893ccfSSadaf Ebrahimi }
109*b7893ccfSSadaf Ebrahimi 
ConvertVkRenderPassCreateInfoToV2KHR(const VkRenderPassCreateInfo * in_struct,safe_VkRenderPassCreateInfo2KHR * out_struct)110*b7893ccfSSadaf Ebrahimi void ConvertVkRenderPassCreateInfoToV2KHR(const VkRenderPassCreateInfo* in_struct, safe_VkRenderPassCreateInfo2KHR* out_struct) {
111*b7893ccfSSadaf Ebrahimi     out_struct->sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR;
112*b7893ccfSSadaf Ebrahimi     out_struct->pNext = nullptr;
113*b7893ccfSSadaf Ebrahimi     out_struct->flags = in_struct->flags;
114*b7893ccfSSadaf Ebrahimi     out_struct->attachmentCount = in_struct->attachmentCount;
115*b7893ccfSSadaf Ebrahimi     out_struct->pAttachments = nullptr;
116*b7893ccfSSadaf Ebrahimi     out_struct->subpassCount = in_struct->subpassCount;
117*b7893ccfSSadaf Ebrahimi     out_struct->pSubpasses = nullptr;
118*b7893ccfSSadaf Ebrahimi     out_struct->dependencyCount = in_struct->dependencyCount;
119*b7893ccfSSadaf Ebrahimi     out_struct->pDependencies = nullptr;
120*b7893ccfSSadaf Ebrahimi     out_struct->correlatedViewMaskCount = 0;
121*b7893ccfSSadaf Ebrahimi     out_struct->pCorrelatedViewMasks = nullptr;
122*b7893ccfSSadaf Ebrahimi     if (out_struct->attachmentCount && in_struct->pAttachments) {
123*b7893ccfSSadaf Ebrahimi         out_struct->pAttachments = new safe_VkAttachmentDescription2KHR[out_struct->attachmentCount];
124*b7893ccfSSadaf Ebrahimi         for (uint32_t i = 0; i < out_struct->attachmentCount; ++i) {
125*b7893ccfSSadaf Ebrahimi             ConvertVkAttachmentDescriptionToV2KHR(&in_struct->pAttachments[i], &out_struct->pAttachments[i]);
126*b7893ccfSSadaf Ebrahimi         }
127*b7893ccfSSadaf Ebrahimi     }
128*b7893ccfSSadaf Ebrahimi     if (out_struct->subpassCount && in_struct->pSubpasses) {
129*b7893ccfSSadaf Ebrahimi         out_struct->pSubpasses = new safe_VkSubpassDescription2KHR[out_struct->subpassCount];
130*b7893ccfSSadaf Ebrahimi         for (uint32_t i = 0; i < out_struct->subpassCount; ++i) {
131*b7893ccfSSadaf Ebrahimi             ConvertVkSubpassDescriptionToV2KHR(&in_struct->pSubpasses[i], &out_struct->pSubpasses[i]);
132*b7893ccfSSadaf Ebrahimi         }
133*b7893ccfSSadaf Ebrahimi     }
134*b7893ccfSSadaf Ebrahimi     if (out_struct->dependencyCount && in_struct->pDependencies) {
135*b7893ccfSSadaf Ebrahimi         out_struct->pDependencies = new safe_VkSubpassDependency2KHR[out_struct->dependencyCount];
136*b7893ccfSSadaf Ebrahimi         for (uint32_t i = 0; i < out_struct->dependencyCount; ++i) {
137*b7893ccfSSadaf Ebrahimi             ConvertVkSubpassDependencyToV2KHR(&in_struct->pDependencies[i], &out_struct->pDependencies[i]);
138*b7893ccfSSadaf Ebrahimi         }
139*b7893ccfSSadaf Ebrahimi     }
140*b7893ccfSSadaf Ebrahimi 
141*b7893ccfSSadaf Ebrahimi     // Handle extension structs from KHR_multiview and KHR_maintenance2 to fill out the "filled in" bits.
142*b7893ccfSSadaf Ebrahimi     if (in_struct->pNext) {
143*b7893ccfSSadaf Ebrahimi         const VkRenderPassMultiviewCreateInfo* pMultiviewInfo =
144*b7893ccfSSadaf Ebrahimi             lvl_find_in_chain<VkRenderPassMultiviewCreateInfo>(in_struct->pNext);
145*b7893ccfSSadaf Ebrahimi         if (pMultiviewInfo) {
146*b7893ccfSSadaf Ebrahimi             for (uint32_t subpass = 0; subpass < pMultiviewInfo->subpassCount; ++subpass) {
147*b7893ccfSSadaf Ebrahimi                 if (subpass < in_struct->subpassCount) {
148*b7893ccfSSadaf Ebrahimi                     out_struct->pSubpasses[subpass].viewMask = pMultiviewInfo->pViewMasks[subpass];
149*b7893ccfSSadaf Ebrahimi                 }
150*b7893ccfSSadaf Ebrahimi             }
151*b7893ccfSSadaf Ebrahimi             for (uint32_t dependency = 0; dependency < pMultiviewInfo->dependencyCount; ++dependency) {
152*b7893ccfSSadaf Ebrahimi                 if (dependency < in_struct->dependencyCount) {
153*b7893ccfSSadaf Ebrahimi                     out_struct->pDependencies[dependency].viewOffset = pMultiviewInfo->pViewOffsets[dependency];
154*b7893ccfSSadaf Ebrahimi                 }
155*b7893ccfSSadaf Ebrahimi             }
156*b7893ccfSSadaf Ebrahimi             if (pMultiviewInfo->correlationMaskCount) {
157*b7893ccfSSadaf Ebrahimi                 out_struct->correlatedViewMaskCount = pMultiviewInfo->correlationMaskCount;
158*b7893ccfSSadaf Ebrahimi                 uint32_t* pCorrelatedViewMasks = new uint32_t[out_struct->correlatedViewMaskCount];
159*b7893ccfSSadaf Ebrahimi                 for (uint32_t correlationMask = 0; correlationMask < pMultiviewInfo->correlationMaskCount; ++correlationMask) {
160*b7893ccfSSadaf Ebrahimi                     pCorrelatedViewMasks[correlationMask] = pMultiviewInfo->pCorrelationMasks[correlationMask];
161*b7893ccfSSadaf Ebrahimi                 }
162*b7893ccfSSadaf Ebrahimi                 out_struct->pCorrelatedViewMasks = pCorrelatedViewMasks;
163*b7893ccfSSadaf Ebrahimi             }
164*b7893ccfSSadaf Ebrahimi         }
165*b7893ccfSSadaf Ebrahimi         const VkRenderPassInputAttachmentAspectCreateInfo* pInputAttachmentAspectInfo =
166*b7893ccfSSadaf Ebrahimi             lvl_find_in_chain<VkRenderPassInputAttachmentAspectCreateInfo>(in_struct->pNext);
167*b7893ccfSSadaf Ebrahimi         if (pInputAttachmentAspectInfo) {
168*b7893ccfSSadaf Ebrahimi             for (uint32_t i = 0; i < pInputAttachmentAspectInfo->aspectReferenceCount; ++i) {
169*b7893ccfSSadaf Ebrahimi                 uint32_t subpass = pInputAttachmentAspectInfo->pAspectReferences[i].subpass;
170*b7893ccfSSadaf Ebrahimi                 uint32_t attachment = pInputAttachmentAspectInfo->pAspectReferences[i].inputAttachmentIndex;
171*b7893ccfSSadaf Ebrahimi                 VkImageAspectFlags aspectMask = pInputAttachmentAspectInfo->pAspectReferences[i].aspectMask;
172*b7893ccfSSadaf Ebrahimi                 if (subpass < in_struct->subpassCount && attachment < in_struct->pSubpasses[subpass].inputAttachmentCount) {
173*b7893ccfSSadaf Ebrahimi                     out_struct->pSubpasses[subpass].pInputAttachments[attachment].aspectMask = aspectMask;
174*b7893ccfSSadaf Ebrahimi                 }
175*b7893ccfSSadaf Ebrahimi             }
176*b7893ccfSSadaf Ebrahimi         }
177*b7893ccfSSadaf Ebrahimi     }
178*b7893ccfSSadaf Ebrahimi 
179*b7893ccfSSadaf Ebrahimi     if (out_struct->subpassCount && out_struct->pSubpasses) {
180*b7893ccfSSadaf Ebrahimi         for (uint32_t i = 0; i < out_struct->subpassCount; ++i) {
181*b7893ccfSSadaf Ebrahimi             if (out_struct->pSubpasses[i].inputAttachmentCount && out_struct->pSubpasses[i].pInputAttachments) {
182*b7893ccfSSadaf Ebrahimi                 for (uint32_t j = 0; j < out_struct->pSubpasses[i].inputAttachmentCount; ++j) {
183*b7893ccfSSadaf Ebrahimi                     safe_VkAttachmentReference2KHR& attachment_ref = out_struct->pSubpasses[i].pInputAttachments[j];
184*b7893ccfSSadaf Ebrahimi                     if (attachment_ref.aspectMask == VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM &&
185*b7893ccfSSadaf Ebrahimi                         attachment_ref.attachment < out_struct->attachmentCount && out_struct->pAttachments) {
186*b7893ccfSSadaf Ebrahimi                         attachment_ref.aspectMask = 0;
187*b7893ccfSSadaf Ebrahimi                         VkFormat attachmentFormat = out_struct->pAttachments[attachment_ref.attachment].format;
188*b7893ccfSSadaf Ebrahimi                         if (FormatIsColor(attachmentFormat)) {
189*b7893ccfSSadaf Ebrahimi                             attachment_ref.aspectMask |= VK_IMAGE_ASPECT_COLOR_BIT;
190*b7893ccfSSadaf Ebrahimi                         }
191*b7893ccfSSadaf Ebrahimi                         if (FormatHasDepth(attachmentFormat)) {
192*b7893ccfSSadaf Ebrahimi                             attachment_ref.aspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;
193*b7893ccfSSadaf Ebrahimi                         }
194*b7893ccfSSadaf Ebrahimi                         if (FormatHasStencil(attachmentFormat)) {
195*b7893ccfSSadaf Ebrahimi                             attachment_ref.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
196*b7893ccfSSadaf Ebrahimi                         }
197*b7893ccfSSadaf Ebrahimi                     }
198*b7893ccfSSadaf Ebrahimi                 }
199*b7893ccfSSadaf Ebrahimi             }
200*b7893ccfSSadaf Ebrahimi         }
201*b7893ccfSSadaf Ebrahimi     }
202*b7893ccfSSadaf Ebrahimi }
203