| 101 | } |
| 102 | |
| 103 | Result 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; |
no test coverage detected