From ce9afc47456f45955fe3c698b5ed2f4d55d3281c Mon Sep 17 00:00:00 2001 From: Chip Davis Date: Sat, 19 Jan 2019 23:24:42 -0600 Subject: [PATCH] Support some more features on iOS. Dual-source blending is supported on all devices starting with iOS 11. Cube arrays are supported on A11. Layered rendering and multiple viewports are supported on A12. --- .../Commands/MVKCommandEncoderState.mm | 8 ------ MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 26 +++++++++++++++++-- MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm | 11 -------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm index 480fc9d7..693d5892 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm +++ b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm @@ -72,15 +72,11 @@ void MVKViewportCommandEncoderState::setViewports(const MVKVector & void MVKViewportCommandEncoderState::encodeImpl() { MVKAssert(!_mtlViewports.empty(), "Must specify at least one viewport"); -#if MVK_MACOS if (_cmdEncoder->getDevice()->_pFeatures->multiViewport) { [_cmdEncoder->_mtlRenderEncoder setViewports: &_mtlViewports[0] count: _mtlViewports.size()]; } else { [_cmdEncoder->_mtlRenderEncoder setViewport: _mtlViewports[0]]; } -#else - [_cmdEncoder->_mtlRenderEncoder setViewport: _mtlViewports[0]]; -#endif } void MVKViewportCommandEncoderState::resetImpl() { @@ -117,15 +113,11 @@ void MVKScissorCommandEncoderState::encodeImpl() { std::for_each(clippedScissors.begin(), clippedScissors.end(), [this](MTLScissorRect& scissor) { scissor = _cmdEncoder->clipToRenderArea(scissor); }); -#if MVK_MACOS if (_cmdEncoder->getDevice()->_pFeatures->multiViewport) { [_cmdEncoder->_mtlRenderEncoder setScissorRects: &clippedScissors[0] count: clippedScissors.size()]; } else { [_cmdEncoder->_mtlRenderEncoder setScissorRect: clippedScissors[0]]; } -#else - [_cmdEncoder->_mtlRenderEncoder setScissorRect: clippedScissors[0]]; -#endif } void MVKScissorCommandEncoderState::resetImpl() { diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index 3e1bc098..ba4d00a4 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -701,9 +701,18 @@ void MVKPhysicalDevice::initFeatures() { _features.shaderSampledImageArrayDynamicIndexing = true; _features.shaderStorageImageArrayDynamicIndexing = true; } + if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily1_v4] ) { + _features.dualSrcBlend = true; + } if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily2_v4] ) { _features.depthClamp = true; } + if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily4_v1] ) { + _features.imageCubeArray = true; + } + if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily5_v1] ) { + _features.multiViewport = true; + } #endif #if MVK_MACOS @@ -828,7 +837,15 @@ void MVKPhysicalDevice::initProperties() { _properties.limits.maxImageDimensionCube = _metalFeatures.maxTextureDimension; _properties.limits.maxFramebufferWidth = _metalFeatures.maxTextureDimension; _properties.limits.maxFramebufferHeight = _metalFeatures.maxTextureDimension; +#if MVK_IOS + if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily5_v1] ) { + _properties.limits.maxFramebufferLayers = 256; + } else { + _properties.limits.maxFramebufferLayers = 1; + } +#else _properties.limits.maxFramebufferLayers = 256; +#endif _properties.limits.maxViewportDimensions[0] = _metalFeatures.maxTextureDimension; _properties.limits.maxViewportDimensions[1] = _metalFeatures.maxTextureDimension; @@ -844,8 +861,13 @@ void MVKPhysicalDevice::initProperties() { } else { _properties.limits.maxViewports = 1; } -#else - _properties.limits.maxViewports = 1; +#endif +#if MVK_IOS + if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily5_v1] ) { + _properties.limits.maxViewports = 16; + } else { + _properties.limits.maxViewports = 1; + } #endif _properties.limits.maxSamplerAnisotropy = 16; diff --git a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm index 91575538..ced437c2 100644 --- a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm +++ b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm @@ -823,9 +823,7 @@ MVK_PUBLIC_SYMBOL MTLTextureType mvkMTLTextureTypeFromVkImageViewType(VkImageVie return MTLTextureType2DArray; case VK_IMAGE_VIEW_TYPE_3D: return MTLTextureType3D; case VK_IMAGE_VIEW_TYPE_CUBE: return MTLTextureTypeCube; -#if MVK_MACOS case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return MTLTextureTypeCubeArray; -#endif default: return MTLTextureType2D; } } @@ -1031,19 +1029,10 @@ MVK_PUBLIC_SYMBOL MTLBlendFactor mvkMTLBlendFactorFromVkBlendFactor(VkBlendFacto case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA: return MTLBlendFactorOneMinusBlendAlpha; case VK_BLEND_FACTOR_SRC_ALPHA_SATURATE: return MTLBlendFactorSourceAlphaSaturated; -#if MVK_IOS - case VK_BLEND_FACTOR_SRC1_COLOR: return MTLBlendFactorSourceColor; - case VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR: return MTLBlendFactorOneMinusSourceColor; - case VK_BLEND_FACTOR_SRC1_ALPHA: return MTLBlendFactorSourceAlpha; - case VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA: return MTLBlendFactorOneMinusSourceAlpha; -#endif - -#if MVK_MACOS case VK_BLEND_FACTOR_SRC1_COLOR: return MTLBlendFactorSource1Color; case VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR: return MTLBlendFactorOneMinusSource1Color; case VK_BLEND_FACTOR_SRC1_ALPHA: return MTLBlendFactorSource1Alpha; case VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA: return MTLBlendFactorOneMinusSource1Alpha; -#endif default: return MTLBlendFactorZero; }