Allow DepthUnchanged and DepthReplaced Modes in same SPIR-V module.
Fixes #2555
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index f0bf3a6..8a1b30d 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -1551,15 +1551,16 @@
builder.addExtension(spv::E_SPV_KHR_post_depth_coverage);
}
- if (glslangIntermediate->getDepth() != glslang::EldUnchanged && glslangIntermediate->isDepthReplacing())
+ if (glslangIntermediate->isDepthReplacing())
builder.addExecutionMode(shaderEntry, spv::ExecutionModeDepthReplacing);
#ifndef GLSLANG_WEB
switch(glslangIntermediate->getDepth()) {
- case glslang::EldGreater: mode = spv::ExecutionModeDepthGreater; break;
- case glslang::EldLess: mode = spv::ExecutionModeDepthLess; break;
- default: mode = spv::ExecutionModeMax; break;
+ case glslang::EldGreater: mode = spv::ExecutionModeDepthGreater; break;
+ case glslang::EldLess: mode = spv::ExecutionModeDepthLess; break;
+ case glslang::EldUnchanged: mode = spv::ExecutionModeDepthUnchanged; break;
+ default: mode = spv::ExecutionModeMax; break;
}
if (mode != spv::ExecutionModeMax)
builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);
diff --git a/Test/baseResults/spv.depthUnchanged.frag.out b/Test/baseResults/spv.depthUnchanged.frag.out
new file mode 100644
index 0000000..0074007
--- /dev/null
+++ b/Test/baseResults/spv.depthUnchanged.frag.out
@@ -0,0 +1,44 @@
+spv.depthUnchanged.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 22
+
+ Capability Shader
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint Fragment 4 "main" 9 14 16
+ ExecutionMode 4 OriginUpperLeft
+ ExecutionMode 4 DepthReplacing
+ ExecutionMode 4 DepthUnchanged
+ Source GLSL 430
+ Name 4 "main"
+ Name 9 "outColor"
+ Name 14 "gl_FragDepth"
+ Name 16 "gl_FragCoord"
+ Decorate 9(outColor) Location 0
+ Decorate 14(gl_FragDepth) BuiltIn FragDepth
+ Decorate 16(gl_FragCoord) BuiltIn FragCoord
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeFloat 32
+ 7: TypeVector 6(float) 4
+ 8: TypePointer Output 7(fvec4)
+ 9(outColor): 8(ptr) Variable Output
+ 10: 6(float) Constant 1065353216
+ 11: 6(float) Constant 0
+ 12: 7(fvec4) ConstantComposite 10 11 11 10
+ 13: TypePointer Output 6(float)
+14(gl_FragDepth): 13(ptr) Variable Output
+ 15: TypePointer Input 7(fvec4)
+16(gl_FragCoord): 15(ptr) Variable Input
+ 17: TypeInt 32 0
+ 18: 17(int) Constant 1
+ 19: TypePointer Input 6(float)
+ 4(main): 2 Function None 3
+ 5: Label
+ Store 9(outColor) 12
+ 20: 19(ptr) AccessChain 16(gl_FragCoord) 18
+ 21: 6(float) Load 20
+ Store 14(gl_FragDepth) 21
+ Return
+ FunctionEnd
diff --git a/Test/spv.depthUnchanged.frag b/Test/spv.depthUnchanged.frag
new file mode 100644
index 0000000..bbc5139
--- /dev/null
+++ b/Test/spv.depthUnchanged.frag
@@ -0,0 +1,8 @@
+#version 430
+layout(location = 0) out vec4 outColor;
+layout(depth_unchanged) out float gl_FragDepth;
+void main() {
+ outColor = vec4(1.0, 0.0, 0.0, 1.0);
+ gl_FragDepth = gl_FragCoord.y;
+}
+
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 2ee292e..e2a837d 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -328,6 +328,7 @@
"spv.demoteDisabled.frag",
"spv.deepRvalue.frag",
"spv.depthOut.frag",
+ "spv.depthUnchanged.frag",
"spv.discard-dce.frag",
"spv.doWhileLoop.frag",
"spv.earlyReturnDiscard.frag",