summaryrefslogtreecommitdiffstats
path: root/tools/gfx/vulkan/render-vk.cpp
diff options
context:
space:
mode:
authorlucy96chen <47800040+lucy96chen@users.noreply.github.com>2022-03-21 16:56:11 -0700
committerGitHub <noreply@github.com>2022-03-21 16:56:11 -0700
commit91292b8ca80ede633d1c4effaf8b3f5cf2ac3f2b (patch)
tree8482871a0aac4cb939031c65886432a36068bcda /tools/gfx/vulkan/render-vk.cpp
parent2e1a84add57efd9f8a50a88d0569a48ae4b6d834 (diff)
Add additional texture to texture copying tests (#2165)
* Working on finding a better way to do result comparisons in order to accommodate testing different formats and texture types, copying small to large texture currently half broken * All tests except copying into a buffer with an offset working with new code for results comparison, support for most formats WIP * Replaced SubresourceStuff with ValidationTextureData; Added implementation for ValidationTextureFormat::initializeTexel() and changed generateTextureData() to call this * All implemented formats work on D3D12, a few broken for Vulkan * Fixed numerous locations in render-vk.cpp to set aspect masks based on either the format or the provided TextureAspect; All tests except copy to buffer with offset working on new code structure * All texture to texture copying tests work for all non-compressed formats; Test code cleaned up to minimize the amount of stuff needing to be passed between functions * All tests working with all texture types except TextureCube and all non-compressed formats; Temporarily removing test for copying to a buffer at an offset, will likely return in a separate test file * Small cleanup changes * build fixes
Diffstat (limited to 'tools/gfx/vulkan/render-vk.cpp')
-rw-r--r--tools/gfx/vulkan/render-vk.cpp75
1 files changed, 35 insertions, 40 deletions
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index acf7bcbc5..5d4f046b2 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -1212,6 +1212,25 @@ Result DeviceImpl::createFramebuffer(const IFramebuffer::Desc& desc, IFramebuffe
return SLANG_OK;
}
+VkImageAspectFlags getAspectMaskFromFormat(VkFormat format)
+{
+ switch (format)
+ {
+ case VK_FORMAT_D16_UNORM_S8_UINT:
+ case VK_FORMAT_D24_UNORM_S8_UINT:
+ case VK_FORMAT_D32_SFLOAT_S8_UINT:
+ return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
+ case VK_FORMAT_D16_UNORM:
+ case VK_FORMAT_D32_SFLOAT:
+ case VK_FORMAT_X8_D24_UNORM_PACK32:
+ return VK_IMAGE_ASPECT_DEPTH_BIT;
+ case VK_FORMAT_S8_UINT:
+ return VK_IMAGE_ASPECT_STENCIL_BIT;
+ default:
+ return VK_IMAGE_ASPECT_COLOR_BIT;
+ }
+}
+
SlangResult DeviceImpl::readTextureResource(
ITextureResource* texture,
ResourceState state,
@@ -1280,7 +1299,7 @@ SlangResult DeviceImpl::readTextureResource(
region.bufferRowLength = 0;
region.bufferImageHeight = 0;
- region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ region.imageSubresource.aspectMask = getAspectMaskFromFormat(VulkanUtil::getVkFormat(desc->format));
region.imageSubresource.mipLevel = uint32_t(j);
region.imageSubresource.baseArrayLayer = i;
region.imageSubresource.layerCount = 1;
@@ -1432,12 +1451,7 @@ void DeviceImpl::_transitionImageLayout(
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.image = image;
- if (VulkanUtil::isDepthFormat(format))
- barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
- if (VulkanUtil::isStencilFormat(format))
- barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
- if (barrier.subresourceRange.aspectMask == 0)
- barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ barrier.subresourceRange.aspectMask = getAspectMaskFromFormat(format);
barrier.subresourceRange.baseMipLevel = 0;
barrier.subresourceRange.levelCount = desc.numMipLevels;
@@ -1808,7 +1822,7 @@ Result DeviceImpl::createTextureResource(
region.bufferRowLength = 0; // rowSizeInBytes;
region.bufferImageHeight = 0;
- region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ region.imageSubresource.aspectMask = getAspectMaskFromFormat(format);
region.imageSubresource.mipLevel = uint32_t(j);
region.imageSubresource.baseArrayLayer = i;
region.imageSubresource.layerCount = 1;
@@ -2044,26 +2058,8 @@ Result DeviceImpl::createTextureView(
SLANG_UNIMPLEMENTED_X("Unknown Texture type.");
break;
}
- switch (resourceImpl->m_vkformat)
- {
- case VK_FORMAT_D16_UNORM_S8_UINT:
- case VK_FORMAT_D24_UNORM_S8_UINT:
- case VK_FORMAT_D32_SFLOAT_S8_UINT:
- createInfo.subresourceRange.aspectMask =
- VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
- break;
- case VK_FORMAT_D16_UNORM:
- case VK_FORMAT_D32_SFLOAT:
- case VK_FORMAT_X8_D24_UNORM_PACK32:
- createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
- break;
- case VK_FORMAT_S8_UINT:
- createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
- break;
- default:
- createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- break;
- }
+
+ createInfo.subresourceRange.aspectMask = getAspectMaskFromFormat(resourceImpl->m_vkformat);
createInfo.subresourceRange.baseArrayLayer = desc.subresourceRange.baseArrayLayer;
createInfo.subresourceRange.baseMipLevel = desc.subresourceRange.mipLevel;
@@ -6480,12 +6476,7 @@ void ResourceCommandEncoder::textureBarrier(
barrier.image = image->m_image;
barrier.oldLayout = translateImageLayout(src);
barrier.newLayout = translateImageLayout(dst);
- if (VulkanUtil::isDepthFormat(image->m_vkformat))
- barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
- if (VulkanUtil::isStencilFormat(image->m_vkformat))
- barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
- if (barrier.subresourceRange.aspectMask == 0)
- barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ barrier.subresourceRange.aspectMask = getAspectMaskFromFormat(VulkanUtil::getVkFormat(desc->format));
barrier.subresourceRange.baseArrayLayer = 0;
barrier.subresourceRange.baseMipLevel = 0;
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
@@ -6579,11 +6570,15 @@ void ResourceCommandEncoder::writeTimestamp(IQueryPool* queryPool, SlangInt inde
VkImageAspectFlags ResourceCommandEncoder::getAspectMask(TextureAspect aspect)
{
- if (aspect == TextureAspect::Depth)
- return VK_IMAGE_ASPECT_DEPTH_BIT;
- if (aspect == TextureAspect::Stencil)
- return VK_IMAGE_ASPECT_STENCIL_BIT;
- return VK_IMAGE_ASPECT_COLOR_BIT;
+ VkImageAspectFlags flags = 0;
+
+ if ((uint32_t)aspect & (uint32_t)TextureAspect::Depth)
+ flags |= VK_IMAGE_ASPECT_DEPTH_BIT;
+ if ((uint32_t)aspect & (uint32_t)TextureAspect::Stencil)
+ flags |= VK_IMAGE_ASPECT_STENCIL_BIT;
+ if ((uint32_t)aspect & (uint32_t)TextureAspect::Color)
+ flags |= VK_IMAGE_ASPECT_COLOR_BIT;
+ return flags;
}
void ResourceCommandEncoder::copyTexture(
@@ -6760,7 +6755,7 @@ void ResourceCommandEncoder::uploadTextureData(
region.bufferRowLength = 0; // rowSizeInBytes;
region.bufferImageHeight = 0;
- region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ region.imageSubresource.aspectMask = getAspectMaskFromFormat(dstImpl->m_vkformat);
region.imageSubresource.mipLevel = subResourceRange.mipLevel + uint32_t(j);
region.imageSubresource.baseArrayLayer = subResourceRange.baseArrayLayer + i;
region.imageSubresource.layerCount = 1;