1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2021 The SwiftShader Authors. All Rights Reserved. 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*03ce13f7SAndroid Build Coastguard Worker // 7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 8*03ce13f7SAndroid Build Coastguard Worker // 9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License. 14*03ce13f7SAndroid Build Coastguard Worker 15*03ce13f7SAndroid Build Coastguard Worker #ifndef VK_STRUCT_CONVERSION_HPP_ 16*03ce13f7SAndroid Build Coastguard Worker #define VK_STRUCT_CONVERSION_HPP_ 17*03ce13f7SAndroid Build Coastguard Worker 18*03ce13f7SAndroid Build Coastguard Worker #include "VkMemory.hpp" 19*03ce13f7SAndroid Build Coastguard Worker #include "VkStringify.hpp" 20*03ce13f7SAndroid Build Coastguard Worker 21*03ce13f7SAndroid Build Coastguard Worker #include "System/Debug.hpp" 22*03ce13f7SAndroid Build Coastguard Worker 23*03ce13f7SAndroid Build Coastguard Worker #include <cstring> 24*03ce13f7SAndroid Build Coastguard Worker #include <vector> 25*03ce13f7SAndroid Build Coastguard Worker 26*03ce13f7SAndroid Build Coastguard Worker namespace vk { 27*03ce13f7SAndroid Build Coastguard Worker 28*03ce13f7SAndroid Build Coastguard Worker struct CopyBufferInfo : public VkCopyBufferInfo2 29*03ce13f7SAndroid Build Coastguard Worker { CopyBufferInfovk::CopyBufferInfo30*03ce13f7SAndroid Build Coastguard Worker CopyBufferInfo(VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy *pRegions) 31*03ce13f7SAndroid Build Coastguard Worker : VkCopyBufferInfo2{ 32*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2, 33*03ce13f7SAndroid Build Coastguard Worker nullptr, 34*03ce13f7SAndroid Build Coastguard Worker srcBuffer, 35*03ce13f7SAndroid Build Coastguard Worker dstBuffer, 36*03ce13f7SAndroid Build Coastguard Worker regionCount, 37*03ce13f7SAndroid Build Coastguard Worker nullptr 38*03ce13f7SAndroid Build Coastguard Worker } 39*03ce13f7SAndroid Build Coastguard Worker { 40*03ce13f7SAndroid Build Coastguard Worker regions.resize(regionCount); 41*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < regionCount; i++) 42*03ce13f7SAndroid Build Coastguard Worker { 43*03ce13f7SAndroid Build Coastguard Worker regions[i] = { 44*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_BUFFER_COPY_2, 45*03ce13f7SAndroid Build Coastguard Worker nullptr, 46*03ce13f7SAndroid Build Coastguard Worker pRegions[i].srcOffset, 47*03ce13f7SAndroid Build Coastguard Worker pRegions[i].dstOffset, 48*03ce13f7SAndroid Build Coastguard Worker pRegions[i].size 49*03ce13f7SAndroid Build Coastguard Worker }; 50*03ce13f7SAndroid Build Coastguard Worker } 51*03ce13f7SAndroid Build Coastguard Worker 52*03ce13f7SAndroid Build Coastguard Worker this->pRegions = ®ions.front(); 53*03ce13f7SAndroid Build Coastguard Worker } 54*03ce13f7SAndroid Build Coastguard Worker 55*03ce13f7SAndroid Build Coastguard Worker private: 56*03ce13f7SAndroid Build Coastguard Worker std::vector<VkBufferCopy2> regions; 57*03ce13f7SAndroid Build Coastguard Worker }; 58*03ce13f7SAndroid Build Coastguard Worker 59*03ce13f7SAndroid Build Coastguard Worker struct CopyImageInfo : public VkCopyImageInfo2 60*03ce13f7SAndroid Build Coastguard Worker { CopyImageInfovk::CopyImageInfo61*03ce13f7SAndroid Build Coastguard Worker CopyImageInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) 62*03ce13f7SAndroid Build Coastguard Worker : VkCopyImageInfo2{ 63*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2, 64*03ce13f7SAndroid Build Coastguard Worker nullptr, 65*03ce13f7SAndroid Build Coastguard Worker srcImage, 66*03ce13f7SAndroid Build Coastguard Worker srcImageLayout, 67*03ce13f7SAndroid Build Coastguard Worker dstImage, 68*03ce13f7SAndroid Build Coastguard Worker dstImageLayout, 69*03ce13f7SAndroid Build Coastguard Worker regionCount, 70*03ce13f7SAndroid Build Coastguard Worker nullptr 71*03ce13f7SAndroid Build Coastguard Worker } 72*03ce13f7SAndroid Build Coastguard Worker { 73*03ce13f7SAndroid Build Coastguard Worker regions.resize(regionCount); 74*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < regionCount; i++) 75*03ce13f7SAndroid Build Coastguard Worker { 76*03ce13f7SAndroid Build Coastguard Worker regions[i] = { 77*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_IMAGE_COPY_2, 78*03ce13f7SAndroid Build Coastguard Worker nullptr, 79*03ce13f7SAndroid Build Coastguard Worker pRegions[i].srcSubresource, 80*03ce13f7SAndroid Build Coastguard Worker pRegions[i].srcOffset, 81*03ce13f7SAndroid Build Coastguard Worker pRegions[i].dstSubresource, 82*03ce13f7SAndroid Build Coastguard Worker pRegions[i].dstOffset, 83*03ce13f7SAndroid Build Coastguard Worker pRegions[i].extent 84*03ce13f7SAndroid Build Coastguard Worker }; 85*03ce13f7SAndroid Build Coastguard Worker } 86*03ce13f7SAndroid Build Coastguard Worker 87*03ce13f7SAndroid Build Coastguard Worker this->pRegions = ®ions.front(); 88*03ce13f7SAndroid Build Coastguard Worker } 89*03ce13f7SAndroid Build Coastguard Worker 90*03ce13f7SAndroid Build Coastguard Worker private: 91*03ce13f7SAndroid Build Coastguard Worker std::vector<VkImageCopy2> regions; 92*03ce13f7SAndroid Build Coastguard Worker }; 93*03ce13f7SAndroid Build Coastguard Worker 94*03ce13f7SAndroid Build Coastguard Worker struct BlitImageInfo : public VkBlitImageInfo2 95*03ce13f7SAndroid Build Coastguard Worker { BlitImageInfovk::BlitImageInfo96*03ce13f7SAndroid Build Coastguard Worker BlitImageInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) 97*03ce13f7SAndroid Build Coastguard Worker : VkBlitImageInfo2{ 98*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2, 99*03ce13f7SAndroid Build Coastguard Worker nullptr, 100*03ce13f7SAndroid Build Coastguard Worker srcImage, 101*03ce13f7SAndroid Build Coastguard Worker srcImageLayout, 102*03ce13f7SAndroid Build Coastguard Worker dstImage, 103*03ce13f7SAndroid Build Coastguard Worker dstImageLayout, 104*03ce13f7SAndroid Build Coastguard Worker regionCount, 105*03ce13f7SAndroid Build Coastguard Worker nullptr, 106*03ce13f7SAndroid Build Coastguard Worker filter 107*03ce13f7SAndroid Build Coastguard Worker } 108*03ce13f7SAndroid Build Coastguard Worker { 109*03ce13f7SAndroid Build Coastguard Worker regions.resize(regionCount); 110*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < regionCount; i++) 111*03ce13f7SAndroid Build Coastguard Worker { 112*03ce13f7SAndroid Build Coastguard Worker regions[i] = { 113*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_IMAGE_BLIT_2, 114*03ce13f7SAndroid Build Coastguard Worker nullptr, 115*03ce13f7SAndroid Build Coastguard Worker pRegions[i].srcSubresource, 116*03ce13f7SAndroid Build Coastguard Worker { pRegions[i].srcOffsets[0], pRegions[i].srcOffsets[1] }, 117*03ce13f7SAndroid Build Coastguard Worker pRegions[i].dstSubresource, 118*03ce13f7SAndroid Build Coastguard Worker { pRegions[i].dstOffsets[0], pRegions[i].dstOffsets[1] } 119*03ce13f7SAndroid Build Coastguard Worker }; 120*03ce13f7SAndroid Build Coastguard Worker } 121*03ce13f7SAndroid Build Coastguard Worker 122*03ce13f7SAndroid Build Coastguard Worker this->pRegions = ®ions.front(); 123*03ce13f7SAndroid Build Coastguard Worker } 124*03ce13f7SAndroid Build Coastguard Worker 125*03ce13f7SAndroid Build Coastguard Worker private: 126*03ce13f7SAndroid Build Coastguard Worker std::vector<VkImageBlit2> regions; 127*03ce13f7SAndroid Build Coastguard Worker }; 128*03ce13f7SAndroid Build Coastguard Worker 129*03ce13f7SAndroid Build Coastguard Worker struct CopyBufferToImageInfo : public VkCopyBufferToImageInfo2 130*03ce13f7SAndroid Build Coastguard Worker { CopyBufferToImageInfovk::CopyBufferToImageInfo131*03ce13f7SAndroid Build Coastguard Worker CopyBufferToImageInfo(VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) 132*03ce13f7SAndroid Build Coastguard Worker : VkCopyBufferToImageInfo2{ 133*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2, 134*03ce13f7SAndroid Build Coastguard Worker nullptr, 135*03ce13f7SAndroid Build Coastguard Worker srcBuffer, 136*03ce13f7SAndroid Build Coastguard Worker dstImage, 137*03ce13f7SAndroid Build Coastguard Worker dstImageLayout, 138*03ce13f7SAndroid Build Coastguard Worker regionCount, 139*03ce13f7SAndroid Build Coastguard Worker nullptr 140*03ce13f7SAndroid Build Coastguard Worker } 141*03ce13f7SAndroid Build Coastguard Worker { 142*03ce13f7SAndroid Build Coastguard Worker regions.resize(regionCount); 143*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < regionCount; i++) 144*03ce13f7SAndroid Build Coastguard Worker { 145*03ce13f7SAndroid Build Coastguard Worker regions[i] = { 146*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2, 147*03ce13f7SAndroid Build Coastguard Worker nullptr, 148*03ce13f7SAndroid Build Coastguard Worker pRegions[i].bufferOffset, 149*03ce13f7SAndroid Build Coastguard Worker pRegions[i].bufferRowLength, 150*03ce13f7SAndroid Build Coastguard Worker pRegions[i].bufferImageHeight, 151*03ce13f7SAndroid Build Coastguard Worker pRegions[i].imageSubresource, 152*03ce13f7SAndroid Build Coastguard Worker pRegions[i].imageOffset, 153*03ce13f7SAndroid Build Coastguard Worker pRegions[i].imageExtent 154*03ce13f7SAndroid Build Coastguard Worker }; 155*03ce13f7SAndroid Build Coastguard Worker } 156*03ce13f7SAndroid Build Coastguard Worker 157*03ce13f7SAndroid Build Coastguard Worker this->pRegions = ®ions.front(); 158*03ce13f7SAndroid Build Coastguard Worker } 159*03ce13f7SAndroid Build Coastguard Worker 160*03ce13f7SAndroid Build Coastguard Worker private: 161*03ce13f7SAndroid Build Coastguard Worker std::vector<VkBufferImageCopy2> regions; 162*03ce13f7SAndroid Build Coastguard Worker }; 163*03ce13f7SAndroid Build Coastguard Worker 164*03ce13f7SAndroid Build Coastguard Worker struct CopyImageToBufferInfo : public VkCopyImageToBufferInfo2 165*03ce13f7SAndroid Build Coastguard Worker { CopyImageToBufferInfovk::CopyImageToBufferInfo166*03ce13f7SAndroid Build Coastguard Worker CopyImageToBufferInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) 167*03ce13f7SAndroid Build Coastguard Worker : VkCopyImageToBufferInfo2{ 168*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2, 169*03ce13f7SAndroid Build Coastguard Worker nullptr, 170*03ce13f7SAndroid Build Coastguard Worker srcImage, 171*03ce13f7SAndroid Build Coastguard Worker srcImageLayout, 172*03ce13f7SAndroid Build Coastguard Worker dstBuffer, 173*03ce13f7SAndroid Build Coastguard Worker regionCount, 174*03ce13f7SAndroid Build Coastguard Worker nullptr 175*03ce13f7SAndroid Build Coastguard Worker } 176*03ce13f7SAndroid Build Coastguard Worker { 177*03ce13f7SAndroid Build Coastguard Worker regions.resize(regionCount); 178*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < regionCount; i++) 179*03ce13f7SAndroid Build Coastguard Worker { 180*03ce13f7SAndroid Build Coastguard Worker regions[i] = { 181*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2, 182*03ce13f7SAndroid Build Coastguard Worker nullptr, 183*03ce13f7SAndroid Build Coastguard Worker pRegions[i].bufferOffset, 184*03ce13f7SAndroid Build Coastguard Worker pRegions[i].bufferRowLength, 185*03ce13f7SAndroid Build Coastguard Worker pRegions[i].bufferImageHeight, 186*03ce13f7SAndroid Build Coastguard Worker pRegions[i].imageSubresource, 187*03ce13f7SAndroid Build Coastguard Worker pRegions[i].imageOffset, 188*03ce13f7SAndroid Build Coastguard Worker pRegions[i].imageExtent 189*03ce13f7SAndroid Build Coastguard Worker }; 190*03ce13f7SAndroid Build Coastguard Worker } 191*03ce13f7SAndroid Build Coastguard Worker 192*03ce13f7SAndroid Build Coastguard Worker this->pRegions = ®ions.front(); 193*03ce13f7SAndroid Build Coastguard Worker } 194*03ce13f7SAndroid Build Coastguard Worker 195*03ce13f7SAndroid Build Coastguard Worker private: 196*03ce13f7SAndroid Build Coastguard Worker std::vector<VkBufferImageCopy2> regions; 197*03ce13f7SAndroid Build Coastguard Worker }; 198*03ce13f7SAndroid Build Coastguard Worker 199*03ce13f7SAndroid Build Coastguard Worker struct ResolveImageInfo : public VkResolveImageInfo2 200*03ce13f7SAndroid Build Coastguard Worker { ResolveImageInfovk::ResolveImageInfo201*03ce13f7SAndroid Build Coastguard Worker ResolveImageInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) 202*03ce13f7SAndroid Build Coastguard Worker : VkResolveImageInfo2{ 203*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2, 204*03ce13f7SAndroid Build Coastguard Worker nullptr, 205*03ce13f7SAndroid Build Coastguard Worker srcImage, 206*03ce13f7SAndroid Build Coastguard Worker srcImageLayout, 207*03ce13f7SAndroid Build Coastguard Worker dstImage, 208*03ce13f7SAndroid Build Coastguard Worker dstImageLayout, 209*03ce13f7SAndroid Build Coastguard Worker regionCount, 210*03ce13f7SAndroid Build Coastguard Worker nullptr 211*03ce13f7SAndroid Build Coastguard Worker } 212*03ce13f7SAndroid Build Coastguard Worker { 213*03ce13f7SAndroid Build Coastguard Worker regions.resize(regionCount); 214*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < regionCount; i++) 215*03ce13f7SAndroid Build Coastguard Worker { 216*03ce13f7SAndroid Build Coastguard Worker regions[i] = { 217*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2, 218*03ce13f7SAndroid Build Coastguard Worker nullptr, 219*03ce13f7SAndroid Build Coastguard Worker pRegions[i].srcSubresource, 220*03ce13f7SAndroid Build Coastguard Worker pRegions[i].srcOffset, 221*03ce13f7SAndroid Build Coastguard Worker pRegions[i].dstSubresource, 222*03ce13f7SAndroid Build Coastguard Worker pRegions[i].dstOffset, 223*03ce13f7SAndroid Build Coastguard Worker pRegions[i].extent 224*03ce13f7SAndroid Build Coastguard Worker }; 225*03ce13f7SAndroid Build Coastguard Worker } 226*03ce13f7SAndroid Build Coastguard Worker 227*03ce13f7SAndroid Build Coastguard Worker this->pRegions = ®ions.front(); 228*03ce13f7SAndroid Build Coastguard Worker } 229*03ce13f7SAndroid Build Coastguard Worker 230*03ce13f7SAndroid Build Coastguard Worker private: 231*03ce13f7SAndroid Build Coastguard Worker std::vector<VkImageResolve2> regions; 232*03ce13f7SAndroid Build Coastguard Worker }; 233*03ce13f7SAndroid Build Coastguard Worker 234*03ce13f7SAndroid Build Coastguard Worker struct DependencyInfo : public VkDependencyInfo 235*03ce13f7SAndroid Build Coastguard Worker { DependencyInfovk::DependencyInfo236*03ce13f7SAndroid Build Coastguard Worker DependencyInfo(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, 237*03ce13f7SAndroid Build Coastguard Worker VkDependencyFlags dependencyFlags, 238*03ce13f7SAndroid Build Coastguard Worker uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, 239*03ce13f7SAndroid Build Coastguard Worker uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, 240*03ce13f7SAndroid Build Coastguard Worker uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) 241*03ce13f7SAndroid Build Coastguard Worker : VkDependencyInfo{ 242*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_DEPENDENCY_INFO, 243*03ce13f7SAndroid Build Coastguard Worker nullptr, 244*03ce13f7SAndroid Build Coastguard Worker dependencyFlags, 245*03ce13f7SAndroid Build Coastguard Worker memoryBarrierCount, 246*03ce13f7SAndroid Build Coastguard Worker nullptr, 247*03ce13f7SAndroid Build Coastguard Worker bufferMemoryBarrierCount, 248*03ce13f7SAndroid Build Coastguard Worker nullptr, 249*03ce13f7SAndroid Build Coastguard Worker imageMemoryBarrierCount, 250*03ce13f7SAndroid Build Coastguard Worker nullptr 251*03ce13f7SAndroid Build Coastguard Worker } 252*03ce13f7SAndroid Build Coastguard Worker { 253*03ce13f7SAndroid Build Coastguard Worker if((memoryBarrierCount == 0) && 254*03ce13f7SAndroid Build Coastguard Worker (bufferMemoryBarrierCount == 0) && 255*03ce13f7SAndroid Build Coastguard Worker (imageMemoryBarrierCount == 0)) 256*03ce13f7SAndroid Build Coastguard Worker { 257*03ce13f7SAndroid Build Coastguard Worker // Create a single memory barrier entry to store the source and destination stage masks 258*03ce13f7SAndroid Build Coastguard Worker memoryBarriers.resize(1); 259*03ce13f7SAndroid Build Coastguard Worker memoryBarriers[0] = { 260*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_MEMORY_BARRIER_2, 261*03ce13f7SAndroid Build Coastguard Worker nullptr, 262*03ce13f7SAndroid Build Coastguard Worker srcStageMask, 263*03ce13f7SAndroid Build Coastguard Worker VK_ACCESS_2_NONE, 264*03ce13f7SAndroid Build Coastguard Worker dstStageMask, 265*03ce13f7SAndroid Build Coastguard Worker VK_ACCESS_2_NONE 266*03ce13f7SAndroid Build Coastguard Worker }; 267*03ce13f7SAndroid Build Coastguard Worker } 268*03ce13f7SAndroid Build Coastguard Worker else 269*03ce13f7SAndroid Build Coastguard Worker { 270*03ce13f7SAndroid Build Coastguard Worker memoryBarriers.resize(memoryBarrierCount); 271*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < memoryBarrierCount; i++) 272*03ce13f7SAndroid Build Coastguard Worker { 273*03ce13f7SAndroid Build Coastguard Worker memoryBarriers[i] = { 274*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_MEMORY_BARRIER_2, 275*03ce13f7SAndroid Build Coastguard Worker pMemoryBarriers[i].pNext, 276*03ce13f7SAndroid Build Coastguard Worker srcStageMask, 277*03ce13f7SAndroid Build Coastguard Worker pMemoryBarriers[i].srcAccessMask, 278*03ce13f7SAndroid Build Coastguard Worker dstStageMask, 279*03ce13f7SAndroid Build Coastguard Worker pMemoryBarriers[i].dstAccessMask 280*03ce13f7SAndroid Build Coastguard Worker }; 281*03ce13f7SAndroid Build Coastguard Worker } 282*03ce13f7SAndroid Build Coastguard Worker 283*03ce13f7SAndroid Build Coastguard Worker bufferMemoryBarriers.resize(bufferMemoryBarrierCount); 284*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < bufferMemoryBarrierCount; i++) 285*03ce13f7SAndroid Build Coastguard Worker { 286*03ce13f7SAndroid Build Coastguard Worker bufferMemoryBarriers[i] = { 287*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2, 288*03ce13f7SAndroid Build Coastguard Worker pBufferMemoryBarriers[i].pNext, 289*03ce13f7SAndroid Build Coastguard Worker srcStageMask, 290*03ce13f7SAndroid Build Coastguard Worker pBufferMemoryBarriers[i].srcAccessMask, 291*03ce13f7SAndroid Build Coastguard Worker dstStageMask, 292*03ce13f7SAndroid Build Coastguard Worker pBufferMemoryBarriers[i].dstAccessMask, 293*03ce13f7SAndroid Build Coastguard Worker pBufferMemoryBarriers[i].srcQueueFamilyIndex, 294*03ce13f7SAndroid Build Coastguard Worker pBufferMemoryBarriers[i].dstQueueFamilyIndex, 295*03ce13f7SAndroid Build Coastguard Worker pBufferMemoryBarriers[i].buffer, 296*03ce13f7SAndroid Build Coastguard Worker pBufferMemoryBarriers[i].offset, 297*03ce13f7SAndroid Build Coastguard Worker pBufferMemoryBarriers[i].size 298*03ce13f7SAndroid Build Coastguard Worker }; 299*03ce13f7SAndroid Build Coastguard Worker } 300*03ce13f7SAndroid Build Coastguard Worker 301*03ce13f7SAndroid Build Coastguard Worker imageMemoryBarriers.resize(imageMemoryBarrierCount); 302*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < imageMemoryBarrierCount; i++) 303*03ce13f7SAndroid Build Coastguard Worker { 304*03ce13f7SAndroid Build Coastguard Worker imageMemoryBarriers[i] = { 305*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, 306*03ce13f7SAndroid Build Coastguard Worker pImageMemoryBarriers[i].pNext, 307*03ce13f7SAndroid Build Coastguard Worker srcStageMask, 308*03ce13f7SAndroid Build Coastguard Worker pImageMemoryBarriers[i].srcAccessMask, 309*03ce13f7SAndroid Build Coastguard Worker dstStageMask, 310*03ce13f7SAndroid Build Coastguard Worker pImageMemoryBarriers[i].dstAccessMask, 311*03ce13f7SAndroid Build Coastguard Worker pImageMemoryBarriers[i].oldLayout, 312*03ce13f7SAndroid Build Coastguard Worker pImageMemoryBarriers[i].newLayout, 313*03ce13f7SAndroid Build Coastguard Worker pImageMemoryBarriers[i].srcQueueFamilyIndex, 314*03ce13f7SAndroid Build Coastguard Worker pImageMemoryBarriers[i].dstQueueFamilyIndex, 315*03ce13f7SAndroid Build Coastguard Worker pImageMemoryBarriers[i].image, 316*03ce13f7SAndroid Build Coastguard Worker pImageMemoryBarriers[i].subresourceRange 317*03ce13f7SAndroid Build Coastguard Worker }; 318*03ce13f7SAndroid Build Coastguard Worker } 319*03ce13f7SAndroid Build Coastguard Worker } 320*03ce13f7SAndroid Build Coastguard Worker 321*03ce13f7SAndroid Build Coastguard Worker this->pMemoryBarriers = memoryBarriers.empty() ? nullptr : &memoryBarriers.front(); 322*03ce13f7SAndroid Build Coastguard Worker this->pBufferMemoryBarriers = bufferMemoryBarriers.empty() ? nullptr : &bufferMemoryBarriers.front(); 323*03ce13f7SAndroid Build Coastguard Worker this->pImageMemoryBarriers = imageMemoryBarriers.empty() ? nullptr : &imageMemoryBarriers.front(); 324*03ce13f7SAndroid Build Coastguard Worker } 325*03ce13f7SAndroid Build Coastguard Worker 326*03ce13f7SAndroid Build Coastguard Worker private: 327*03ce13f7SAndroid Build Coastguard Worker std::vector<VkMemoryBarrier2> memoryBarriers; 328*03ce13f7SAndroid Build Coastguard Worker std::vector<VkBufferMemoryBarrier2> bufferMemoryBarriers; 329*03ce13f7SAndroid Build Coastguard Worker std::vector<VkImageMemoryBarrier2> imageMemoryBarriers; 330*03ce13f7SAndroid Build Coastguard Worker }; 331*03ce13f7SAndroid Build Coastguard Worker 332*03ce13f7SAndroid Build Coastguard Worker struct ImageSubresource : VkImageSubresource 333*03ce13f7SAndroid Build Coastguard Worker { ImageSubresourcevk::ImageSubresource334*03ce13f7SAndroid Build Coastguard Worker ImageSubresource(const VkImageSubresourceLayers &subresourceLayers) 335*03ce13f7SAndroid Build Coastguard Worker : VkImageSubresource{ 336*03ce13f7SAndroid Build Coastguard Worker subresourceLayers.aspectMask, 337*03ce13f7SAndroid Build Coastguard Worker subresourceLayers.mipLevel, 338*03ce13f7SAndroid Build Coastguard Worker subresourceLayers.baseArrayLayer 339*03ce13f7SAndroid Build Coastguard Worker } 340*03ce13f7SAndroid Build Coastguard Worker {} 341*03ce13f7SAndroid Build Coastguard Worker }; 342*03ce13f7SAndroid Build Coastguard Worker 343*03ce13f7SAndroid Build Coastguard Worker struct ImageSubresourceRange : VkImageSubresourceRange 344*03ce13f7SAndroid Build Coastguard Worker { ImageSubresourceRangevk::ImageSubresourceRange345*03ce13f7SAndroid Build Coastguard Worker ImageSubresourceRange(const VkImageSubresourceLayers &subresourceLayers) 346*03ce13f7SAndroid Build Coastguard Worker : VkImageSubresourceRange{ 347*03ce13f7SAndroid Build Coastguard Worker subresourceLayers.aspectMask, 348*03ce13f7SAndroid Build Coastguard Worker subresourceLayers.mipLevel, 349*03ce13f7SAndroid Build Coastguard Worker 1, 350*03ce13f7SAndroid Build Coastguard Worker subresourceLayers.baseArrayLayer, 351*03ce13f7SAndroid Build Coastguard Worker subresourceLayers.layerCount 352*03ce13f7SAndroid Build Coastguard Worker } 353*03ce13f7SAndroid Build Coastguard Worker {} 354*03ce13f7SAndroid Build Coastguard Worker }; 355*03ce13f7SAndroid Build Coastguard Worker 356*03ce13f7SAndroid Build Coastguard Worker struct Extent2D : VkExtent2D 357*03ce13f7SAndroid Build Coastguard Worker { Extent2Dvk::Extent2D358*03ce13f7SAndroid Build Coastguard Worker Extent2D(const VkExtent3D &extent3D) 359*03ce13f7SAndroid Build Coastguard Worker : VkExtent2D{ extent3D.width, extent3D.height } 360*03ce13f7SAndroid Build Coastguard Worker {} 361*03ce13f7SAndroid Build Coastguard Worker }; 362*03ce13f7SAndroid Build Coastguard Worker 363*03ce13f7SAndroid Build Coastguard Worker struct SubmitInfo 364*03ce13f7SAndroid Build Coastguard Worker { Allocatevk::SubmitInfo365*03ce13f7SAndroid Build Coastguard Worker static SubmitInfo *Allocate(uint32_t submitCount, const VkSubmitInfo *pSubmits) 366*03ce13f7SAndroid Build Coastguard Worker { 367*03ce13f7SAndroid Build Coastguard Worker size_t submitSize = sizeof(SubmitInfo) * submitCount; 368*03ce13f7SAndroid Build Coastguard Worker size_t totalSize = Align8(submitSize); 369*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < submitCount; i++) 370*03ce13f7SAndroid Build Coastguard Worker { 371*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].waitSemaphoreCount * sizeof(VkSemaphore)); 372*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].waitSemaphoreCount * sizeof(VkPipelineStageFlags)); 373*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].signalSemaphoreCount * sizeof(VkSemaphore)); 374*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].commandBufferCount * sizeof(VkCommandBuffer)); 375*03ce13f7SAndroid Build Coastguard Worker 376*03ce13f7SAndroid Build Coastguard Worker for(const auto *extension = reinterpret_cast<const VkBaseInStructure *>(pSubmits[i].pNext); 377*03ce13f7SAndroid Build Coastguard Worker extension != nullptr; extension = reinterpret_cast<const VkBaseInStructure *>(extension->pNext)) 378*03ce13f7SAndroid Build Coastguard Worker { 379*03ce13f7SAndroid Build Coastguard Worker switch(extension->sType) 380*03ce13f7SAndroid Build Coastguard Worker { 381*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: 382*03ce13f7SAndroid Build Coastguard Worker { 383*03ce13f7SAndroid Build Coastguard Worker const auto *tlsSubmitInfo = reinterpret_cast<const VkTimelineSemaphoreSubmitInfo *>(extension); 384*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(tlsSubmitInfo->waitSemaphoreValueCount * sizeof(uint64_t)); 385*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(tlsSubmitInfo->signalSemaphoreValueCount * sizeof(uint64_t)); 386*03ce13f7SAndroid Build Coastguard Worker } 387*03ce13f7SAndroid Build Coastguard Worker break; 388*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: 389*03ce13f7SAndroid Build Coastguard Worker // SwiftShader doesn't use device group submit info because it only supports a single physical device. 390*03ce13f7SAndroid Build Coastguard Worker // However, this extension is core in Vulkan 1.1, so we must treat it as a valid structure type. 391*03ce13f7SAndroid Build Coastguard Worker break; 392*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MAX_ENUM: 393*03ce13f7SAndroid Build Coastguard Worker // dEQP tests that this value is ignored. 394*03ce13f7SAndroid Build Coastguard Worker break; 395*03ce13f7SAndroid Build Coastguard Worker default: 396*03ce13f7SAndroid Build Coastguard Worker UNSUPPORTED("submitInfo[%d]->pNext sType: %s", i, vk::Stringify(extension->sType).c_str()); 397*03ce13f7SAndroid Build Coastguard Worker break; 398*03ce13f7SAndroid Build Coastguard Worker } 399*03ce13f7SAndroid Build Coastguard Worker } 400*03ce13f7SAndroid Build Coastguard Worker } 401*03ce13f7SAndroid Build Coastguard Worker 402*03ce13f7SAndroid Build Coastguard Worker uint8_t *buffer = static_cast<uint8_t *>( 403*03ce13f7SAndroid Build Coastguard Worker vk::allocateHostMemory(totalSize, vk::HOST_MEMORY_ALLOCATION_ALIGNMENT, vk::NULL_ALLOCATION_CALLBACKS, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT)); 404*03ce13f7SAndroid Build Coastguard Worker uint8_t *mem = buffer; 405*03ce13f7SAndroid Build Coastguard Worker 406*03ce13f7SAndroid Build Coastguard Worker auto submits = new(mem) SubmitInfo[submitCount]; 407*03ce13f7SAndroid Build Coastguard Worker mem += Align8(submitSize); 408*03ce13f7SAndroid Build Coastguard Worker 409*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < submitCount; i++) 410*03ce13f7SAndroid Build Coastguard Worker { 411*03ce13f7SAndroid Build Coastguard Worker submits[i].commandBufferCount = pSubmits[i].commandBufferCount; 412*03ce13f7SAndroid Build Coastguard Worker submits[i].signalSemaphoreCount = pSubmits[i].signalSemaphoreCount; 413*03ce13f7SAndroid Build Coastguard Worker submits[i].waitSemaphoreCount = pSubmits[i].waitSemaphoreCount; 414*03ce13f7SAndroid Build Coastguard Worker 415*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphores = nullptr; 416*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitDstStageMask = nullptr; 417*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphores = nullptr; 418*03ce13f7SAndroid Build Coastguard Worker submits[i].pCommandBuffers = nullptr; 419*03ce13f7SAndroid Build Coastguard Worker 420*03ce13f7SAndroid Build Coastguard Worker if(pSubmits[i].waitSemaphoreCount > 0) 421*03ce13f7SAndroid Build Coastguard Worker { 422*03ce13f7SAndroid Build Coastguard Worker size_t size = pSubmits[i].waitSemaphoreCount * sizeof(VkSemaphore); 423*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphores = reinterpret_cast<VkSemaphore *>(mem); 424*03ce13f7SAndroid Build Coastguard Worker memcpy(mem, pSubmits[i].pWaitSemaphores, size); 425*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 426*03ce13f7SAndroid Build Coastguard Worker 427*03ce13f7SAndroid Build Coastguard Worker size = pSubmits[i].waitSemaphoreCount * sizeof(VkPipelineStageFlags); 428*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitDstStageMask = reinterpret_cast<VkPipelineStageFlags *>(mem); 429*03ce13f7SAndroid Build Coastguard Worker memcpy(mem, pSubmits[i].pWaitDstStageMask, size); 430*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 431*03ce13f7SAndroid Build Coastguard Worker } 432*03ce13f7SAndroid Build Coastguard Worker 433*03ce13f7SAndroid Build Coastguard Worker if(pSubmits[i].signalSemaphoreCount > 0) 434*03ce13f7SAndroid Build Coastguard Worker { 435*03ce13f7SAndroid Build Coastguard Worker size_t size = pSubmits[i].signalSemaphoreCount * sizeof(VkSemaphore); 436*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphores = reinterpret_cast<VkSemaphore *>(mem); 437*03ce13f7SAndroid Build Coastguard Worker memcpy(mem, pSubmits[i].pSignalSemaphores, size); 438*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 439*03ce13f7SAndroid Build Coastguard Worker } 440*03ce13f7SAndroid Build Coastguard Worker 441*03ce13f7SAndroid Build Coastguard Worker if(pSubmits[i].commandBufferCount > 0) 442*03ce13f7SAndroid Build Coastguard Worker { 443*03ce13f7SAndroid Build Coastguard Worker size_t size = pSubmits[i].commandBufferCount * sizeof(VkCommandBuffer); 444*03ce13f7SAndroid Build Coastguard Worker submits[i].pCommandBuffers = reinterpret_cast<VkCommandBuffer *>(mem); 445*03ce13f7SAndroid Build Coastguard Worker memcpy(mem, pSubmits[i].pCommandBuffers, size); 446*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 447*03ce13f7SAndroid Build Coastguard Worker } 448*03ce13f7SAndroid Build Coastguard Worker 449*03ce13f7SAndroid Build Coastguard Worker submits[i].waitSemaphoreValueCount = 0; 450*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphoreValues = nullptr; 451*03ce13f7SAndroid Build Coastguard Worker submits[i].signalSemaphoreValueCount = 0; 452*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphoreValues = nullptr; 453*03ce13f7SAndroid Build Coastguard Worker 454*03ce13f7SAndroid Build Coastguard Worker for(const auto *extension = reinterpret_cast<const VkBaseInStructure *>(pSubmits[i].pNext); 455*03ce13f7SAndroid Build Coastguard Worker extension != nullptr; extension = reinterpret_cast<const VkBaseInStructure *>(extension->pNext)) 456*03ce13f7SAndroid Build Coastguard Worker { 457*03ce13f7SAndroid Build Coastguard Worker switch(extension->sType) 458*03ce13f7SAndroid Build Coastguard Worker { 459*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: 460*03ce13f7SAndroid Build Coastguard Worker { 461*03ce13f7SAndroid Build Coastguard Worker const VkTimelineSemaphoreSubmitInfo *tlsSubmitInfo = reinterpret_cast<const VkTimelineSemaphoreSubmitInfo *>(extension); 462*03ce13f7SAndroid Build Coastguard Worker 463*03ce13f7SAndroid Build Coastguard Worker if(tlsSubmitInfo->waitSemaphoreValueCount > 0) 464*03ce13f7SAndroid Build Coastguard Worker { 465*03ce13f7SAndroid Build Coastguard Worker submits[i].waitSemaphoreValueCount = tlsSubmitInfo->waitSemaphoreValueCount; 466*03ce13f7SAndroid Build Coastguard Worker size_t size = tlsSubmitInfo->waitSemaphoreValueCount * sizeof(uint64_t); 467*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphoreValues = reinterpret_cast<uint64_t *>(mem); 468*03ce13f7SAndroid Build Coastguard Worker memcpy(mem, tlsSubmitInfo->pWaitSemaphoreValues, size); 469*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 470*03ce13f7SAndroid Build Coastguard Worker } 471*03ce13f7SAndroid Build Coastguard Worker 472*03ce13f7SAndroid Build Coastguard Worker if(tlsSubmitInfo->signalSemaphoreValueCount > 0) 473*03ce13f7SAndroid Build Coastguard Worker { 474*03ce13f7SAndroid Build Coastguard Worker submits[i].signalSemaphoreValueCount = tlsSubmitInfo->signalSemaphoreValueCount; 475*03ce13f7SAndroid Build Coastguard Worker size_t size = tlsSubmitInfo->signalSemaphoreValueCount * sizeof(uint64_t); 476*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphoreValues = reinterpret_cast<uint64_t *>(mem); 477*03ce13f7SAndroid Build Coastguard Worker memcpy(mem, tlsSubmitInfo->pSignalSemaphoreValues, size); 478*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 479*03ce13f7SAndroid Build Coastguard Worker } 480*03ce13f7SAndroid Build Coastguard Worker } 481*03ce13f7SAndroid Build Coastguard Worker break; 482*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: 483*03ce13f7SAndroid Build Coastguard Worker // SwiftShader doesn't use device group submit info because it only supports a single physical device. 484*03ce13f7SAndroid Build Coastguard Worker // However, this extension is core in Vulkan 1.1, so we must treat it as a valid structure type. 485*03ce13f7SAndroid Build Coastguard Worker break; 486*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MAX_ENUM: 487*03ce13f7SAndroid Build Coastguard Worker // dEQP tests that this value is ignored. 488*03ce13f7SAndroid Build Coastguard Worker break; 489*03ce13f7SAndroid Build Coastguard Worker default: 490*03ce13f7SAndroid Build Coastguard Worker UNSUPPORTED("submitInfo[%d]->pNext sType: %s", i, vk::Stringify(extension->sType).c_str()); 491*03ce13f7SAndroid Build Coastguard Worker break; 492*03ce13f7SAndroid Build Coastguard Worker } 493*03ce13f7SAndroid Build Coastguard Worker } 494*03ce13f7SAndroid Build Coastguard Worker } 495*03ce13f7SAndroid Build Coastguard Worker 496*03ce13f7SAndroid Build Coastguard Worker ASSERT(static_cast<size_t>(mem - buffer) == totalSize); 497*03ce13f7SAndroid Build Coastguard Worker return submits; 498*03ce13f7SAndroid Build Coastguard Worker } 499*03ce13f7SAndroid Build Coastguard Worker Allocatevk::SubmitInfo500*03ce13f7SAndroid Build Coastguard Worker static SubmitInfo *Allocate(uint32_t submitCount, const VkSubmitInfo2 *pSubmits) 501*03ce13f7SAndroid Build Coastguard Worker { 502*03ce13f7SAndroid Build Coastguard Worker size_t submitSize = sizeof(SubmitInfo) * submitCount; 503*03ce13f7SAndroid Build Coastguard Worker size_t totalSize = Align8(submitSize); 504*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < submitCount; i++) 505*03ce13f7SAndroid Build Coastguard Worker { 506*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].waitSemaphoreInfoCount * sizeof(VkSemaphore)); 507*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].waitSemaphoreInfoCount * sizeof(VkPipelineStageFlags)); 508*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].waitSemaphoreInfoCount * sizeof(uint64_t)); 509*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].signalSemaphoreInfoCount * sizeof(VkSemaphore)); 510*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].signalSemaphoreInfoCount * sizeof(uint64_t)); 511*03ce13f7SAndroid Build Coastguard Worker totalSize += Align8(pSubmits[i].commandBufferInfoCount * sizeof(VkCommandBuffer)); 512*03ce13f7SAndroid Build Coastguard Worker 513*03ce13f7SAndroid Build Coastguard Worker for(const auto *extension = reinterpret_cast<const VkBaseInStructure *>(pSubmits[i].pNext); 514*03ce13f7SAndroid Build Coastguard Worker extension != nullptr; extension = reinterpret_cast<const VkBaseInStructure *>(extension->pNext)) 515*03ce13f7SAndroid Build Coastguard Worker { 516*03ce13f7SAndroid Build Coastguard Worker switch(extension->sType) 517*03ce13f7SAndroid Build Coastguard Worker { 518*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MAX_ENUM: 519*03ce13f7SAndroid Build Coastguard Worker // dEQP tests that this value is ignored. 520*03ce13f7SAndroid Build Coastguard Worker break; 521*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: // VK_KHR_performance_query 522*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: // VK_KHR_win32_keyed_mutex 523*03ce13f7SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: // VK_NV_win32_keyed_mutex 524*03ce13f7SAndroid Build Coastguard Worker default: 525*03ce13f7SAndroid Build Coastguard Worker UNSUPPORTED("submitInfo[%d]->pNext sType: %s", i, vk::Stringify(extension->sType).c_str()); 526*03ce13f7SAndroid Build Coastguard Worker break; 527*03ce13f7SAndroid Build Coastguard Worker } 528*03ce13f7SAndroid Build Coastguard Worker } 529*03ce13f7SAndroid Build Coastguard Worker } 530*03ce13f7SAndroid Build Coastguard Worker 531*03ce13f7SAndroid Build Coastguard Worker uint8_t *buffer = static_cast<uint8_t *>( 532*03ce13f7SAndroid Build Coastguard Worker vk::allocateHostMemory(totalSize, vk::HOST_MEMORY_ALLOCATION_ALIGNMENT, vk::NULL_ALLOCATION_CALLBACKS, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT)); 533*03ce13f7SAndroid Build Coastguard Worker uint8_t *mem = buffer; 534*03ce13f7SAndroid Build Coastguard Worker 535*03ce13f7SAndroid Build Coastguard Worker auto submits = new(mem) SubmitInfo[submitCount]; 536*03ce13f7SAndroid Build Coastguard Worker mem += Align8(submitSize); 537*03ce13f7SAndroid Build Coastguard Worker 538*03ce13f7SAndroid Build Coastguard Worker for(uint32_t i = 0; i < submitCount; i++) 539*03ce13f7SAndroid Build Coastguard Worker { 540*03ce13f7SAndroid Build Coastguard Worker submits[i].commandBufferCount = pSubmits[i].commandBufferInfoCount; 541*03ce13f7SAndroid Build Coastguard Worker submits[i].signalSemaphoreCount = pSubmits[i].signalSemaphoreInfoCount; 542*03ce13f7SAndroid Build Coastguard Worker submits[i].waitSemaphoreCount = pSubmits[i].waitSemaphoreInfoCount; 543*03ce13f7SAndroid Build Coastguard Worker 544*03ce13f7SAndroid Build Coastguard Worker submits[i].signalSemaphoreValueCount = pSubmits[i].signalSemaphoreInfoCount; 545*03ce13f7SAndroid Build Coastguard Worker submits[i].waitSemaphoreValueCount = pSubmits[i].waitSemaphoreInfoCount; 546*03ce13f7SAndroid Build Coastguard Worker 547*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphores = nullptr; 548*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitDstStageMask = nullptr; 549*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphores = nullptr; 550*03ce13f7SAndroid Build Coastguard Worker submits[i].pCommandBuffers = nullptr; 551*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphoreValues = nullptr; 552*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphoreValues = nullptr; 553*03ce13f7SAndroid Build Coastguard Worker 554*03ce13f7SAndroid Build Coastguard Worker if(submits[i].waitSemaphoreCount > 0) 555*03ce13f7SAndroid Build Coastguard Worker { 556*03ce13f7SAndroid Build Coastguard Worker size_t size = submits[i].waitSemaphoreCount * sizeof(VkSemaphore); 557*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphores = reinterpret_cast<VkSemaphore *>(mem); 558*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 559*03ce13f7SAndroid Build Coastguard Worker 560*03ce13f7SAndroid Build Coastguard Worker size = submits[i].waitSemaphoreCount * sizeof(VkPipelineStageFlags); 561*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitDstStageMask = reinterpret_cast<VkPipelineStageFlags *>(mem); 562*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 563*03ce13f7SAndroid Build Coastguard Worker 564*03ce13f7SAndroid Build Coastguard Worker size = submits[i].waitSemaphoreCount * sizeof(uint64_t); 565*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphoreValues = reinterpret_cast<uint64_t *>(mem); 566*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 567*03ce13f7SAndroid Build Coastguard Worker 568*03ce13f7SAndroid Build Coastguard Worker for(uint32_t j = 0; j < submits[i].waitSemaphoreCount; j++) 569*03ce13f7SAndroid Build Coastguard Worker { 570*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphores[j] = pSubmits[i].pWaitSemaphoreInfos[j].semaphore; 571*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitDstStageMask[j] = pSubmits[i].pWaitSemaphoreInfos[j].stageMask; 572*03ce13f7SAndroid Build Coastguard Worker submits[i].pWaitSemaphoreValues[j] = pSubmits[i].pWaitSemaphoreInfos[j].value; 573*03ce13f7SAndroid Build Coastguard Worker } 574*03ce13f7SAndroid Build Coastguard Worker } 575*03ce13f7SAndroid Build Coastguard Worker 576*03ce13f7SAndroid Build Coastguard Worker if(submits[i].signalSemaphoreCount > 0) 577*03ce13f7SAndroid Build Coastguard Worker { 578*03ce13f7SAndroid Build Coastguard Worker size_t size = submits[i].signalSemaphoreCount * sizeof(VkSemaphore); 579*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphores = reinterpret_cast<VkSemaphore *>(mem); 580*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 581*03ce13f7SAndroid Build Coastguard Worker 582*03ce13f7SAndroid Build Coastguard Worker size = submits[i].signalSemaphoreCount * sizeof(uint64_t); 583*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphoreValues = reinterpret_cast<uint64_t *>(mem); 584*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 585*03ce13f7SAndroid Build Coastguard Worker 586*03ce13f7SAndroid Build Coastguard Worker for(uint32_t j = 0; j < submits[i].signalSemaphoreCount; j++) 587*03ce13f7SAndroid Build Coastguard Worker { 588*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphores[j] = pSubmits[i].pSignalSemaphoreInfos[j].semaphore; 589*03ce13f7SAndroid Build Coastguard Worker submits[i].pSignalSemaphoreValues[j] = pSubmits[i].pSignalSemaphoreInfos[j].value; 590*03ce13f7SAndroid Build Coastguard Worker } 591*03ce13f7SAndroid Build Coastguard Worker } 592*03ce13f7SAndroid Build Coastguard Worker 593*03ce13f7SAndroid Build Coastguard Worker if(submits[i].commandBufferCount > 0) 594*03ce13f7SAndroid Build Coastguard Worker { 595*03ce13f7SAndroid Build Coastguard Worker size_t size = submits[i].commandBufferCount * sizeof(VkCommandBuffer); 596*03ce13f7SAndroid Build Coastguard Worker submits[i].pCommandBuffers = reinterpret_cast<VkCommandBuffer *>(mem); 597*03ce13f7SAndroid Build Coastguard Worker mem += Align8(size); 598*03ce13f7SAndroid Build Coastguard Worker 599*03ce13f7SAndroid Build Coastguard Worker for(uint32_t j = 0; j < submits[i].commandBufferCount; j++) 600*03ce13f7SAndroid Build Coastguard Worker { 601*03ce13f7SAndroid Build Coastguard Worker submits[i].pCommandBuffers[j] = pSubmits[i].pCommandBufferInfos[j].commandBuffer; 602*03ce13f7SAndroid Build Coastguard Worker } 603*03ce13f7SAndroid Build Coastguard Worker } 604*03ce13f7SAndroid Build Coastguard Worker } 605*03ce13f7SAndroid Build Coastguard Worker 606*03ce13f7SAndroid Build Coastguard Worker ASSERT(static_cast<size_t>(mem - buffer) == totalSize); 607*03ce13f7SAndroid Build Coastguard Worker return submits; 608*03ce13f7SAndroid Build Coastguard Worker } 609*03ce13f7SAndroid Build Coastguard Worker Releasevk::SubmitInfo610*03ce13f7SAndroid Build Coastguard Worker static void Release(SubmitInfo *submitInfo) 611*03ce13f7SAndroid Build Coastguard Worker { 612*03ce13f7SAndroid Build Coastguard Worker vk::freeHostMemory(submitInfo, NULL_ALLOCATION_CALLBACKS); 613*03ce13f7SAndroid Build Coastguard Worker } 614*03ce13f7SAndroid Build Coastguard Worker 615*03ce13f7SAndroid Build Coastguard Worker uint32_t waitSemaphoreCount; 616*03ce13f7SAndroid Build Coastguard Worker VkSemaphore *pWaitSemaphores; 617*03ce13f7SAndroid Build Coastguard Worker VkPipelineStageFlags *pWaitDstStageMask; 618*03ce13f7SAndroid Build Coastguard Worker uint32_t commandBufferCount; 619*03ce13f7SAndroid Build Coastguard Worker VkCommandBuffer *pCommandBuffers; 620*03ce13f7SAndroid Build Coastguard Worker uint32_t signalSemaphoreCount; 621*03ce13f7SAndroid Build Coastguard Worker VkSemaphore *pSignalSemaphores; 622*03ce13f7SAndroid Build Coastguard Worker uint32_t waitSemaphoreValueCount; 623*03ce13f7SAndroid Build Coastguard Worker uint64_t *pWaitSemaphoreValues; 624*03ce13f7SAndroid Build Coastguard Worker uint32_t signalSemaphoreValueCount; 625*03ce13f7SAndroid Build Coastguard Worker uint64_t *pSignalSemaphoreValues; 626*03ce13f7SAndroid Build Coastguard Worker 627*03ce13f7SAndroid Build Coastguard Worker private: Align8vk::SubmitInfo628*03ce13f7SAndroid Build Coastguard Worker static size_t Align8(size_t size) 629*03ce13f7SAndroid Build Coastguard Worker { 630*03ce13f7SAndroid Build Coastguard Worker // Keep all arrays 8-byte aligned, so that an odd number of `VkPipelineStageFlags` does not break the 631*03ce13f7SAndroid Build Coastguard Worker // alignment of the other fields. 632*03ce13f7SAndroid Build Coastguard Worker constexpr size_t align = 8; 633*03ce13f7SAndroid Build Coastguard Worker return (size + align - 1) & ~(align - 1); 634*03ce13f7SAndroid Build Coastguard Worker } 635*03ce13f7SAndroid Build Coastguard Worker }; 636*03ce13f7SAndroid Build Coastguard Worker 637*03ce13f7SAndroid Build Coastguard Worker } // namespace vk 638*03ce13f7SAndroid Build Coastguard Worker 639*03ce13f7SAndroid Build Coastguard Worker #endif // VK_STRUCT_CONVERSION_HPP_ 640