From 4ca3535cd26a6f7e38b71d20d11c0e27fb810ec2 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sat, 15 Jan 2022 23:31:07 -0400 Subject: [PATCH] Metal: fix clamp-to-one texture wrap mode detection. --- src/modules/graphics/Graphics.cpp | 1 + src/modules/graphics/Graphics.h | 1 + src/modules/graphics/metal/Graphics.mm | 22 +++++++++++++++++++--- src/modules/graphics/opengl/Graphics.cpp | 3 ++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/modules/graphics/Graphics.cpp b/src/modules/graphics/Graphics.cpp index a27992dc3..e54773e19 100644 --- a/src/modules/graphics/Graphics.cpp +++ b/src/modules/graphics/Graphics.cpp @@ -2302,6 +2302,7 @@ STRINGMAP_CLASS_BEGIN(Graphics, Graphics::Feature, Graphics::FEATURE_MAX_ENUM, f { { "multirendertargetformats", Graphics::FEATURE_MULTI_RENDER_TARGET_FORMATS }, { "clampzero", Graphics::FEATURE_CLAMP_ZERO }, + { "clampone", Graphics::FEATURE_CLAMP_ONE }, { "blendminmax", Graphics::FEATURE_BLEND_MINMAX }, { "lighten", Graphics::FEATURE_LIGHTEN }, { "fullnpot", Graphics::FEATURE_FULL_NPOT }, diff --git a/src/modules/graphics/Graphics.h b/src/modules/graphics/Graphics.h index 58ab4a298..d3fb68750 100644 --- a/src/modules/graphics/Graphics.h +++ b/src/modules/graphics/Graphics.h @@ -147,6 +147,7 @@ public: { FEATURE_MULTI_RENDER_TARGET_FORMATS, FEATURE_CLAMP_ZERO, + FEATURE_CLAMP_ONE, FEATURE_BLEND_MINMAX, FEATURE_LIGHTEN, // Deprecated FEATURE_FULL_NPOT, diff --git a/src/modules/graphics/metal/Graphics.mm b/src/modules/graphics/metal/Graphics.mm index 099ece420..3691a5abd 100644 --- a/src/modules/graphics/metal/Graphics.mm +++ b/src/modules/graphics/metal/Graphics.mm @@ -67,7 +67,7 @@ static MTLSamplerAddressMode getMTLSamplerAddressMode(SamplerState::WrapMode mod case SamplerState::WRAP_CLAMP: return MTLSamplerAddressModeClampToEdge; case SamplerState::WRAP_CLAMP_ZERO: return MTLSamplerAddressModeClampToZero; case SamplerState::WRAP_CLAMP_ONE: - if (@available(macOS 10.12, iOS 10.14, *)) + if (@available(macOS 10.12, iOS 14.0, *)) return MTLSamplerAddressModeClampToBorderColor; else return MTLSamplerAddressModeClampToZero; @@ -747,8 +747,17 @@ id Graphics::getCachedSampler(const SamplerState &s) if (isClampOne(s.wrapU) || isClampOne(s.wrapV) || isClampOne(s.wrapW)) { - if (@available(macOS 10.12, iOS 14.0, *)) + if (capabilities.features[FEATURE_CLAMP_ONE]) desc.borderColor = MTLSamplerBorderColorOpaqueWhite; + else + { + if (isClampOne(s.wrapU)) + desc.sAddressMode = MTLSamplerAddressModeClampToZero; + if (isClampOne(s.wrapV)) + desc.tAddressMode = MTLSamplerAddressModeClampToZero; + if (isClampOne(s.wrapW)) + desc.rAddressMode = MTLSamplerAddressModeClampToZero; + } } desc.lodMinClamp = s.minLod; @@ -2093,6 +2102,13 @@ void Graphics::initCapabilities() capabilities.features[FEATURE_MULTI_RENDER_TARGET_FORMATS] = true; capabilities.features[FEATURE_CLAMP_ZERO] = true; + capabilities.features[FEATURE_CLAMP_ONE] = false; + if (@available(macOS 10.12, iOS 14.0, *)) + { + // Requires "border color" feature. + if (families.mac[1] || families.macCatalyst[1] || families.apple[7]) + capabilities.features[FEATURE_CLAMP_ONE] = true; + } capabilities.features[FEATURE_BLEND_MINMAX] = true; capabilities.features[FEATURE_LIGHTEN] = true; capabilities.features[FEATURE_FULL_NPOT] = true; @@ -2107,7 +2123,7 @@ void Graphics::initCapabilities() capabilities.features[FEATURE_COPY_BUFFER_TO_TEXTURE] = true; capabilities.features[FEATURE_COPY_TEXTURE_TO_BUFFER] = true; capabilities.features[FEATURE_COPY_RENDER_TARGET_TO_BUFFER] = true; - static_assert(FEATURE_MAX_ENUM == 16, "Graphics::initCapabilities must be updated when adding a new graphics feature!"); + static_assert(FEATURE_MAX_ENUM == 17, "Graphics::initCapabilities must be updated when adding a new graphics feature!"); // https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf capabilities.limits[LIMIT_POINT_SIZE] = 511; diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 38d996c40..d10663048 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -1654,6 +1654,7 @@ void Graphics::initCapabilities() { capabilities.features[FEATURE_MULTI_RENDER_TARGET_FORMATS] = gl.isMultiFormatMRTSupported(); capabilities.features[FEATURE_CLAMP_ZERO] = gl.isClampZeroOneTextureWrapSupported(); + capabilities.features[FEATURE_CLAMP_ONE] = gl.isClampZeroOneTextureWrapSupported(); capabilities.features[FEATURE_BLEND_MINMAX] = GLAD_VERSION_1_4 || GLAD_ES_VERSION_3_0 || GLAD_EXT_blend_minmax; capabilities.features[FEATURE_LIGHTEN] = capabilities.features[FEATURE_BLEND_MINMAX]; capabilities.features[FEATURE_FULL_NPOT] = GLAD_VERSION_2_0 || GLAD_ES_VERSION_3_0 || GLAD_OES_texture_npot; @@ -1668,7 +1669,7 @@ void Graphics::initCapabilities() capabilities.features[FEATURE_COPY_BUFFER_TO_TEXTURE] = gl.isCopyBufferToTextureSupported(); capabilities.features[FEATURE_COPY_TEXTURE_TO_BUFFER] = gl.isCopyTextureToBufferSupported(); capabilities.features[FEATURE_COPY_RENDER_TARGET_TO_BUFFER] = gl.isCopyRenderTargetToBufferSupported(); - static_assert(FEATURE_MAX_ENUM == 16, "Graphics::initCapabilities must be updated when adding a new graphics feature!"); + static_assert(FEATURE_MAX_ENUM == 17, "Graphics::initCapabilities must be updated when adding a new graphics feature!"); capabilities.limits[LIMIT_POINT_SIZE] = gl.getMaxPointSize(); capabilities.limits[LIMIT_TEXTURE_SIZE] = gl.getMax2DTextureSize();