Fix inconsistencies in advertised dimensions vs levels Level count was off by one for the size. Also change vk::MAX_IMAGE_ARRAY_LAYERS to be the actual value rather than log2 -- this was a bug waiting to happen somewhere. Bug: b/118429780 Change-Id: I783a11571f90c34302a4ead8476009d309880eb6 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/26508 Tested-by: Chris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Vulkan/VkConfig.h b/src/Vulkan/VkConfig.h index 84c9d4b..0e4f10c 100644 --- a/src/Vulkan/VkConfig.h +++ b/src/Vulkan/VkConfig.h
@@ -50,7 +50,7 @@ MAX_IMAGE_LEVELS_2D = 14, MAX_IMAGE_LEVELS_3D = 11, MAX_IMAGE_LEVELS_CUBE = 14, - MAX_IMAGE_ARRAY_LAYERS = 11, + MAX_IMAGE_ARRAY_LAYERS = 2048, }; enum
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp index b4bfe61..5c0d9d4 100644 --- a/src/Vulkan/VkPhysicalDevice.cpp +++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -137,11 +137,11 @@ static const VkPhysicalDeviceLimits limits = { - (1 << vk::MAX_IMAGE_LEVELS_1D), // maxImageDimension1D - (1 << vk::MAX_IMAGE_LEVELS_2D), // maxImageDimension2D - (1 << vk::MAX_IMAGE_LEVELS_3D), // maxImageDimension3D - (1 << vk::MAX_IMAGE_LEVELS_CUBE), // maxImageDimensionCube - (1 << vk::MAX_IMAGE_ARRAY_LAYERS), // maxImageArrayLayers + 1 << (vk::MAX_IMAGE_LEVELS_1D - 1), // maxImageDimension1D + 1 << (vk::MAX_IMAGE_LEVELS_2D - 1), // maxImageDimension2D + 1 << (vk::MAX_IMAGE_LEVELS_3D - 1), // maxImageDimension3D + 1 << (vk::MAX_IMAGE_LEVELS_CUBE - 1), // maxImageDimensionCube + vk::MAX_IMAGE_ARRAY_LAYERS, // maxImageArrayLayers 65536, // maxTexelBufferElements 16384, // maxUniformBufferRange (1ul << 27), // maxStorageBufferRange @@ -607,13 +607,13 @@ VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties) const { - pImageFormatProperties->maxArrayLayers = 1 << vk::MAX_IMAGE_ARRAY_LAYERS; + pImageFormatProperties->maxArrayLayers = vk::MAX_IMAGE_ARRAY_LAYERS; switch(type) { case VK_IMAGE_TYPE_1D: pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_1D; - pImageFormatProperties->maxExtent.width = 1 << vk::MAX_IMAGE_LEVELS_1D; + pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_1D - 1); pImageFormatProperties->maxExtent.height = 1; pImageFormatProperties->maxExtent.depth = 1; break; @@ -621,23 +621,23 @@ if(flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) { pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_CUBE; - pImageFormatProperties->maxExtent.width = 1 << vk::MAX_IMAGE_LEVELS_CUBE; - pImageFormatProperties->maxExtent.height = 1 << vk::MAX_IMAGE_LEVELS_CUBE; + pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_CUBE - 1); + pImageFormatProperties->maxExtent.height = 1 << (vk::MAX_IMAGE_LEVELS_CUBE - 1); pImageFormatProperties->maxExtent.depth = 1; } else { pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_2D; - pImageFormatProperties->maxExtent.width = 1 << vk::MAX_IMAGE_LEVELS_2D; - pImageFormatProperties->maxExtent.height = 1 << vk::MAX_IMAGE_LEVELS_2D; + pImageFormatProperties->maxExtent.width = 1 << (vk::MAX_IMAGE_LEVELS_2D - 1); + pImageFormatProperties->maxExtent.height = 1 << (vk::MAX_IMAGE_LEVELS_2D - 1); pImageFormatProperties->maxExtent.depth = 1; } break; case VK_IMAGE_TYPE_3D: pImageFormatProperties->maxMipLevels = vk::MAX_IMAGE_LEVELS_3D; - pImageFormatProperties->maxExtent.width = 1 << vk::MAX_IMAGE_LEVELS_3D; - pImageFormatProperties->maxExtent.height = 1 << vk::MAX_IMAGE_LEVELS_3D; - pImageFormatProperties->maxExtent.depth = 1 << vk::MAX_IMAGE_LEVELS_3D; + pImageFormatProperties->maxExtent.width = 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); break; default: UNREACHABLE(type);