From 5280e9515ac18d6ec63078e721bebc5ebda8e582 Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Thu, 28 Jun 2018 17:46:14 -0400 Subject: [PATCH] vkGetPhysicalDeviceImageFormatProperties() indicate 1D texture limitations. --- MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index a48259c2..a60d5d06 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -111,33 +111,42 @@ VkResult MVKPhysicalDevice::getImageFormatProperties(VkFormat format, VkPhysicalDeviceLimits* pLimits = &_properties.limits; VkExtent3D maxExt; uint32_t maxLayers; + uint32_t maxLevels; switch (type) { case VK_IMAGE_TYPE_1D: + // Metal does not allow 1D textures to be used as attachments + if (mvkIsAnyFlagEnabled(usage, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) { + return VK_ERROR_FORMAT_NOT_SUPPORTED; + } maxExt.width = pLimits->maxImageDimension1D; maxExt.height = 1; maxExt.depth = 1; + maxLevels = 1; maxLayers = pLimits->maxImageArrayLayers; break; case VK_IMAGE_TYPE_2D: maxExt.width = pLimits->maxImageDimension2D; maxExt.height = pLimits->maxImageDimension2D; maxExt.depth = 1; + maxLevels = mvkMipmapLevels3D(maxExt); maxLayers = pLimits->maxImageArrayLayers; break; case VK_IMAGE_TYPE_3D: maxExt.width = pLimits->maxImageDimension3D; maxExt.height = pLimits->maxImageDimension3D; maxExt.depth = pLimits->maxImageDimension3D; + maxLevels = mvkMipmapLevels3D(maxExt); maxLayers = 1; break; default: maxExt = { 1, 1, 1}; maxLayers = 1; + maxLevels = 1; break; } pImageFormatProperties->maxExtent = maxExt; - pImageFormatProperties->maxMipLevels = mvkMipmapLevels3D(maxExt); + pImageFormatProperties->maxMipLevels = maxLevels; pImageFormatProperties->maxArrayLayers = maxLayers; pImageFormatProperties->sampleCounts = _metalFeatures.supportedSampleCounts; pImageFormatProperties->maxResourceSize = kMVKUndefinedLargeUInt64;