blob: 5f234b2327015b1b115f3e35c48ba6a686e2b498 [file] [log] [blame]
Tony-LunarG73719992020-01-15 10:20:28 -07001/* Copyright (c) 2015-2020 The Khronos Group Inc.
2 * Copyright (c) 2015-2020 Valve Corporation
3 * Copyright (c) 2015-2020 LunarG, Inc.
4 * Copyright (C) 2015-2020 Google Inc.
Tobias Hectorbbb12282018-10-22 15:17:59 +01005 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * Author: Tobias Hector <@tobski>
19 */
20
Tobias Hectorbbb12282018-10-22 15:17:59 +010021#include "convert_to_renderpass2.h"
Petr Krauscbabebd2019-08-24 02:40:41 +020022
23#include <vector>
24
Tobias Hectorbbb12282018-10-22 15:17:59 +010025#include "vk_format_utils.h"
Petr Krauscbabebd2019-08-24 02:40:41 +020026#include "vk_typemap_helper.h"
Tobias Hectorbbb12282018-10-22 15:17:59 +010027
Mike Schuchardtf6f00492019-10-21 23:35:17 -070028static safe_VkAttachmentDescription2 ToV2KHR(const VkAttachmentDescription& in_struct) {
29 safe_VkAttachmentDescription2 v2;
Mike Schuchardt2df08912020-12-15 16:28:09 -080030 v2.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
Petr Krauscbabebd2019-08-24 02:40:41 +020031 v2.pNext = nullptr;
32 v2.flags = in_struct.flags;
33 v2.format = in_struct.format;
34 v2.samples = in_struct.samples;
35 v2.loadOp = in_struct.loadOp;
36 v2.storeOp = in_struct.storeOp;
37 v2.stencilLoadOp = in_struct.stencilLoadOp;
38 v2.stencilStoreOp = in_struct.stencilStoreOp;
39 v2.initialLayout = in_struct.initialLayout;
40 v2.finalLayout = in_struct.finalLayout;
41
42 return v2;
Tobias Hectorbbb12282018-10-22 15:17:59 +010043}
44
Mike Schuchardtf6f00492019-10-21 23:35:17 -070045static safe_VkAttachmentReference2 ToV2KHR(const VkAttachmentReference& in_struct, const VkImageAspectFlags aspectMask = 0) {
46 safe_VkAttachmentReference2 v2;
Mike Schuchardt2df08912020-12-15 16:28:09 -080047 v2.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2;
Petr Krauscbabebd2019-08-24 02:40:41 +020048 v2.pNext = nullptr;
49 v2.attachment = in_struct.attachment;
50 v2.layout = in_struct.layout;
51 v2.aspectMask = aspectMask;
52
53 return v2;
Tobias Hectorbbb12282018-10-22 15:17:59 +010054}
55
Mike Schuchardtf6f00492019-10-21 23:35:17 -070056static safe_VkSubpassDescription2 ToV2KHR(const VkSubpassDescription& in_struct, const uint32_t viewMask,
57 const VkImageAspectFlags* input_attachment_aspect_masks) {
58 safe_VkSubpassDescription2 v2;
Mike Schuchardt2df08912020-12-15 16:28:09 -080059 v2.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2;
Petr Krauscbabebd2019-08-24 02:40:41 +020060 v2.pNext = nullptr;
61 v2.flags = in_struct.flags;
62 v2.pipelineBindPoint = in_struct.pipelineBindPoint;
63 v2.viewMask = viewMask;
64 v2.inputAttachmentCount = in_struct.inputAttachmentCount;
65 v2.pInputAttachments = nullptr; // to be filled
66 v2.colorAttachmentCount = in_struct.colorAttachmentCount;
67 v2.pColorAttachments = nullptr; // to be filled
68 v2.pResolveAttachments = nullptr; // to be filled
69 v2.pDepthStencilAttachment = nullptr; // to be filled
70 v2.preserveAttachmentCount = in_struct.preserveAttachmentCount;
71 v2.pPreserveAttachments = nullptr; // to be filled
Tobias Hectorbbb12282018-10-22 15:17:59 +010072
Petr Krauscbabebd2019-08-24 02:40:41 +020073 if (v2.inputAttachmentCount && in_struct.pInputAttachments) {
Mike Schuchardtf6f00492019-10-21 23:35:17 -070074 v2.pInputAttachments = new safe_VkAttachmentReference2[v2.inputAttachmentCount];
Petr Krauscbabebd2019-08-24 02:40:41 +020075 for (uint32_t i = 0; i < v2.inputAttachmentCount; ++i) {
76 v2.pInputAttachments[i] = ToV2KHR(in_struct.pInputAttachments[i], input_attachment_aspect_masks[i]);
Tobias Hectorbbb12282018-10-22 15:17:59 +010077 }
78 }
Petr Krauscbabebd2019-08-24 02:40:41 +020079 if (v2.colorAttachmentCount && in_struct.pColorAttachments) {
Mike Schuchardtf6f00492019-10-21 23:35:17 -070080 v2.pColorAttachments = new safe_VkAttachmentReference2[v2.colorAttachmentCount];
Petr Krauscbabebd2019-08-24 02:40:41 +020081 for (uint32_t i = 0; i < v2.colorAttachmentCount; ++i) {
82 v2.pColorAttachments[i] = ToV2KHR(in_struct.pColorAttachments[i]);
Tobias Hectorbbb12282018-10-22 15:17:59 +010083 }
84 }
Petr Krauscbabebd2019-08-24 02:40:41 +020085 if (v2.colorAttachmentCount && in_struct.pResolveAttachments) {
Mike Schuchardtf6f00492019-10-21 23:35:17 -070086 v2.pResolveAttachments = new safe_VkAttachmentReference2[v2.colorAttachmentCount];
Petr Krauscbabebd2019-08-24 02:40:41 +020087 for (uint32_t i = 0; i < v2.colorAttachmentCount; ++i) {
88 v2.pResolveAttachments[i] = ToV2KHR(in_struct.pResolveAttachments[i]);
Tobias Hectorbbb12282018-10-22 15:17:59 +010089 }
90 }
Petr Krauscbabebd2019-08-24 02:40:41 +020091 if (in_struct.pDepthStencilAttachment) {
Mike Schuchardtf6f00492019-10-21 23:35:17 -070092 v2.pDepthStencilAttachment = new safe_VkAttachmentReference2();
Petr Krauscbabebd2019-08-24 02:40:41 +020093 *v2.pDepthStencilAttachment = ToV2KHR(*in_struct.pDepthStencilAttachment);
Tobias Hectorbbb12282018-10-22 15:17:59 +010094 }
Petr Krauscbabebd2019-08-24 02:40:41 +020095 if (v2.preserveAttachmentCount && in_struct.pPreserveAttachments) {
96 auto preserve_attachments = new uint32_t[v2.preserveAttachmentCount];
97 for (uint32_t i = 0; i < v2.preserveAttachmentCount; ++i) {
98 preserve_attachments[i] = in_struct.pPreserveAttachments[i];
99 }
100 v2.pPreserveAttachments = preserve_attachments;
Tobias Hectorbbb12282018-10-22 15:17:59 +0100101 }
Petr Krauscbabebd2019-08-24 02:40:41 +0200102
103 return v2;
Tobias Hectorbbb12282018-10-22 15:17:59 +0100104}
105
Mike Schuchardtf6f00492019-10-21 23:35:17 -0700106static safe_VkSubpassDependency2 ToV2KHR(const VkSubpassDependency& in_struct, int32_t viewOffset = 0) {
107 safe_VkSubpassDependency2 v2;
Mike Schuchardt2df08912020-12-15 16:28:09 -0800108 v2.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2;
Petr Krauscbabebd2019-08-24 02:40:41 +0200109 v2.pNext = nullptr;
110 v2.srcSubpass = in_struct.srcSubpass;
111 v2.dstSubpass = in_struct.dstSubpass;
112 v2.srcStageMask = in_struct.srcStageMask;
113 v2.dstStageMask = in_struct.dstStageMask;
114 v2.srcAccessMask = in_struct.srcAccessMask;
115 v2.dstAccessMask = in_struct.dstAccessMask;
116 v2.dependencyFlags = in_struct.dependencyFlags;
117 v2.viewOffset = viewOffset;
118
119 return v2;
Tobias Hectorbbb12282018-10-22 15:17:59 +0100120}
121
Mike Schuchardtf6f00492019-10-21 23:35:17 -0700122void ConvertVkRenderPassCreateInfoToV2KHR(const VkRenderPassCreateInfo& in_struct, safe_VkRenderPassCreateInfo2* out_struct) {
Petr Krauscbabebd2019-08-24 02:40:41 +0200123 using std::vector;
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700124 const auto multiview_info = LvlFindInChain<VkRenderPassMultiviewCreateInfo>(in_struct.pNext);
125 const auto* input_attachment_aspect_info = LvlFindInChain<VkRenderPassInputAttachmentAspectCreateInfo>(in_struct.pNext);
126 const auto fragment_density_map_info = LvlFindInChain<VkRenderPassFragmentDensityMapCreateInfoEXT>(in_struct.pNext);
Petr Krauscbabebd2019-08-24 02:40:41 +0200127
Mike Schuchardtf6f00492019-10-21 23:35:17 -0700128 out_struct->~safe_VkRenderPassCreateInfo2();
Mike Schuchardt2df08912020-12-15 16:28:09 -0800129 out_struct->sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2;
Mark Lobodzinski799a92b2020-08-17 16:35:14 -0600130
131 // Fixup RPCI2 pNext chain. Only FDM2 is valid on both chains.
132 if (fragment_density_map_info) {
133 out_struct->pNext = SafePnextCopy(fragment_density_map_info);
134 auto base_struct = reinterpret_cast<const VkBaseOutStructure*>(out_struct->pNext);
135 const_cast<VkBaseOutStructure*>(base_struct)->pNext = nullptr;
136 } else {
137 out_struct->pNext = nullptr;
138 }
139
Petr Krauscbabebd2019-08-24 02:40:41 +0200140 out_struct->flags = in_struct.flags;
141 out_struct->attachmentCount = in_struct.attachmentCount;
142 out_struct->pAttachments = nullptr; // to be filled
143 out_struct->subpassCount = in_struct.subpassCount;
144 out_struct->pSubpasses = nullptr; // to be filled
145 out_struct->dependencyCount = in_struct.dependencyCount;
146 out_struct->pDependencies = nullptr; // to be filled
147 out_struct->correlatedViewMaskCount = multiview_info ? multiview_info->correlationMaskCount : 0;
148 out_struct->pCorrelatedViewMasks = nullptr; // to be filled
149
150 // TODO: This should support VkRenderPassFragmentDensityMapCreateInfoEXT somehow
151 // see https://github.com/KhronosGroup/Vulkan-Docs/issues/1027
152
153 if (out_struct->attachmentCount && in_struct.pAttachments) {
Mike Schuchardtf6f00492019-10-21 23:35:17 -0700154 out_struct->pAttachments = new safe_VkAttachmentDescription2[out_struct->attachmentCount];
Tobias Hectorbbb12282018-10-22 15:17:59 +0100155 for (uint32_t i = 0; i < out_struct->attachmentCount; ++i) {
Petr Krauscbabebd2019-08-24 02:40:41 +0200156 out_struct->pAttachments[i] = ToV2KHR(in_struct.pAttachments[i]);
Tobias Hectorbbb12282018-10-22 15:17:59 +0100157 }
158 }
Petr Krauscbabebd2019-08-24 02:40:41 +0200159
160 // translate VkRenderPassInputAttachmentAspectCreateInfo into vector
161 vector<vector<VkImageAspectFlags>> input_attachment_aspect_masks(out_struct->subpassCount);
162 // set defaults
163 for (uint32_t si = 0; si < out_struct->subpassCount; ++si) {
164 if (in_struct.pSubpasses) {
165 input_attachment_aspect_masks[si].resize(in_struct.pSubpasses[si].inputAttachmentCount, 0);
166
167 for (uint32_t iai = 0; iai < in_struct.pSubpasses[si].inputAttachmentCount; ++iai) {
168 if (out_struct->pAttachments && in_struct.pSubpasses[si].pInputAttachments) {
169 const auto& input_attachment = in_struct.pSubpasses[si].pInputAttachments[iai];
Tony-LunarGf563bc72019-12-18 11:33:37 -0700170 if (input_attachment.attachment != VK_ATTACHMENT_UNUSED) {
171 const auto format = out_struct->pAttachments[input_attachment.attachment].format;
Petr Krauscbabebd2019-08-24 02:40:41 +0200172
Tony-LunarGf563bc72019-12-18 11:33:37 -0700173 if (FormatIsColor(format)) input_attachment_aspect_masks[si][iai] |= VK_IMAGE_ASPECT_COLOR_BIT;
174 if (FormatHasDepth(format)) input_attachment_aspect_masks[si][iai] |= VK_IMAGE_ASPECT_DEPTH_BIT;
175 if (FormatHasStencil(format)) input_attachment_aspect_masks[si][iai] |= VK_IMAGE_ASPECT_STENCIL_BIT;
176 if (FormatPlaneCount(format) > 1) {
177 input_attachment_aspect_masks[si][iai] |= VK_IMAGE_ASPECT_PLANE_0_BIT;
178 input_attachment_aspect_masks[si][iai] |= VK_IMAGE_ASPECT_PLANE_1_BIT;
179 }
180 if (FormatPlaneCount(format) > 2) input_attachment_aspect_masks[si][iai] |= VK_IMAGE_ASPECT_PLANE_2_BIT;
Petr Krauscbabebd2019-08-24 02:40:41 +0200181 }
Petr Krauscbabebd2019-08-24 02:40:41 +0200182 }
183 }
184 }
185 }
186 // translate VkRenderPassInputAttachmentAspectCreateInfo
187 if (input_attachment_aspect_info && input_attachment_aspect_info->pAspectReferences) {
188 for (uint32_t i = 0; i < input_attachment_aspect_info->aspectReferenceCount; ++i) {
189 const uint32_t subpass = input_attachment_aspect_info->pAspectReferences[i].subpass;
190 const uint32_t input_attachment = input_attachment_aspect_info->pAspectReferences[i].inputAttachmentIndex;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -0700191 const VkImageAspectFlags aspect_mask = input_attachment_aspect_info->pAspectReferences[i].aspectMask;
Petr Krauscbabebd2019-08-24 02:40:41 +0200192
193 if (subpass < input_attachment_aspect_masks.size() &&
194 input_attachment < input_attachment_aspect_masks[subpass].size()) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -0700195 input_attachment_aspect_masks[subpass][input_attachment] = aspect_mask;
Petr Krauscbabebd2019-08-24 02:40:41 +0200196 }
197 }
198 }
199
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -0700200 const bool has_view_mask = multiview_info && multiview_info->subpassCount && multiview_info->pViewMasks;
Petr Krauscbabebd2019-08-24 02:40:41 +0200201 if (out_struct->subpassCount && in_struct.pSubpasses) {
Mike Schuchardtf6f00492019-10-21 23:35:17 -0700202 out_struct->pSubpasses = new safe_VkSubpassDescription2[out_struct->subpassCount];
Tobias Hectorbbb12282018-10-22 15:17:59 +0100203 for (uint32_t i = 0; i < out_struct->subpassCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -0700204 const uint32_t view_mask = has_view_mask ? multiview_info->pViewMasks[i] : 0;
205 out_struct->pSubpasses[i] = ToV2KHR(in_struct.pSubpasses[i], view_mask, input_attachment_aspect_masks[i].data());
Tobias Hectorbbb12282018-10-22 15:17:59 +0100206 }
207 }
Petr Krauscbabebd2019-08-24 02:40:41 +0200208
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -0700209 const bool has_view_offset = multiview_info && multiview_info->dependencyCount && multiview_info->pViewOffsets;
Petr Krauscbabebd2019-08-24 02:40:41 +0200210 if (out_struct->dependencyCount && in_struct.pDependencies) {
Mike Schuchardtf6f00492019-10-21 23:35:17 -0700211 out_struct->pDependencies = new safe_VkSubpassDependency2[out_struct->dependencyCount];
Tobias Hectorbbb12282018-10-22 15:17:59 +0100212 for (uint32_t i = 0; i < out_struct->dependencyCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -0700213 const int32_t view_offset = has_view_offset ? multiview_info->pViewOffsets[i] : 0;
214 out_struct->pDependencies[i] = ToV2KHR(in_struct.pDependencies[i], view_offset);
Tobias Hectorbbb12282018-10-22 15:17:59 +0100215 }
216 }
217
Petr Krauscbabebd2019-08-24 02:40:41 +0200218 if (out_struct->correlatedViewMaskCount && multiview_info->pCorrelationMasks) {
219 auto correlated_view_masks = new uint32_t[out_struct->correlatedViewMaskCount];
220 for (uint32_t i = 0; i < out_struct->correlatedViewMaskCount; ++i) {
221 correlated_view_masks[i] = multiview_info->pCorrelationMasks[i];
Tobias Hectorbbb12282018-10-22 15:17:59 +0100222 }
Petr Krauscbabebd2019-08-24 02:40:41 +0200223 out_struct->pCorrelatedViewMasks = correlated_view_masks;
Tobias Hectorbbb12282018-10-22 15:17:59 +0100224 }
225}