Skip to content

Commit fb53f83

Browse files
authored
Avoid spuriously adding Geometry capability for vert, tesc, tese (KhronosGroup#2462)
Use of gl_Layer and gl_ViewportIndex in tessellation and vertex shaders should not trigger the addition of the Geometry capability. Fixes KhronosGroup#2461 Added tests for use of gl_Layer and gl_ViewportIndex in a tessellation evaluation shader. Several tests for NVIDIA features for tessellation, vertex, or mesh shaders now lose the Geometry or MultiViewport capabilities. This is ok because the functionality is already covered by the ShaderViewportIndexLayerNV capability. The spv.meshShaderPerViewBuiltins.mesh test now fails validation because the validator does not know that PrimitiveId (and possibly other) builtins are enabled by the MeshShadingNV capability. I filed KhronosGroup/SPIRV-Headers#179 to fix the grammar upstream.
1 parent 639f546 commit fb53f83

13 files changed

+87
-11
lines changed

SPIRV/GlslangToSpv.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,10 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
725725
return spv::BuiltInCullDistance;
726726

727727
case glslang::EbvViewportIndex:
728-
builder.addCapability(spv::CapabilityMultiViewport);
728+
if (glslangIntermediate->getStage() == EShLangGeometry ||
729+
glslangIntermediate->getStage() == EShLangFragment) {
730+
builder.addCapability(spv::CapabilityMultiViewport);
731+
}
729732
if (glslangIntermediate->getStage() == EShLangVertex ||
730733
glslangIntermediate->getStage() == EShLangTessControl ||
731734
glslangIntermediate->getStage() == EShLangTessEvaluation) {
@@ -754,7 +757,10 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
754757
if (glslangIntermediate->getStage() == EShLangMeshNV) {
755758
return spv::BuiltInLayer;
756759
}
757-
builder.addCapability(spv::CapabilityGeometry);
760+
if (glslangIntermediate->getStage() == EShLangGeometry ||
761+
glslangIntermediate->getStage() == EShLangFragment) {
762+
builder.addCapability(spv::CapabilityGeometry);
763+
}
758764
if (glslangIntermediate->getStage() == EShLangVertex ||
759765
glslangIntermediate->getStage() == EShLangTessControl ||
760766
glslangIntermediate->getStage() == EShLangTessEvaluation) {

Test/baseResults/spv.layer.tese.out

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
spv.layer.tese
2+
// Module Version 10000
3+
// Generated by (magic number): 8000a
4+
// Id's are bound by 10
5+
6+
Capability Tessellation
7+
Capability ShaderViewportIndexLayerNV
8+
Extension "SPV_EXT_shader_viewport_index_layer"
9+
1: ExtInstImport "GLSL.std.450"
10+
MemoryModel Logical GLSL450
11+
EntryPoint TessellationEvaluation 4 "main" 8
12+
ExecutionMode 4 Triangles
13+
ExecutionMode 4 SpacingEqual
14+
ExecutionMode 4 VertexOrderCcw
15+
Source GLSL 450
16+
SourceExtension "GL_ARB_shader_viewport_layer_array"
17+
Name 4 "main"
18+
Name 8 "gl_Layer"
19+
Decorate 8(gl_Layer) BuiltIn Layer
20+
2: TypeVoid
21+
3: TypeFunction 2
22+
6: TypeInt 32 1
23+
7: TypePointer Output 6(int)
24+
8(gl_Layer): 7(ptr) Variable Output
25+
9: 6(int) Constant 1
26+
4(main): 2 Function None 3
27+
5: Label
28+
Store 8(gl_Layer) 9
29+
Return
30+
FunctionEnd

Test/baseResults/spv.meshShaderBuiltins.mesh.out

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ spv.meshShaderBuiltins.mesh
55

66
Capability ClipDistance
77
Capability CullDistance
8-
Capability MultiViewport
98
Capability DrawParameters
109
Capability ShaderViewportMaskNV
1110
Capability MeshShadingNV

Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
spv.meshShaderPerViewBuiltins.mesh
2+
Validation failed
23
// Module Version 10000
34
// Generated by (magic number): 8000a
45
// Id's are bound by 126
56

6-
Capability MultiViewport
77
Capability PerViewAttributesNV
88
Capability MeshShadingNV
99
Extension "SPV_NVX_multiview_per_view_attributes"

Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ spv.meshShaderRedeclBuiltins.mesh
55

66
Capability ClipDistance
77
Capability CullDistance
8-
Capability MultiViewport
98
Capability ShaderViewportMaskNV
109
Capability MeshShadingNV
1110
Extension "SPV_NV_mesh_shader"

Test/baseResults/spv.stereoViewRendering.tesc.out

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ spv.stereoViewRendering.tesc
33
// Generated by (magic number): 8000a
44
// Id's are bound by 42
55

6-
Capability Geometry
76
Capability Tessellation
87
Capability ShaderViewportIndexLayerNV
98
Capability ShaderViewportMaskNV

Test/baseResults/spv.stereoViewRendering.vert.out

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ spv.stereoViewRendering.vert
44
// Id's are bound by 27
55

66
Capability Shader
7-
Capability Geometry
87
Capability ShaderViewportIndexLayerNV
98
Capability ShaderViewportMaskNV
109
Capability ShaderStereoViewNV

Test/baseResults/spv.viewportArray2.tesc.out

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ Validation failed
44
// Generated by (magic number): 8000a
55
// Id's are bound by 25
66

7-
Capability Geometry
87
Capability Tessellation
9-
Capability MultiViewport
108
Capability ShaderViewportIndexLayerNV
119
Capability ShaderViewportMaskNV
1210
Extension "SPV_EXT_shader_viewport_index_layer"

Test/baseResults/spv.viewportArray2.vert.out

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ spv.viewportArray2.vert
44
// Id's are bound by 19
55

66
Capability Shader
7-
Capability Geometry
8-
Capability MultiViewport
97
Capability ShaderViewportIndexLayerNV
108
Capability ShaderViewportMaskNV
119
Extension "SPV_EXT_shader_viewport_index_layer"
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
spv.viewportindex.tese
2+
// Module Version 10000
3+
// Generated by (magic number): 8000a
4+
// Id's are bound by 10
5+
6+
Capability Tessellation
7+
Capability ShaderViewportIndexLayerNV
8+
Extension "SPV_EXT_shader_viewport_index_layer"
9+
1: ExtInstImport "GLSL.std.450"
10+
MemoryModel Logical GLSL450
11+
EntryPoint TessellationEvaluation 4 "main" 8
12+
ExecutionMode 4 Triangles
13+
ExecutionMode 4 SpacingEqual
14+
ExecutionMode 4 VertexOrderCcw
15+
Source GLSL 450
16+
SourceExtension "GL_ARB_shader_viewport_layer_array"
17+
Name 4 "main"
18+
Name 8 "gl_ViewportIndex"
19+
Decorate 8(gl_ViewportIndex) BuiltIn ViewportIndex
20+
2: TypeVoid
21+
3: TypeFunction 2
22+
6: TypeInt 32 1
23+
7: TypePointer Output 6(int)
24+
8(gl_ViewportIndex): 7(ptr) Variable Output
25+
9: 6(int) Constant 1
26+
4(main): 2 Function None 3
27+
5: Label
28+
Store 8(gl_ViewportIndex) 9
29+
Return
30+
FunctionEnd

0 commit comments

Comments
 (0)