Always explicitly set CAMetalLayer colorspace and wantsExtendedDynamicRangeContent.

Don't assume the incoming CAMetalLayer has default (no-op) values for colorspace and
wantsExtendedDynamicRangeContent properties, since they could have been set externally.
Ensure the Vulkan app has control over both of these properties.
vkCreateSwapchainKHR() returns VK_ERROR_FORMAT_NOT_SUPPORTED for unsupported colorspaces.
This commit is contained in:
Bill Hollings 2021-03-10 19:59:11 -05:00
parent cd8a0e149e
commit 4d452fdca6
2 changed files with 8 additions and 1 deletions

View File

@ -19,6 +19,7 @@ MoltenVK 1.1.3
Released TBD
- Add support for `HDR10` colorspace via `VK_COLOR_SPACE_HDR10_HLG_EXT` and `VK_COLOR_SPACE_HDR10_ST2084_EXT`.
- Always explicitly set `CAMetalLayer` colorspace property based on _Vulkan_ parameters, and don't rely on _Metal_ default values.
- Remove project qualifiers from references to `SPIRV-Cross` header files.
- Add `MVKConfiguration::apiVersionToAdvertise` and `MVK_CONFIG_API_VERSION_TO_ADVERTISE`
env var to configure **MoltenVK** to advertise a particular _Vulkan_ version.

View File

@ -283,6 +283,7 @@ void MVKSwapchain::initCAMetalLayer(const VkSwapchainCreateInfoKHR* pCreateInfo,
switch (pCreateInfo->imageColorSpace) {
case VK_COLOR_SPACE_SRGB_NONLINEAR_KHR:
_mtlLayer.colorspaceNameMVK = kCGColorSpaceSRGB;
_mtlLayer.wantsExtendedDynamicRangeContentMVK = NO;
break;
case VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT:
_mtlLayer.colorspaceNameMVK = kCGColorSpaceDisplayP3;
@ -306,6 +307,7 @@ void MVKSwapchain::initCAMetalLayer(const VkSwapchainCreateInfoKHR* pCreateInfo,
break;
case VK_COLOR_SPACE_BT709_NONLINEAR_EXT:
_mtlLayer.colorspaceNameMVK = kCGColorSpaceITUR_709;
_mtlLayer.wantsExtendedDynamicRangeContentMVK = NO;
break;
case VK_COLOR_SPACE_BT2020_LINEAR_EXT:
_mtlLayer.colorspaceNameMVK = kCGColorSpaceExtendedLinearITUR_2020;
@ -323,10 +325,14 @@ void MVKSwapchain::initCAMetalLayer(const VkSwapchainCreateInfoKHR* pCreateInfo,
#endif
case VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT:
_mtlLayer.colorspaceNameMVK = kCGColorSpaceAdobeRGB1998;
_mtlLayer.wantsExtendedDynamicRangeContentMVK = NO;
break;
case VK_COLOR_SPACE_PASS_THROUGH_EXT:
_mtlLayer.colorspace = nil;
_mtlLayer.wantsExtendedDynamicRangeContentMVK = NO;
break;
default:
// Nothing - the default is not to do color matching.
setConfigurationResult(reportError(VK_ERROR_FORMAT_NOT_SUPPORTED, "vkCreateSwapchainKHR(): Metal does not support VkColorSpaceKHR value %d.", pCreateInfo->imageColorSpace));
break;
}
_mtlLayer.drawableSize = mvkCGSizeFromVkExtent2D(pCreateInfo->imageExtent);