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();
         }