summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-09-16 00:13:03 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-09-16 00:13:03 +0000
commit4a80b1fb5b5ddd333e2786370feb17b5e8d7aea6 (patch)
tree4508e411854a73a43a2f14b783cbb4fd94f7af04 /Graphics/GraphicsEngineVulkan
parentFixed validation of Texture1D/Texture1DArray parameters for compressed formats (diff)
downloadDiligentCore-4a80b1fb5b5ddd333e2786370feb17b5e8d7aea6.tar.gz
DiligentCore-4a80b1fb5b5ddd333e2786370feb17b5e8d7aea6.zip
Reworked texture format info reporting
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/src/RenderDeviceVkImpl.cpp121
1 files changed, 68 insertions, 53 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/RenderDeviceVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/RenderDeviceVkImpl.cpp
index 863197bb..e2580500 100644
--- a/Graphics/GraphicsEngineVulkan/src/RenderDeviceVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/RenderDeviceVkImpl.cpp
@@ -412,87 +412,102 @@ void RenderDeviceVkImpl::TestTextureFormat(TEXTURE_FORMAT TexFormat)
auto vkPhysicalDevice = m_PhysicalDevice->GetVkDeviceHandle();
- auto SRVFormat = GetDefaultTextureViewFormat(TexFormat, TEXTURE_VIEW_SHADER_RESOURCE, BIND_SHADER_RESOURCE);
- auto RTVFormat = GetDefaultTextureViewFormat(TexFormat, TEXTURE_VIEW_RENDER_TARGET, BIND_RENDER_TARGET);
- auto DSVFormat = GetDefaultTextureViewFormat(TexFormat, TEXTURE_VIEW_DEPTH_STENCIL, BIND_DEPTH_STENCIL);
-
- if (SRVFormat != TEX_FORMAT_UNKNOWN)
+ auto CheckFormatProperties =
+ [vkPhysicalDevice](VkFormat vkFmt, VkImageType vkImgType, VkImageUsageFlags vkUsage, VkImageFormatProperties& ImgFmtProps) //
{
- VkFormat vkSrvFormat = TexFormatToVkFormat(SRVFormat);
- VkFormatProperties vkSrvFmtProps = {};
- vkGetPhysicalDeviceFormatProperties(vkPhysicalDevice, vkSrvFormat, &vkSrvFmtProps);
+ auto err = vkGetPhysicalDeviceImageFormatProperties(vkPhysicalDevice, vkFmt, vkImgType, VK_IMAGE_TILING_OPTIMAL,
+ vkUsage, 0, &ImgFmtProps);
+ return err == VK_SUCCESS;
+ };
- if (vkSrvFmtProps.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
- {
- TexFormatInfo.Filterable = true;
- {
- VkImageFormatProperties ImgFmtProps = {};
+ TexFormatInfo.BindFlags = BIND_NONE;
+ TexFormatInfo.Dimensions = RESOURCE_DIMENSION_SUPPORT_NONE;
- auto err = vkGetPhysicalDeviceImageFormatProperties(vkPhysicalDevice, vkSrvFormat, VK_IMAGE_TYPE_1D, VK_IMAGE_TILING_OPTIMAL,
- VK_IMAGE_USAGE_SAMPLED_BIT, 0, &ImgFmtProps);
- TexFormatInfo.Tex1DFmt = err == VK_SUCCESS;
- }
+ {
+ auto SRVFormat = GetDefaultTextureViewFormat(TexFormat, TEXTURE_VIEW_SHADER_RESOURCE, BIND_SHADER_RESOURCE);
+ if (SRVFormat != TEX_FORMAT_UNKNOWN)
+ {
+ VkFormat vkSrvFormat = TexFormatToVkFormat(SRVFormat);
+ VkFormatProperties vkSrvFmtProps = {};
+ vkGetPhysicalDeviceFormatProperties(vkPhysicalDevice, vkSrvFormat, &vkSrvFmtProps);
+ if (vkSrvFmtProps.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
{
+ TexFormatInfo.Filterable = true;
+ TexFormatInfo.BindFlags |= BIND_SHADER_RESOURCE;
+
VkImageFormatProperties ImgFmtProps = {};
+ if (CheckFormatProperties(vkSrvFormat, VK_IMAGE_TYPE_1D, VK_IMAGE_USAGE_SAMPLED_BIT, ImgFmtProps))
+ TexFormatInfo.Dimensions |= RESOURCE_DIMENSION_SUPPORT_TEX_1D | RESOURCE_DIMENSION_SUPPORT_TEX_1D_ARRAY;
- auto err = vkGetPhysicalDeviceImageFormatProperties(vkPhysicalDevice, vkSrvFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
- VK_IMAGE_USAGE_SAMPLED_BIT, 0, &ImgFmtProps);
- TexFormatInfo.Tex2DFmt = err == VK_SUCCESS;
- }
+ if (CheckFormatProperties(vkSrvFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_USAGE_SAMPLED_BIT, ImgFmtProps))
+ TexFormatInfo.Dimensions |= RESOURCE_DIMENSION_SUPPORT_TEX_2D | RESOURCE_DIMENSION_SUPPORT_TEX_2D_ARRAY;
- {
- VkImageFormatProperties ImgFmtProps = {};
+ if (CheckFormatProperties(vkSrvFormat, VK_IMAGE_TYPE_3D, VK_IMAGE_USAGE_SAMPLED_BIT, ImgFmtProps))
+ TexFormatInfo.Dimensions |= RESOURCE_DIMENSION_SUPPORT_TEX_3D;
- auto err = vkGetPhysicalDeviceImageFormatProperties(vkPhysicalDevice, vkSrvFormat, VK_IMAGE_TYPE_3D, VK_IMAGE_TILING_OPTIMAL,
- VK_IMAGE_USAGE_SAMPLED_BIT, 0, &ImgFmtProps);
- TexFormatInfo.Tex3DFmt = err == VK_SUCCESS;
+ {
+ auto err = vkGetPhysicalDeviceImageFormatProperties(vkPhysicalDevice, vkSrvFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
+ VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, &ImgFmtProps);
+ if (err == VK_SUCCESS)
+ TexFormatInfo.Dimensions |= RESOURCE_DIMENSION_SUPPORT_TEX_CUBE | RESOURCE_DIMENSION_SUPPORT_TEX_CUBE_ARRAY;
+ }
}
+ }
+ }
+
+ {
+ auto RTVFormat = GetDefaultTextureViewFormat(TexFormat, TEXTURE_VIEW_RENDER_TARGET, BIND_RENDER_TARGET);
+ if (RTVFormat != TEX_FORMAT_UNKNOWN)
+ {
+ VkFormat vkRtvFormat = TexFormatToVkFormat(RTVFormat);
+ VkFormatProperties vkRtvFmtProps = {};
+ vkGetPhysicalDeviceFormatProperties(vkPhysicalDevice, vkRtvFormat, &vkRtvFmtProps);
+ if (vkRtvFmtProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)
{
- VkImageFormatProperties ImgFmtProps = {};
+ TexFormatInfo.BindFlags |= BIND_RENDER_TARGET;
- auto err = vkGetPhysicalDeviceImageFormatProperties(vkPhysicalDevice, vkSrvFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
- VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, &ImgFmtProps);
- TexFormatInfo.TexCubeFmt = err == VK_SUCCESS;
+ VkImageFormatProperties ImgFmtProps = {};
+ if (CheckFormatProperties(vkRtvFormat, VK_IMAGE_TYPE_2D, VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT, ImgFmtProps))
+ {
+ TexFormatInfo.SampleCounts = ImgFmtProps.sampleCounts;
+ }
}
}
}
- if (RTVFormat != TEX_FORMAT_UNKNOWN)
{
- VkFormat vkRtvFormat = TexFormatToVkFormat(RTVFormat);
- VkFormatProperties vkRtvFmtProps = {};
- vkGetPhysicalDeviceFormatProperties(vkPhysicalDevice, vkRtvFormat, &vkRtvFmtProps);
- if (vkRtvFmtProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)
+ auto DSVFormat = GetDefaultTextureViewFormat(TexFormat, TEXTURE_VIEW_DEPTH_STENCIL, BIND_DEPTH_STENCIL);
+ if (DSVFormat != TEX_FORMAT_UNKNOWN)
{
- VkImageFormatProperties ImgFmtProps = {};
-
- auto err = vkGetPhysicalDeviceImageFormatProperties(vkPhysicalDevice, vkRtvFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &ImgFmtProps);
- TexFormatInfo.ColorRenderable = err == VK_SUCCESS;
- if (TexFormatInfo.ColorRenderable)
+ VkFormat vkDsvFormat = TexFormatToVkFormat(DSVFormat);
+ VkFormatProperties vkDsvFmtProps = {};
+ vkGetPhysicalDeviceFormatProperties(vkPhysicalDevice, vkDsvFormat, &vkDsvFmtProps);
+ if (vkDsvFmtProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
{
- TexFormatInfo.SampleCounts = ImgFmtProps.sampleCounts;
+ TexFormatInfo.BindFlags |= BIND_DEPTH_STENCIL;
+
+ VkImageFormatProperties ImgFmtProps = {};
+ if (CheckFormatProperties(vkDsvFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, ImgFmtProps))
+ {
+ TexFormatInfo.SampleCounts = ImgFmtProps.sampleCounts;
+ }
}
}
}
- if (DSVFormat != TEX_FORMAT_UNKNOWN)
{
- VkFormat vkDsvFormat = TexFormatToVkFormat(DSVFormat);
- VkFormatProperties vkDsvFmtProps = {};
- vkGetPhysicalDeviceFormatProperties(vkPhysicalDevice, vkDsvFormat, &vkDsvFmtProps);
- if (vkDsvFmtProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
+ auto UAVFormat = GetDefaultTextureViewFormat(TexFormat, TEXTURE_VIEW_UNORDERED_ACCESS, BIND_DEPTH_STENCIL);
+ if (UAVFormat != TEX_FORMAT_UNKNOWN)
{
- VkImageFormatProperties ImgFmtProps = {};
- auto err = vkGetPhysicalDeviceImageFormatProperties(vkPhysicalDevice, vkDsvFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
- VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &ImgFmtProps);
- TexFormatInfo.DepthRenderable = err == VK_SUCCESS;
- if (TexFormatInfo.DepthRenderable)
+ VkFormat vkUavFormat = TexFormatToVkFormat(UAVFormat);
+ VkFormatProperties vkUavFmtProps = {};
+ vkGetPhysicalDeviceFormatProperties(vkPhysicalDevice, vkUavFormat, &vkUavFmtProps);
+ if (vkUavFmtProps.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)
{
- TexFormatInfo.SampleCounts = ImgFmtProps.sampleCounts;
+ TexFormatInfo.BindFlags |= BIND_UNORDERED_ACCESS;
}
}
}