xref: /aosp_15_r20/external/swiftshader/src/Vulkan/VkStructConversion.hpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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 = &regions.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 = &regions.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 = &regions.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 = &regions.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 = &regions.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 = &regions.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