Set array layer and mip level count in texture loader, set initial layout to VK_IMAGE_LAYOUT_PREINITIALIZED (Fixes #29)
This commit is contained in:
parent
5c7394837d
commit
01f0a1a574
1 changed files with 51 additions and 29 deletions
|
|
@ -91,6 +91,7 @@ namespace vkTools
|
||||||
imageCreateInfo.tiling = VK_IMAGE_TILING_LINEAR;
|
imageCreateInfo.tiling = VK_IMAGE_TILING_LINEAR;
|
||||||
imageCreateInfo.usage = (useStaging) ? VK_IMAGE_USAGE_TRANSFER_SRC_BIT : VK_IMAGE_USAGE_SAMPLED_BIT;
|
imageCreateInfo.usage = (useStaging) ? VK_IMAGE_USAGE_TRANSFER_SRC_BIT : VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||||
imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
|
||||||
|
|
||||||
VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo();
|
VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo();
|
||||||
VkMemoryRequirements memReqs;
|
VkMemoryRequirements memReqs;
|
||||||
|
|
@ -148,7 +149,7 @@ namespace vkTools
|
||||||
cmdBuffer,
|
cmdBuffer,
|
||||||
mipLevels[level].image,
|
mipLevels[level].image,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_PREINITIALIZED,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -177,7 +178,7 @@ namespace vkTools
|
||||||
cmdBuffer,
|
cmdBuffer,
|
||||||
texture->image,
|
texture->image,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_PREINITIALIZED,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||||
|
|
||||||
// Copy mip levels one by one
|
// Copy mip levels one by one
|
||||||
|
|
@ -316,7 +317,7 @@ namespace vkTools
|
||||||
cmdBuffer,
|
cmdBuffer,
|
||||||
texture->image,
|
texture->image,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_PREINITIALIZED,
|
||||||
texture->imageLayout);
|
texture->imageLayout);
|
||||||
|
|
||||||
// Submit command buffer containing copy and image layout commands
|
// Submit command buffer containing copy and image layout commands
|
||||||
|
|
@ -437,7 +438,7 @@ namespace vkTools
|
||||||
imageCreateInfo.tiling = VK_IMAGE_TILING_LINEAR;
|
imageCreateInfo.tiling = VK_IMAGE_TILING_LINEAR;
|
||||||
imageCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
imageCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
||||||
imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
imageCreateInfo.flags = 0;
|
imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
|
||||||
|
|
||||||
VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo();
|
VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo();
|
||||||
VkMemoryRequirements memReqs;
|
VkMemoryRequirements memReqs;
|
||||||
|
|
@ -487,7 +488,7 @@ namespace vkTools
|
||||||
cmdBuffer,
|
cmdBuffer,
|
||||||
cubeFace[face].image,
|
cubeFace[face].image,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_PREINITIALIZED,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -514,12 +515,21 @@ namespace vkTools
|
||||||
|
|
||||||
// Image barrier for optimal image (target)
|
// Image barrier for optimal image (target)
|
||||||
// Optimal image will be used as destination for the copy
|
// Optimal image will be used as destination for the copy
|
||||||
setImageLayout(
|
|
||||||
|
// Set initial layout for all array layers of the optimal (target) tiled texture
|
||||||
|
VkImageSubresourceRange subresourceRange = {};
|
||||||
|
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
subresourceRange.baseMipLevel = 0;
|
||||||
|
subresourceRange.levelCount = 1;
|
||||||
|
subresourceRange.layerCount = 6;
|
||||||
|
|
||||||
|
vkTools::setImageLayout(
|
||||||
cmdBuffer,
|
cmdBuffer,
|
||||||
texture->image,
|
texture->image,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_PREINITIALIZED,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||||
|
subresourceRange);
|
||||||
|
|
||||||
// Copy cube map faces one by one
|
// Copy cube map faces one by one
|
||||||
for (uint32_t face = 0; face < 6; ++face)
|
for (uint32_t face = 0; face < 6; ++face)
|
||||||
|
|
@ -550,16 +560,18 @@ namespace vkTools
|
||||||
texture->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
texture->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||||
1, ©Region);
|
1, ©Region);
|
||||||
|
|
||||||
// Change texture image layout to shader read after the copy
|
|
||||||
texture->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
|
||||||
setImageLayout(
|
|
||||||
cmdBuffer,
|
|
||||||
texture->image,
|
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
|
||||||
texture->imageLayout);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Change texture image layout to shader read after the copy
|
||||||
|
texture->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||||
|
setImageLayout(
|
||||||
|
cmdBuffer,
|
||||||
|
texture->image,
|
||||||
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||||
|
texture->imageLayout,
|
||||||
|
subresourceRange);
|
||||||
|
|
||||||
err = vkEndCommandBuffer(cmdBuffer);
|
err = vkEndCommandBuffer(cmdBuffer);
|
||||||
assert(!err);
|
assert(!err);
|
||||||
|
|
||||||
|
|
@ -639,7 +651,7 @@ namespace vkTools
|
||||||
imageCreateInfo.tiling = VK_IMAGE_TILING_LINEAR;
|
imageCreateInfo.tiling = VK_IMAGE_TILING_LINEAR;
|
||||||
imageCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
imageCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
||||||
imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
imageCreateInfo.flags = 0;
|
imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
|
||||||
|
|
||||||
VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo();
|
VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo();
|
||||||
VkMemoryRequirements memReqs;
|
VkMemoryRequirements memReqs;
|
||||||
|
|
@ -700,7 +712,7 @@ namespace vkTools
|
||||||
cmdBuffer,
|
cmdBuffer,
|
||||||
arrayLayer[i].image,
|
arrayLayer[i].image,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_PREINITIALIZED,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -726,12 +738,21 @@ namespace vkTools
|
||||||
|
|
||||||
// Image barrier for optimal image (target)
|
// Image barrier for optimal image (target)
|
||||||
// Optimal image will be used as destination for the copy
|
// Optimal image will be used as destination for the copy
|
||||||
|
|
||||||
|
// Set initial layout for all array layers of the optimal (target) tiled texture
|
||||||
|
VkImageSubresourceRange subresourceRange = {};
|
||||||
|
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
subresourceRange.baseMipLevel = 0;
|
||||||
|
subresourceRange.levelCount = 1;
|
||||||
|
subresourceRange.layerCount = texture->layerCount;
|
||||||
|
|
||||||
vkTools::setImageLayout(
|
vkTools::setImageLayout(
|
||||||
cmdBuffer,
|
cmdBuffer,
|
||||||
texture->image,
|
texture->image,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_PREINITIALIZED,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||||
|
subresourceRange);
|
||||||
|
|
||||||
// Copy cube map faces one by one
|
// Copy cube map faces one by one
|
||||||
for (uint32_t i = 0; i < texture->layerCount; ++i)
|
for (uint32_t i = 0; i < texture->layerCount; ++i)
|
||||||
|
|
@ -761,17 +782,18 @@ namespace vkTools
|
||||||
arrayLayer[i].image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
arrayLayer[i].image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||||
texture->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
texture->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||||
1, ©Region);
|
1, ©Region);
|
||||||
|
|
||||||
// Change texture image layout to shader read after the copy
|
|
||||||
texture->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
|
||||||
vkTools::setImageLayout(
|
|
||||||
cmdBuffer,
|
|
||||||
texture->image,
|
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
|
||||||
texture->imageLayout);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Change texture image layout to shader read after the copy
|
||||||
|
texture->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||||
|
vkTools::setImageLayout(
|
||||||
|
cmdBuffer,
|
||||||
|
texture->image,
|
||||||
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||||
|
texture->imageLayout,
|
||||||
|
subresourceRange);
|
||||||
|
|
||||||
err = vkEndCommandBuffer(cmdBuffer);
|
err = vkEndCommandBuffer(cmdBuffer);
|
||||||
assert(!err);
|
assert(!err);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue