Browse Source

Metal: fix clamp-to-one texture wrap mode detection.

Alex Szpakowski 3 years ago
parent
commit
4ca3535cd2

+ 1 - 0
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            },

+ 1 - 0
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,

+ 19 - 3
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<MTLSamplerState> 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;

+ 2 - 1
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();