Add default Undefined sampler compare function
Bug: dawn:367
Change-Id: I27ee54b0117c90dd554690e4fabc939d679c4005
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/18422
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/dawn.json b/dawn.json
index 75ce922..c81e797 100644
--- a/dawn.json
+++ b/dawn.json
@@ -394,14 +394,15 @@
"compare function": {
"category": "enum",
"values": [
- {"value": 0, "name": "never"},
- {"value": 1, "name": "less"},
- {"value": 2, "name": "less equal"},
- {"value": 3, "name": "greater"},
- {"value": 4, "name": "greater equal"},
- {"value": 5, "name": "equal"},
- {"value": 6, "name": "not equal"},
- {"value": 7, "name": "always"}
+ {"value": 0, "name": "undefined"},
+ {"value": 1, "name": "never"},
+ {"value": 2, "name": "less"},
+ {"value": 3, "name": "less equal"},
+ {"value": 4, "name": "greater"},
+ {"value": 5, "name": "greater equal"},
+ {"value": 6, "name": "equal"},
+ {"value": 7, "name": "not equal"},
+ {"value": 8, "name": "always"}
]
},
"compute pass descriptor": {
@@ -1248,7 +1249,7 @@
{"name": "mipmap filter", "type": "filter mode", "default": "nearest"},
{"name": "lod min clamp", "type": "float", "default": "0.0f"},
{"name": "lod max clamp", "type": "float", "default": "1000.0f"},
- {"name": "compare", "type": "compare function", "default": "never"}
+ {"name": "compare", "type": "compare function", "default": "undefined"}
]
},
"sampler descriptor dummy anisotropic filtering": {
diff --git a/src/dawn_native/d3d12/SamplerD3D12.cpp b/src/dawn_native/d3d12/SamplerD3D12.cpp
index ecea147..070b0af 100644
--- a/src/dawn_native/d3d12/SamplerD3D12.cpp
+++ b/src/dawn_native/d3d12/SamplerD3D12.cpp
@@ -83,7 +83,12 @@
mSamplerDesc.AddressW = AddressMode(descriptor->addressModeW);
mSamplerDesc.MipLODBias = 0.f;
mSamplerDesc.MaxAnisotropy = 1;
- mSamplerDesc.ComparisonFunc = ToD3D12ComparisonFunc(descriptor->compare);
+ if (descriptor->compare != wgpu::CompareFunction::Undefined) {
+ mSamplerDesc.ComparisonFunc = ToD3D12ComparisonFunc(descriptor->compare);
+ } else {
+ // Still set the function so it's not garbage.
+ mSamplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
+ }
mSamplerDesc.MinLOD = descriptor->lodMinClamp;
mSamplerDesc.MaxLOD = descriptor->lodMaxClamp;
}
diff --git a/src/dawn_native/d3d12/UtilsD3D12.cpp b/src/dawn_native/d3d12/UtilsD3D12.cpp
index a8acec9..04e6669 100644
--- a/src/dawn_native/d3d12/UtilsD3D12.cpp
+++ b/src/dawn_native/d3d12/UtilsD3D12.cpp
@@ -20,22 +20,22 @@
D3D12_COMPARISON_FUNC ToD3D12ComparisonFunc(wgpu::CompareFunction func) {
switch (func) {
- case wgpu::CompareFunction::Always:
- return D3D12_COMPARISON_FUNC_ALWAYS;
- case wgpu::CompareFunction::Equal:
- return D3D12_COMPARISON_FUNC_EQUAL;
- case wgpu::CompareFunction::Greater:
- return D3D12_COMPARISON_FUNC_GREATER;
- case wgpu::CompareFunction::GreaterEqual:
- return D3D12_COMPARISON_FUNC_GREATER_EQUAL;
+ case wgpu::CompareFunction::Never:
+ return D3D12_COMPARISON_FUNC_NEVER;
case wgpu::CompareFunction::Less:
return D3D12_COMPARISON_FUNC_LESS;
case wgpu::CompareFunction::LessEqual:
return D3D12_COMPARISON_FUNC_LESS_EQUAL;
- case wgpu::CompareFunction::Never:
- return D3D12_COMPARISON_FUNC_NEVER;
+ case wgpu::CompareFunction::Greater:
+ return D3D12_COMPARISON_FUNC_GREATER;
+ case wgpu::CompareFunction::GreaterEqual:
+ return D3D12_COMPARISON_FUNC_GREATER_EQUAL;
+ case wgpu::CompareFunction::Equal:
+ return D3D12_COMPARISON_FUNC_EQUAL;
case wgpu::CompareFunction::NotEqual:
return D3D12_COMPARISON_FUNC_NOT_EQUAL;
+ case wgpu::CompareFunction::Always:
+ return D3D12_COMPARISON_FUNC_ALWAYS;
default:
UNREACHABLE();
}
diff --git a/src/dawn_native/metal/SamplerMTL.mm b/src/dawn_native/metal/SamplerMTL.mm
index e894686..eabc735 100644
--- a/src/dawn_native/metal/SamplerMTL.mm
+++ b/src/dawn_native/metal/SamplerMTL.mm
@@ -52,7 +52,7 @@
// static
ResultOrError<Sampler*> Sampler::Create(Device* device, const SamplerDescriptor* descriptor) {
- if (descriptor->compare != wgpu::CompareFunction::Never &&
+ if (descriptor->compare != wgpu::CompareFunction::Undefined &&
device->IsToggleEnabled(Toggle::MetalDisableSamplerCompare)) {
return DAWN_VALIDATION_ERROR("Sampler compare function not supported.");
}
@@ -75,10 +75,12 @@
mtlDesc.lodMinClamp = descriptor->lodMinClamp;
mtlDesc.lodMaxClamp = descriptor->lodMaxClamp;
- if (descriptor->compare != wgpu::CompareFunction::Never) {
- // Anything other than Never is unsupported before A9, which we validate in
+ if (descriptor->compare != wgpu::CompareFunction::Undefined) {
+ // Sampler compare is unsupported before A9, which we validate in
// Sampler::Create.
mtlDesc.compareFunction = ToMetalCompareFunction(descriptor->compare);
+ // The value is default-initialized in the else-case, and we don't set it or the
+ // Metal debug device errors.
}
mMtlSamplerState = [device->GetMTLDevice() newSamplerStateWithDescriptor:mtlDesc];
diff --git a/src/dawn_native/metal/UtilsMetal.mm b/src/dawn_native/metal/UtilsMetal.mm
index 190c0e9..aeb4f7a 100644
--- a/src/dawn_native/metal/UtilsMetal.mm
+++ b/src/dawn_native/metal/UtilsMetal.mm
@@ -14,6 +14,8 @@
#include "dawn_native/metal/UtilsMetal.h"
+#include "common/Assert.h"
+
namespace dawn_native { namespace metal {
MTLCompareFunction ToMetalCompareFunction(wgpu::CompareFunction compareFunction) {
@@ -34,6 +36,8 @@
return MTLCompareFunctionEqual;
case wgpu::CompareFunction::Always:
return MTLCompareFunctionAlways;
+ default:
+ UNREACHABLE();
}
}
diff --git a/src/dawn_native/opengl/SamplerGL.cpp b/src/dawn_native/opengl/SamplerGL.cpp
index aef7abb..1b5b44c 100644
--- a/src/dawn_native/opengl/SamplerGL.cpp
+++ b/src/dawn_native/opengl/SamplerGL.cpp
@@ -110,7 +110,7 @@
gl.SamplerParameterf(sampler, GL_TEXTURE_MIN_LOD, descriptor->lodMinClamp);
gl.SamplerParameterf(sampler, GL_TEXTURE_MAX_LOD, descriptor->lodMaxClamp);
- if (ToOpenGLCompareFunction(descriptor->compare) != GL_NEVER) {
+ if (descriptor->compare != wgpu::CompareFunction::Undefined) {
gl.SamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
gl.SamplerParameteri(sampler, GL_TEXTURE_COMPARE_FUNC,
ToOpenGLCompareFunction(descriptor->compare));
diff --git a/src/dawn_native/vulkan/SamplerVk.cpp b/src/dawn_native/vulkan/SamplerVk.cpp
index 5b82472..f2a7128 100644
--- a/src/dawn_native/vulkan/SamplerVk.cpp
+++ b/src/dawn_native/vulkan/SamplerVk.cpp
@@ -79,8 +79,14 @@
createInfo.mipLodBias = 0.0f;
createInfo.anisotropyEnable = VK_FALSE;
createInfo.maxAnisotropy = 1.0f;
- createInfo.compareOp = ToVulkanCompareOp(descriptor->compare);
- createInfo.compareEnable = createInfo.compareOp == VK_COMPARE_OP_NEVER ? VK_FALSE : VK_TRUE;
+ if (descriptor->compare != wgpu::CompareFunction::Undefined) {
+ createInfo.compareOp = ToVulkanCompareOp(descriptor->compare);
+ createInfo.compareEnable = VK_TRUE;
+ } else {
+ // Still set the compareOp so it's not garbage.
+ createInfo.compareOp = VK_COMPARE_OP_NEVER;
+ createInfo.compareEnable = VK_FALSE;
+ }
createInfo.minLod = descriptor->lodMinClamp;
createInfo.maxLod = descriptor->lodMaxClamp;
createInfo.unnormalizedCoordinates = VK_FALSE;
diff --git a/src/dawn_native/vulkan/UtilsVulkan.cpp b/src/dawn_native/vulkan/UtilsVulkan.cpp
index 790336b..173bacc 100644
--- a/src/dawn_native/vulkan/UtilsVulkan.cpp
+++ b/src/dawn_native/vulkan/UtilsVulkan.cpp
@@ -23,22 +23,22 @@
VkCompareOp ToVulkanCompareOp(wgpu::CompareFunction op) {
switch (op) {
- case wgpu::CompareFunction::Always:
- return VK_COMPARE_OP_ALWAYS;
- case wgpu::CompareFunction::Equal:
- return VK_COMPARE_OP_EQUAL;
- case wgpu::CompareFunction::Greater:
- return VK_COMPARE_OP_GREATER;
- case wgpu::CompareFunction::GreaterEqual:
- return VK_COMPARE_OP_GREATER_OR_EQUAL;
+ case wgpu::CompareFunction::Never:
+ return VK_COMPARE_OP_NEVER;
case wgpu::CompareFunction::Less:
return VK_COMPARE_OP_LESS;
case wgpu::CompareFunction::LessEqual:
return VK_COMPARE_OP_LESS_OR_EQUAL;
- case wgpu::CompareFunction::Never:
- return VK_COMPARE_OP_NEVER;
+ case wgpu::CompareFunction::Greater:
+ return VK_COMPARE_OP_GREATER;
+ case wgpu::CompareFunction::GreaterEqual:
+ return VK_COMPARE_OP_GREATER_OR_EQUAL;
+ case wgpu::CompareFunction::Equal:
+ return VK_COMPARE_OP_EQUAL;
case wgpu::CompareFunction::NotEqual:
return VK_COMPARE_OP_NOT_EQUAL;
+ case wgpu::CompareFunction::Always:
+ return VK_COMPARE_OP_ALWAYS;
default:
UNREACHABLE();
}