// Copyright 2021 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef VK_STRUCT_CONVERSION_HPP_ #define VK_STRUCT_CONVERSION_HPP_ #include "Vulkan/VulkanPlatform.hpp" #include namespace vk { struct CopyBufferInfo : public VkCopyBufferInfo2KHR { CopyBufferInfo(VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy *pRegions) : VkCopyBufferInfo2KHR{ VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR, nullptr, srcBuffer, dstBuffer, regionCount, nullptr } { regions.resize(regionCount); for(uint32_t i = 0; i < regionCount; i++) { regions[i] = { VK_STRUCTURE_TYPE_BUFFER_COPY_2_KHR, nullptr, pRegions[i].srcOffset, pRegions[i].dstOffset, pRegions[i].size }; } this->pRegions = ®ions.front(); } private: std::vector regions; }; struct CopyImageInfo : public VkCopyImageInfo2KHR { CopyImageInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) : VkCopyImageInfo2KHR{ VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR, nullptr, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, nullptr } { regions.resize(regionCount); for(uint32_t i = 0; i < regionCount; i++) { regions[i] = { VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR, nullptr, pRegions[i].srcSubresource, pRegions[i].srcOffset, pRegions[i].dstSubresource, pRegions[i].dstOffset, pRegions[i].extent }; } this->pRegions = ®ions.front(); } private: std::vector regions; }; struct BlitImageInfo : public VkBlitImageInfo2KHR { BlitImageInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) : VkBlitImageInfo2KHR{ VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2_KHR, nullptr, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, nullptr, filter } { regions.resize(regionCount); for(uint32_t i = 0; i < regionCount; i++) { regions[i] = { VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR, nullptr, pRegions[i].srcSubresource, { pRegions[i].srcOffsets[0], pRegions[i].srcOffsets[1] }, pRegions[i].dstSubresource, { pRegions[i].dstOffsets[0], pRegions[i].dstOffsets[1] } }; } this->pRegions = ®ions.front(); } private: std::vector regions; }; struct CopyBufferToImageInfo : public VkCopyBufferToImageInfo2KHR { CopyBufferToImageInfo(VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) : VkCopyBufferToImageInfo2KHR{ VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR, nullptr, srcBuffer, dstImage, dstImageLayout, regionCount, nullptr } { regions.resize(regionCount); for(uint32_t i = 0; i < regionCount; i++) { regions[i] = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR, nullptr, pRegions[i].bufferOffset, pRegions[i].bufferRowLength, pRegions[i].bufferImageHeight, pRegions[i].imageSubresource, pRegions[i].imageOffset, pRegions[i].imageExtent }; } this->pRegions = ®ions.front(); } private: std::vector regions; }; struct CopyImageToBufferInfo : public VkCopyImageToBufferInfo2KHR { CopyImageToBufferInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) : VkCopyImageToBufferInfo2KHR{ VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR, nullptr, srcImage, srcImageLayout, dstBuffer, regionCount, nullptr } { regions.resize(regionCount); for(uint32_t i = 0; i < regionCount; i++) { regions[i] = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR, nullptr, pRegions[i].bufferOffset, pRegions[i].bufferRowLength, pRegions[i].bufferImageHeight, pRegions[i].imageSubresource, pRegions[i].imageOffset, pRegions[i].imageExtent }; } this->pRegions = ®ions.front(); } private: std::vector regions; }; struct ResolveImageInfo : public VkResolveImageInfo2KHR { ResolveImageInfo(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) : VkResolveImageInfo2KHR{ VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR, nullptr, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, nullptr } { regions.resize(regionCount); for(uint32_t i = 0; i < regionCount; i++) { regions[i] = { VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR, nullptr, pRegions[i].srcSubresource, pRegions[i].srcOffset, pRegions[i].dstSubresource, pRegions[i].dstOffset, pRegions[i].extent }; } this->pRegions = ®ions.front(); } private: std::vector regions; }; struct ImageSubresource : VkImageSubresource { ImageSubresource(const VkImageSubresourceLayers &subresourceLayers) : VkImageSubresource{ subresourceLayers.aspectMask, subresourceLayers.mipLevel, subresourceLayers.baseArrayLayer } {} }; struct ImageSubresourceRange : VkImageSubresourceRange { ImageSubresourceRange(const VkImageSubresourceLayers &subresourceLayers) : VkImageSubresourceRange{ subresourceLayers.aspectMask, subresourceLayers.mipLevel, 1, subresourceLayers.baseArrayLayer, subresourceLayers.layerCount } {} }; struct Extent2D : VkExtent2D { Extent2D(const VkExtent3D &extent3D) : VkExtent2D{ extent3D.width, extent3D.height } {} }; } // namespace vk #endif // VK_STRUCT_CONVERSION_HPP_