Commit 82cc0cb0 by Chris Forbes

Fix image format properties query in various edge cases

- Many cases where sampleCounts is required to be VK_SAMPLE_COUNT_1_BIT by spec - Missing feature flags for ETC2 formats - Max array layers must be 1 for 3D See 38.1.1 Supported Sample Counts for details of sample count requirements Bug: b/128344974 Test: dEQP-VK.api.info.image_format_properties* Change-Id: I3ffe747a8cc8d06e0d33aa0937bd2b7ecd045ff5 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/26871Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 6a1d92b5
...@@ -401,7 +401,11 @@ void PhysicalDevice::getFormatProperties(VkFormat format, VkFormatProperties* pF ...@@ -401,7 +401,11 @@ void PhysicalDevice::getFormatProperties(VkFormat format, VkFormatProperties* pF
case VK_FORMAT_EAC_R11G11_UNORM_BLOCK: case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
case VK_FORMAT_EAC_R11G11_SNORM_BLOCK: case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
pFormatProperties->optimalTilingFeatures |= pFormatProperties->optimalTilingFeatures |=
VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT; VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
VK_FORMAT_FEATURE_TRANSFER_SRC_BIT |
VK_FORMAT_FEATURE_TRANSFER_DST_BIT |
VK_FORMAT_FEATURE_BLIT_SRC_BIT |
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
break; break;
default: default:
break; break;
...@@ -607,7 +611,9 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type, ...@@ -607,7 +611,9 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type,
VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageUsageFlags usage, VkImageCreateFlags flags,
VkImageFormatProperties* pImageFormatProperties) const VkImageFormatProperties* pImageFormatProperties) const
{ {
pImageFormatProperties->sampleCounts = VK_SAMPLE_COUNT_1_BIT;
pImageFormatProperties->maxArrayLayers = vk::MAX_IMAGE_ARRAY_LAYERS; pImageFormatProperties->maxArrayLayers = vk::MAX_IMAGE_ARRAY_LAYERS;
pImageFormatProperties->maxExtent.depth = 1;
switch(type) switch(type)
{ {
...@@ -615,7 +621,6 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type, ...@@ -615,7 +621,6 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type,
pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_1D; pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_1D;
pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_1D - 1); pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_1D - 1);
pImageFormatProperties->maxExtent.height = 1; pImageFormatProperties->maxExtent.height = 1;
pImageFormatProperties->maxExtent.depth = 1;
break; break;
case VK_IMAGE_TYPE_2D: case VK_IMAGE_TYPE_2D:
if(flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) if(flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT)
...@@ -623,14 +628,21 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type, ...@@ -623,14 +628,21 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type,
pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_CUBE; pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_CUBE;
pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_CUBE - 1); pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_CUBE - 1);
pImageFormatProperties->maxExtent.height = 1 << (vk::MAX_IMAGE_LEVELS_CUBE - 1); pImageFormatProperties->maxExtent.height = 1 << (vk::MAX_IMAGE_LEVELS_CUBE - 1);
pImageFormatProperties->maxExtent.depth = 1;
} }
else else
{ {
pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_2D; pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_2D;
pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_2D - 1); pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_2D - 1);
pImageFormatProperties->maxExtent.height = 1 << (vk::MAX_IMAGE_LEVELS_2D - 1); pImageFormatProperties->maxExtent.height = 1 << (vk::MAX_IMAGE_LEVELS_2D - 1);
pImageFormatProperties->maxExtent.depth = 1;
VkFormatProperties props;
getFormatProperties(format, &props);
auto features = tiling == VK_IMAGE_TILING_LINEAR ? props.linearTilingFeatures : props.optimalTilingFeatures;
if (features & (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))
{
// Only renderable formats make sense for multisample
pImageFormatProperties->sampleCounts = getSampleCounts();
}
} }
break; break;
case VK_IMAGE_TYPE_3D: case VK_IMAGE_TYPE_3D:
...@@ -638,6 +650,7 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type, ...@@ -638,6 +650,7 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type,
pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_3D - 1); pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_3D - 1);
pImageFormatProperties->maxExtent.height = 1 << (vk::MAX_IMAGE_LEVELS_3D - 1); pImageFormatProperties->maxExtent.height = 1 << (vk::MAX_IMAGE_LEVELS_3D - 1);
pImageFormatProperties->maxExtent.depth = 1 << (vk::MAX_IMAGE_LEVELS_3D - 1); pImageFormatProperties->maxExtent.depth = 1 << (vk::MAX_IMAGE_LEVELS_3D - 1);
pImageFormatProperties->maxArrayLayers = 1; // no 3D + layers
break; break;
default: default:
UNREACHABLE(type); UNREACHABLE(type);
...@@ -645,8 +658,6 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type, ...@@ -645,8 +658,6 @@ void PhysicalDevice::getImageFormatProperties(VkFormat format, VkImageType type,
} }
pImageFormatProperties->maxResourceSize = 1 << 31; // Minimum value for maxResourceSize pImageFormatProperties->maxResourceSize = 1 << 31; // Minimum value for maxResourceSize
pImageFormatProperties->sampleCounts = getSampleCounts();
} }
uint32_t PhysicalDevice::getQueueFamilyPropertyCount() const uint32_t PhysicalDevice::getQueueFamilyPropertyCount() const
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment