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 = ®ions.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 = ®ions.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 = ®ions.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 = ®ions.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 = ®ions.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 = ®ions.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_