• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 The SwiftShader Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef VK_STRUCT_CONVERSION_HPP_
16 #define VK_STRUCT_CONVERSION_HPP_
17 
18 #include "Vulkan/VulkanPlatform.hpp"
19 #include <vector>
20 
21 namespace vk {
22 
23 struct CopyBufferInfo : public VkCopyBufferInfo2KHR
24 {
CopyBufferInfovk::CopyBufferInfo25 	CopyBufferInfo(VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy *pRegions)
26 	    : VkCopyBufferInfo2KHR{
27 		    VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR,
28 		    nullptr,
29 		    srcBuffer,
30 		    dstBuffer,
31 		    regionCount,
32 		    nullptr
33 	    }
34 	{
35 		regions.resize(regionCount);
36 		for(uint32_t i = 0; i < regionCount; i++)
37 		{
38 			regions[i] = {
39 				VK_STRUCTURE_TYPE_BUFFER_COPY_2_KHR,
40 				nullptr,
41 				pRegions[i].srcOffset,
42 				pRegions[i].dstOffset,
43 				pRegions[i].size
44 			};
45 		}
46 
47 		this->pRegions = &regions.front();
48 	}
49 
50 private:
51 	std::vector<VkBufferCopy2KHR> regions;
52 };
53 
54 struct CopyImageInfo : public VkCopyImageInfo2KHR
55 {
CopyImageInfovk::CopyImageInfo56 	CopyImageInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions)
57 	    : VkCopyImageInfo2KHR{
58 		    VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
59 		    nullptr,
60 		    srcImage,
61 		    srcImageLayout,
62 		    dstImage,
63 		    dstImageLayout,
64 		    regionCount,
65 		    nullptr
66 	    }
67 	{
68 		regions.resize(regionCount);
69 		for(uint32_t i = 0; i < regionCount; i++)
70 		{
71 			regions[i] = {
72 				VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
73 				nullptr,
74 				pRegions[i].srcSubresource,
75 				pRegions[i].srcOffset,
76 				pRegions[i].dstSubresource,
77 				pRegions[i].dstOffset,
78 				pRegions[i].extent
79 			};
80 		}
81 
82 		this->pRegions = &regions.front();
83 	}
84 
85 private:
86 	std::vector<VkImageCopy2KHR> regions;
87 };
88 
89 struct BlitImageInfo : public VkBlitImageInfo2KHR
90 {
BlitImageInfovk::BlitImageInfo91 	BlitImageInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter)
92 	    : VkBlitImageInfo2KHR{
93 		    VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2_KHR,
94 		    nullptr,
95 		    srcImage,
96 		    srcImageLayout,
97 		    dstImage,
98 		    dstImageLayout,
99 		    regionCount,
100 		    nullptr,
101 		    filter
102 	    }
103 	{
104 		regions.resize(regionCount);
105 		for(uint32_t i = 0; i < regionCount; i++)
106 		{
107 			regions[i] = {
108 				VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR,
109 				nullptr,
110 				pRegions[i].srcSubresource,
111 				{ pRegions[i].srcOffsets[0], pRegions[i].srcOffsets[1] },
112 				pRegions[i].dstSubresource,
113 				{ pRegions[i].dstOffsets[0], pRegions[i].dstOffsets[1] }
114 			};
115 		}
116 
117 		this->pRegions = &regions.front();
118 	}
119 
120 private:
121 	std::vector<VkImageBlit2KHR> regions;
122 };
123 
124 struct CopyBufferToImageInfo : public VkCopyBufferToImageInfo2KHR
125 {
CopyBufferToImageInfovk::CopyBufferToImageInfo126 	CopyBufferToImageInfo(VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions)
127 	    : VkCopyBufferToImageInfo2KHR{
128 		    VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
129 		    nullptr,
130 		    srcBuffer,
131 		    dstImage,
132 		    dstImageLayout,
133 		    regionCount,
134 		    nullptr
135 	    }
136 	{
137 		regions.resize(regionCount);
138 		for(uint32_t i = 0; i < regionCount; i++)
139 		{
140 			regions[i] = {
141 				VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
142 				nullptr,
143 				pRegions[i].bufferOffset,
144 				pRegions[i].bufferRowLength,
145 				pRegions[i].bufferImageHeight,
146 				pRegions[i].imageSubresource,
147 				pRegions[i].imageOffset,
148 				pRegions[i].imageExtent
149 			};
150 		}
151 
152 		this->pRegions = &regions.front();
153 	}
154 
155 private:
156 	std::vector<VkBufferImageCopy2KHR> regions;
157 };
158 
159 struct CopyImageToBufferInfo : public VkCopyImageToBufferInfo2KHR
160 {
CopyImageToBufferInfovk::CopyImageToBufferInfo161 	CopyImageToBufferInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions)
162 	    : VkCopyImageToBufferInfo2KHR{
163 		    VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR,
164 		    nullptr,
165 		    srcImage,
166 		    srcImageLayout,
167 		    dstBuffer,
168 		    regionCount,
169 		    nullptr
170 	    }
171 	{
172 		regions.resize(regionCount);
173 		for(uint32_t i = 0; i < regionCount; i++)
174 		{
175 			regions[i] = {
176 				VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
177 				nullptr,
178 				pRegions[i].bufferOffset,
179 				pRegions[i].bufferRowLength,
180 				pRegions[i].bufferImageHeight,
181 				pRegions[i].imageSubresource,
182 				pRegions[i].imageOffset,
183 				pRegions[i].imageExtent
184 			};
185 		}
186 
187 		this->pRegions = &regions.front();
188 	}
189 
190 private:
191 	std::vector<VkBufferImageCopy2KHR> regions;
192 };
193 
194 struct ResolveImageInfo : public VkResolveImageInfo2KHR
195 {
ResolveImageInfovk::ResolveImageInfo196 	ResolveImageInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions)
197 	    : VkResolveImageInfo2KHR{
198 		    VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
199 		    nullptr,
200 		    srcImage,
201 		    srcImageLayout,
202 		    dstImage,
203 		    dstImageLayout,
204 		    regionCount,
205 		    nullptr
206 	    }
207 	{
208 		regions.resize(regionCount);
209 		for(uint32_t i = 0; i < regionCount; i++)
210 		{
211 			regions[i] = {
212 				VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
213 				nullptr,
214 				pRegions[i].srcSubresource,
215 				pRegions[i].srcOffset,
216 				pRegions[i].dstSubresource,
217 				pRegions[i].dstOffset,
218 				pRegions[i].extent
219 			};
220 		}
221 
222 		this->pRegions = &regions.front();
223 	}
224 
225 private:
226 	std::vector<VkImageResolve2KHR> regions;
227 };
228 
229 struct ImageSubresource : VkImageSubresource
230 {
ImageSubresourcevk::ImageSubresource231 	ImageSubresource(const VkImageSubresourceLayers &subresourceLayers)
232 	    : VkImageSubresource{
233 		    subresourceLayers.aspectMask,
234 		    subresourceLayers.mipLevel,
235 		    subresourceLayers.baseArrayLayer
236 	    }
237 	{}
238 };
239 
240 struct ImageSubresourceRange : VkImageSubresourceRange
241 {
ImageSubresourceRangevk::ImageSubresourceRange242 	ImageSubresourceRange(const VkImageSubresourceLayers &subresourceLayers)
243 	    : VkImageSubresourceRange{
244 		    subresourceLayers.aspectMask,
245 		    subresourceLayers.mipLevel,
246 		    1,
247 		    subresourceLayers.baseArrayLayer,
248 		    subresourceLayers.layerCount
249 	    }
250 	{}
251 };
252 
253 struct Extent2D : VkExtent2D
254 {
Extent2Dvk::Extent2D255 	Extent2D(const VkExtent3D &extent3D)
256 	    : VkExtent2D{ extent3D.width, extent3D.height }
257 	{}
258 };
259 
260 }  // namespace vk
261 
262 #endif  // VK_STRUCT_CONVERSION_HPP_