From 3c3ba7d658505d15de8526858cfcaeeb3f64804d Mon Sep 17 00:00:00 2001 From: slime Date: Tue, 20 Sep 2022 22:10:11 -0300 Subject: [PATCH 1/2] vulkan: initial support for clampzero and clampone wrap modes. --- src/modules/graphics/vulkan/Graphics.cpp | 13 ++++++++++--- src/modules/graphics/vulkan/Vulkan.cpp | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/modules/graphics/vulkan/Graphics.cpp b/src/modules/graphics/vulkan/Graphics.cpp index 14e5e8b4a..3790fe344 100644 --- a/src/modules/graphics/vulkan/Graphics.cpp +++ b/src/modules/graphics/vulkan/Graphics.cpp @@ -557,8 +557,8 @@ void Graphics::initCapabilities() { // fixme: unsure what the first few features are for. capabilities.features[FEATURE_MULTI_RENDER_TARGET_FORMATS] = true; - capabilities.features[FEATURE_CLAMP_ZERO] = false; - capabilities.features[FEATURE_CLAMP_ONE] = false; + capabilities.features[FEATURE_CLAMP_ZERO] = true; + capabilities.features[FEATURE_CLAMP_ONE] = true; capabilities.features[FEATURE_BLEND_MINMAX] = false; capabilities.features[FEATURE_LIGHTEN] = false; capabilities.features[FEATURE_FULL_NPOT] = false; @@ -2527,7 +2527,14 @@ VkSampler Graphics::createSampler(const SamplerState &samplerState) samplerInfo.addressModeW = Vulkan::getWrapMode(samplerState.wrapW); samplerInfo.anisotropyEnable = VK_TRUE; samplerInfo.maxAnisotropy = static_cast(samplerState.maxAnisotropy); - samplerInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK; + + // TODO: This probably needs to branch on a pixel format to determine whether + // it should be float vs int, and opaque vs transparent. + bool clampone = samplerState.wrapU == SamplerState::WRAP_CLAMP_ONE + || samplerState.wrapV == SamplerState::WRAP_CLAMP_ONE + || samplerState.wrapW == SamplerState::WRAP_CLAMP_ONE; + samplerInfo.borderColor = clampone ? VK_BORDER_COLOR_INT_OPAQUE_WHITE : VK_BORDER_COLOR_INT_OPAQUE_BLACK; + samplerInfo.unnormalizedCoordinates = VK_FALSE; if (samplerState.depthSampleMode.hasValue) { diff --git a/src/modules/graphics/vulkan/Vulkan.cpp b/src/modules/graphics/vulkan/Vulkan.cpp index 633299c83..25e39855b 100644 --- a/src/modules/graphics/vulkan/Vulkan.cpp +++ b/src/modules/graphics/vulkan/Vulkan.cpp @@ -665,11 +665,11 @@ VkSamplerAddressMode Vulkan::getWrapMode(SamplerState::WrapMode mode) { switch (mode) { - //fixme: not accounting for different clamps (how does that work in vulkan?) case SamplerState::WRAP_CLAMP: + return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; case SamplerState::WRAP_CLAMP_ZERO: case SamplerState::WRAP_CLAMP_ONE: - return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; case SamplerState::WRAP_REPEAT: return VK_SAMPLER_ADDRESS_MODE_REPEAT; case SamplerState::WRAP_MIRRORED_REPEAT: From 510b73c2b68a8db08598ef215d4dd5f09931bdb6 Mon Sep 17 00:00:00 2001 From: slime Date: Tue, 20 Sep 2022 22:13:32 -0300 Subject: [PATCH 2/2] vulkan supports min/max blend ops --- src/modules/graphics/vulkan/Graphics.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/graphics/vulkan/Graphics.cpp b/src/modules/graphics/vulkan/Graphics.cpp index 3790fe344..6493d574c 100644 --- a/src/modules/graphics/vulkan/Graphics.cpp +++ b/src/modules/graphics/vulkan/Graphics.cpp @@ -559,9 +559,9 @@ void Graphics::initCapabilities() capabilities.features[FEATURE_MULTI_RENDER_TARGET_FORMATS] = true; capabilities.features[FEATURE_CLAMP_ZERO] = true; capabilities.features[FEATURE_CLAMP_ONE] = true; - capabilities.features[FEATURE_BLEND_MINMAX] = false; - capabilities.features[FEATURE_LIGHTEN] = false; - capabilities.features[FEATURE_FULL_NPOT] = false; + capabilities.features[FEATURE_BLEND_MINMAX] = true; + capabilities.features[FEATURE_LIGHTEN] = true; + capabilities.features[FEATURE_FULL_NPOT] = true; capabilities.features[FEATURE_PIXEL_SHADER_HIGHP] = true; capabilities.features[FEATURE_SHADER_DERIVATIVES] = true; capabilities.features[FEATURE_GLSL3] = true;