MCPcopy Create free account
hub / github.com/KhronosGroup/glTF-IBL-Sampler / convertVkFormat

Function convertVkFormat

lib/source/lib.cpp:103–184  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

101}
102
103Result convertVkFormat(vkHelper& _vulkan, const VkCommandBuffer _commandBuffer, const VkImage _srcImage, VkImage& _outImage, VkFormat _dstFormat, const VkImageLayout inputImageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
104{
105 const VkImageCreateInfo* pInfo = _vulkan.getCreateInfo(_srcImage);
106
107 if (pInfo == nullptr)
108 {
109 return Result::InvalidArgument;
110 }
111
112 if (_outImage != VK_NULL_HANDLE)
113 {
114 printf("Expecting empty outImage\n");
115 return Result::InvalidArgument;
116 }
117
118 const VkFormat srcFormat = pInfo->format;
119 const uint32_t sideLength = pInfo->extent.width;
120 const uint32_t mipLevels = pInfo->mipLevels;
121 const uint32_t arrayLayers = pInfo->arrayLayers;
122
123 if (_vulkan.createImage2DAndAllocate(_outImage, sideLength, sideLength, _dstFormat,
124 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
125 mipLevels, arrayLayers, VK_IMAGE_TILING_OPTIMAL, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_SHARING_MODE_EXCLUSIVE) != VK_SUCCESS)
126 {
127 return Result::VulkanError;
128 }
129
130 VkImageSubresourceRange subresourceRange{};
131 subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
132 subresourceRange.baseMipLevel = 0;
133 subresourceRange.levelCount = mipLevels;
134 subresourceRange.layerCount = arrayLayers;
135
136 _vulkan.imageBarrier(_commandBuffer, _outImage,
137 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
138 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,//src stage, access
139 VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,//dst stage, access
140 subresourceRange);
141
142 _vulkan.imageBarrier(_commandBuffer, _srcImage,
143 inputImageLayout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
144 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,//src stage, access
145 VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_READ_BIT,//dst stage, access
146 subresourceRange);
147
148 uint32_t currentSideLength = sideLength;
149
150 for (uint32_t level = 0; level < mipLevels; level++)
151 {
152 VkImageBlit imageBlit{};
153
154 // Source
155 imageBlit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
156 imageBlit.srcSubresource.layerCount = arrayLayers;
157 imageBlit.srcSubresource.mipLevel = level;
158 imageBlit.srcOffsets[1].x = currentSideLength;
159 imageBlit.srcOffsets[1].y = currentSideLength;
160 imageBlit.srcOffsets[1].z = 1;

Callers 1

sampleMethod · 0.85

Calls 3

getCreateInfoMethod · 0.80
imageBarrierMethod · 0.80

Tested by

no test coverage detected