1 /* Copyright (c) 2015-2018 The Khronos Group Inc. 2 * Copyright (c) 2015-2018 Valve Corporation 3 * Copyright (c) 2015-2018 LunarG, Inc. 4 * Copyright (C) 2015-2018 Google Inc. 5 * 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 21 #include <string.h> 22 23 #include "convert_to_renderpass2.h" 24 #include "vk_typemap_helper.h" 25 #include "vk_format_utils.h" 26 27 static void ConvertVkAttachmentReferenceToV2KHR(const VkAttachmentReference* in_struct, 28 safe_VkAttachmentReference2KHR* out_struct) { 29 out_struct->sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR; 30 out_struct->pNext = nullptr; 31 out_struct->attachment = in_struct->attachment; 32 out_struct->layout = in_struct->layout; 33 out_struct->aspectMask = 34 VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM; // Uninitialized - must be filled in by top level struct for input attachments 35 } 36 37 static void ConvertVkSubpassDependencyToV2KHR(const VkSubpassDependency* in_struct, safe_VkSubpassDependency2KHR* out_struct) { 38 out_struct->sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR; 39 out_struct->pNext = nullptr; 40 out_struct->srcSubpass = in_struct->srcSubpass; 41 out_struct->dstSubpass = in_struct->dstSubpass; 42 out_struct->srcStageMask = in_struct->srcStageMask; 43 out_struct->dstStageMask = in_struct->dstStageMask; 44 out_struct->srcAccessMask = in_struct->srcAccessMask; 45 out_struct->dstAccessMask = in_struct->dstAccessMask; 46 out_struct->dependencyFlags = in_struct->dependencyFlags; 47 out_struct->viewOffset = 0; 48 } 49 50 static void ConvertVkSubpassDescriptionToV2KHR(const VkSubpassDescription* in_struct, safe_VkSubpassDescription2KHR* out_struct) { 51 out_struct->sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR; 52 out_struct->pNext = nullptr; 53 out_struct->flags = in_struct->flags; 54 out_struct->pipelineBindPoint = in_struct->pipelineBindPoint; 55 out_struct->viewMask = 0; 56 out_struct->inputAttachmentCount = in_struct->inputAttachmentCount; 57 out_struct->pInputAttachments = nullptr; 58 out_struct->colorAttachmentCount = in_struct->colorAttachmentCount; 59 out_struct->pColorAttachments = nullptr; 60 out_struct->pResolveAttachments = nullptr; 61 out_struct->preserveAttachmentCount = in_struct->preserveAttachmentCount; 62 out_struct->pPreserveAttachments = nullptr; 63 64 if (out_struct->inputAttachmentCount && in_struct->pInputAttachments) { 65 out_struct->pInputAttachments = new safe_VkAttachmentReference2KHR[out_struct->inputAttachmentCount]; 66 for (uint32_t i = 0; i < out_struct->inputAttachmentCount; ++i) { 67 ConvertVkAttachmentReferenceToV2KHR(&in_struct->pInputAttachments[i], &out_struct->pInputAttachments[i]); 68 } 69 } 70 if (out_struct->colorAttachmentCount && in_struct->pColorAttachments) { 71 out_struct->pColorAttachments = new safe_VkAttachmentReference2KHR[out_struct->colorAttachmentCount]; 72 for (uint32_t i = 0; i < out_struct->colorAttachmentCount; ++i) { 73 ConvertVkAttachmentReferenceToV2KHR(&in_struct->pColorAttachments[i], &out_struct->pColorAttachments[i]); 74 } 75 } 76 if (out_struct->colorAttachmentCount && in_struct->pResolveAttachments) { 77 out_struct->pResolveAttachments = new safe_VkAttachmentReference2KHR[out_struct->colorAttachmentCount]; 78 for (uint32_t i = 0; i < out_struct->colorAttachmentCount; ++i) { 79 ConvertVkAttachmentReferenceToV2KHR(&in_struct->pResolveAttachments[i], &out_struct->pResolveAttachments[i]); 80 } 81 } 82 if (in_struct->pDepthStencilAttachment) { 83 out_struct->pDepthStencilAttachment = new safe_VkAttachmentReference2KHR(); 84 ConvertVkAttachmentReferenceToV2KHR(in_struct->pDepthStencilAttachment, out_struct->pDepthStencilAttachment); 85 } else { 86 out_struct->pDepthStencilAttachment = NULL; 87 } 88 if (in_struct->pPreserveAttachments) { 89 out_struct->pPreserveAttachments = new uint32_t[in_struct->preserveAttachmentCount]; 90 memcpy((void*)out_struct->pPreserveAttachments, (void*)in_struct->pPreserveAttachments, 91 sizeof(uint32_t) * in_struct->preserveAttachmentCount); 92 } 93 } 94 95 static void ConvertVkAttachmentDescriptionToV2KHR(const VkAttachmentDescription* in_struct, 96 safe_VkAttachmentDescription2KHR* out_struct) { 97 out_struct->sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR; 98 out_struct->pNext = nullptr; 99 out_struct->flags = in_struct->flags; 100 out_struct->format = in_struct->format; 101 out_struct->samples = in_struct->samples; 102 out_struct->loadOp = in_struct->loadOp; 103 out_struct->storeOp = in_struct->storeOp; 104 out_struct->stencilLoadOp = in_struct->stencilLoadOp; 105 out_struct->stencilStoreOp = in_struct->stencilStoreOp; 106 out_struct->initialLayout = in_struct->initialLayout; 107 out_struct->finalLayout = in_struct->finalLayout; 108 } 109 110 void ConvertVkRenderPassCreateInfoToV2KHR(const VkRenderPassCreateInfo* in_struct, safe_VkRenderPassCreateInfo2KHR* out_struct) { 111 out_struct->sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR; 112 out_struct->pNext = nullptr; 113 out_struct->flags = in_struct->flags; 114 out_struct->attachmentCount = in_struct->attachmentCount; 115 out_struct->pAttachments = nullptr; 116 out_struct->subpassCount = in_struct->subpassCount; 117 out_struct->pSubpasses = nullptr; 118 out_struct->dependencyCount = in_struct->dependencyCount; 119 out_struct->pDependencies = nullptr; 120 out_struct->correlatedViewMaskCount = 0; 121 out_struct->pCorrelatedViewMasks = nullptr; 122 if (out_struct->attachmentCount && in_struct->pAttachments) { 123 out_struct->pAttachments = new safe_VkAttachmentDescription2KHR[out_struct->attachmentCount]; 124 for (uint32_t i = 0; i < out_struct->attachmentCount; ++i) { 125 ConvertVkAttachmentDescriptionToV2KHR(&in_struct->pAttachments[i], &out_struct->pAttachments[i]); 126 } 127 } 128 if (out_struct->subpassCount && in_struct->pSubpasses) { 129 out_struct->pSubpasses = new safe_VkSubpassDescription2KHR[out_struct->subpassCount]; 130 for (uint32_t i = 0; i < out_struct->subpassCount; ++i) { 131 ConvertVkSubpassDescriptionToV2KHR(&in_struct->pSubpasses[i], &out_struct->pSubpasses[i]); 132 } 133 } 134 if (out_struct->dependencyCount && in_struct->pDependencies) { 135 out_struct->pDependencies = new safe_VkSubpassDependency2KHR[out_struct->dependencyCount]; 136 for (uint32_t i = 0; i < out_struct->dependencyCount; ++i) { 137 ConvertVkSubpassDependencyToV2KHR(&in_struct->pDependencies[i], &out_struct->pDependencies[i]); 138 } 139 } 140 141 // Handle extension structs from KHR_multiview and KHR_maintenance2 to fill out the "filled in" bits. 142 if (in_struct->pNext) { 143 const VkRenderPassMultiviewCreateInfo* pMultiviewInfo = 144 lvl_find_in_chain<VkRenderPassMultiviewCreateInfo>(in_struct->pNext); 145 if (pMultiviewInfo) { 146 for (uint32_t subpass = 0; subpass < pMultiviewInfo->subpassCount; ++subpass) { 147 if (subpass < in_struct->subpassCount) { 148 out_struct->pSubpasses[subpass].viewMask = pMultiviewInfo->pViewMasks[subpass]; 149 } 150 } 151 for (uint32_t dependency = 0; dependency < pMultiviewInfo->dependencyCount; ++dependency) { 152 if (dependency < in_struct->dependencyCount) { 153 out_struct->pDependencies[dependency].viewOffset = pMultiviewInfo->pViewOffsets[dependency]; 154 } 155 } 156 if (pMultiviewInfo->correlationMaskCount) { 157 out_struct->correlatedViewMaskCount = pMultiviewInfo->correlationMaskCount; 158 uint32_t* pCorrelatedViewMasks = new uint32_t[out_struct->correlatedViewMaskCount]; 159 for (uint32_t correlationMask = 0; correlationMask < pMultiviewInfo->correlationMaskCount; ++correlationMask) { 160 pCorrelatedViewMasks[correlationMask] = pMultiviewInfo->pCorrelationMasks[correlationMask]; 161 } 162 out_struct->pCorrelatedViewMasks = pCorrelatedViewMasks; 163 } 164 } 165 const VkRenderPassInputAttachmentAspectCreateInfo* pInputAttachmentAspectInfo = 166 lvl_find_in_chain<VkRenderPassInputAttachmentAspectCreateInfo>(in_struct->pNext); 167 if (pInputAttachmentAspectInfo) { 168 for (uint32_t i = 0; i < pInputAttachmentAspectInfo->aspectReferenceCount; ++i) { 169 uint32_t subpass = pInputAttachmentAspectInfo->pAspectReferences[i].subpass; 170 uint32_t attachment = pInputAttachmentAspectInfo->pAspectReferences[i].inputAttachmentIndex; 171 VkImageAspectFlags aspectMask = pInputAttachmentAspectInfo->pAspectReferences[i].aspectMask; 172 if (subpass < in_struct->subpassCount && attachment < in_struct->pSubpasses[subpass].inputAttachmentCount) { 173 out_struct->pSubpasses[subpass].pInputAttachments[attachment].aspectMask = aspectMask; 174 } 175 } 176 } 177 } 178 179 if (out_struct->subpassCount && out_struct->pSubpasses) { 180 for (uint32_t i = 0; i < out_struct->subpassCount; ++i) { 181 if (out_struct->pSubpasses[i].inputAttachmentCount && out_struct->pSubpasses[i].pInputAttachments) { 182 for (uint32_t j = 0; j < out_struct->pSubpasses[i].inputAttachmentCount; ++j) { 183 safe_VkAttachmentReference2KHR& attachment_ref = out_struct->pSubpasses[i].pInputAttachments[j]; 184 if (attachment_ref.aspectMask == VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM && 185 attachment_ref.attachment < out_struct->attachmentCount && out_struct->pAttachments) { 186 attachment_ref.aspectMask = 0; 187 VkFormat attachmentFormat = out_struct->pAttachments[attachment_ref.attachment].format; 188 if (FormatIsColor(attachmentFormat)) { 189 attachment_ref.aspectMask |= VK_IMAGE_ASPECT_COLOR_BIT; 190 } 191 if (FormatHasDepth(attachmentFormat)) { 192 attachment_ref.aspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT; 193 } 194 if (FormatHasStencil(attachmentFormat)) { 195 attachment_ref.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; 196 } 197 } 198 } 199 } 200 } 201 } 202 } 203