Implement NVX_multiview_per_view_attributes
diff --git a/SPIRV/GLSL.ext.NV.h b/SPIRV/GLSL.ext.NV.h
index 89f0a5c..e93c9f7 100644
--- a/SPIRV/GLSL.ext.NV.h
+++ b/SPIRV/GLSL.ext.NV.h
@@ -1,5 +1,5 @@
/*
-** Copyright (c) 2014-2016 The Khronos Group Inc.
+** Copyright (c) 2014-2017 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and/or associated documentation files (the "Materials"),
@@ -33,7 +33,7 @@
enum Capability;
static const int GLSLextNVVersion = 100;
-static const int GLSLextNVRevision = 4;
+static const int GLSLextNVRevision = 5;
//SPV_NV_sample_mask_override_coverage
const char* const E_SPV_NV_sample_mask_override_coverage = "SPV_NV_sample_mask_override_coverage";
@@ -71,4 +71,13 @@
static const Capability CapabilityShaderStereoViewNV = static_cast<Capability>(5259);
+
+//SPV_NVX_multiview_per_view_attributes
+const char* const E_SPV_NVX_multiview_per_view_attributes = "SPV_NVX_multiview_per_view_attributes";
+
+static const BuiltIn BuiltInPositionPerViewNV = static_cast<BuiltIn>(5260);
+static const BuiltIn BuiltInViewportMaskPerViewNV = static_cast<BuiltIn>(5261);
+
+static const Capability CapabilityPerViewAttributesNV = static_cast<Capability>(5262);
+
#endif // #ifndef GLSLextNV_H
\ No newline at end of file
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 02609d0..1a300b5 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -642,6 +642,14 @@
builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
builder.addCapability(spv::CapabilityShaderStereoViewNV);
return spv::BuiltInSecondaryViewportMaskNV;
+ case glslang::EbvPositionPerViewNV:
+ builder.addExtension(spv::E_SPV_NVX_multiview_per_view_attributes);
+ builder.addCapability(spv::CapabilityPerViewAttributesNV);
+ return spv::BuiltInPositionPerViewNV;
+ case glslang::EbvViewportMaskPerViewNV:
+ builder.addExtension(spv::E_SPV_NVX_multiview_per_view_attributes);
+ builder.addCapability(spv::CapabilityPerViewAttributesNV);
+ return spv::BuiltInViewportMaskPerViewNV;
#endif
default: return spv::BuiltInMax;
}
@@ -2384,6 +2392,11 @@
builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
}
}
+ if (glslangMember.getQualifier().layoutPassthrough) {
+ addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationPassthroughNV);
+ builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV);
+ builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);
+ }
#endif
}
}
@@ -2661,6 +2674,8 @@
case glslang::EbvViewportMaskNV:
case glslang::EbvSecondaryPositionNV:
case glslang::EbvSecondaryViewportMaskNV:
+ case glslang::EbvPositionPerViewNV:
+ case glslang::EbvViewportMaskPerViewNV:
#endif
// Generate the associated capability. Delegate to TranslateBuiltInDecoration.
// Alternately, we could just call this for any glslang built-in, since the
diff --git a/SPIRV/disassemble.cpp b/SPIRV/disassemble.cpp
index 74ae407..c950a66 100644
--- a/SPIRV/disassemble.cpp
+++ b/SPIRV/disassemble.cpp
@@ -483,7 +483,8 @@
#ifdef NV_EXTENSIONS
}else if (strcmp(spv::E_SPV_NV_sample_mask_override_coverage, name) == 0 ||
strcmp(spv::E_SPV_NV_geometry_shader_passthrough, name) == 0 ||
- strcmp(spv::E_SPV_NV_viewport_array2, name) == 0) {
+ strcmp(spv::E_SPV_NV_viewport_array2, name) == 0 ||
+ strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
extInstSet = GLSLextNVInst;
#endif
}
@@ -659,7 +660,8 @@
if (strcmp(name, spv::E_SPV_NV_sample_mask_override_coverage) == 0 ||
strcmp(name, spv::E_SPV_NV_geometry_shader_passthrough) == 0 ||
strcmp(name, spv::E_ARB_shader_viewport_layer_array) == 0 ||
- strcmp(name, spv::E_SPV_NV_viewport_array2) == 0){
+ strcmp(name, spv::E_SPV_NV_viewport_array2) == 0 ||
+ strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
switch (entrypoint) {
case DecorationOverrideCoverageNV: return "OverrideCoverageNV";
case DecorationPassthroughNV: return "PassthroughNV";
@@ -671,6 +673,9 @@
case BuiltInSecondaryPositionNV: return "SecondaryPositionNV";
case BuiltInSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
case CapabilityShaderStereoViewNV: return "ShaderStereoViewNV";
+ case BuiltInPositionPerViewNV: return "PositionPerViewNV";
+ case BuiltInViewportMaskPerViewNV: return "ViewportMaskPerViewNV";
+ case CapabilityPerViewAttributesNV: return "PerViewAttributesNV";
default: return "Bad";
}
}
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index 8718099..b0351e4 100755
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -344,6 +344,8 @@
case 5253: return "ViewportMaskNV";
case 5257: return "SecondaryPositionNV";
case 5258: return "SecondaryViewportMaskNV";
+ case 5260: return "PositionPerViewNV";
+ case 5261: return "ViewportMaskPerViewNV";
#endif
}
}
diff --git a/Test/baseResults/310.tesc.out b/Test/baseResults/310.tesc.out
index d004fa1..89be51e 100644
--- a/Test/baseResults/310.tesc.out
+++ b/Test/baseResults/310.tesc.out
@@ -71,8 +71,8 @@
0:25 move second child to first child (temp highp 4-component vector of float)
0:25 'p' (temp highp 4-component vector of float)
0:25 gl_Position: direct index for structure (in highp 4-component vector of float Position)
-0:25 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:25 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:25 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:25 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
0:25 Constant:
0:25 1 (const int)
0:25 Constant:
@@ -81,8 +81,8 @@
0:26 move second child to first child (temp highp float)
0:26 'ps' (temp highp float)
0:26 gl_PointSize: direct index for structure (in highp float PointSize)
-0:26 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:26 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:26 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:26 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
0:26 Constant:
0:26 1 (const int)
0:26 Constant:
@@ -210,8 +210,8 @@
0:114 move second child to first child (temp highp float)
0:114 'ps' (temp highp float)
0:114 gl_PointSize: direct index for structure (in highp float PointSize)
-0:114 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:114 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:114 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:114 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
0:114 Constant:
0:114 1 (const int)
0:114 Constant:
@@ -402,8 +402,8 @@
0:25 move second child to first child (temp highp 4-component vector of float)
0:25 'p' (temp highp 4-component vector of float)
0:25 gl_Position: direct index for structure (in highp 4-component vector of float Position)
-0:25 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:25 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:25 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:25 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
0:25 Constant:
0:25 1 (const int)
0:25 Constant:
@@ -412,8 +412,8 @@
0:26 move second child to first child (temp highp float)
0:26 'ps' (temp highp float)
0:26 gl_PointSize: direct index for structure (in highp float PointSize)
-0:26 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:26 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:26 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:26 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
0:26 Constant:
0:26 1 (const int)
0:26 Constant:
diff --git a/Test/baseResults/310.tese.out b/Test/baseResults/310.tese.out
index c6ce665..aa0d8b1 100644
--- a/Test/baseResults/310.tese.out
+++ b/Test/baseResults/310.tese.out
@@ -78,8 +78,8 @@
0:36 move second child to first child (temp highp 4-component vector of float)
0:36 'p' (temp highp 4-component vector of float)
0:36 gl_Position: direct index for structure (in highp 4-component vector of float Position)
-0:36 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:36 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:36 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:36 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
0:36 Constant:
0:36 1 (const int)
0:36 Constant:
@@ -88,8 +88,8 @@
0:37 move second child to first child (temp highp float)
0:37 'ps' (temp highp float)
0:37 gl_PointSize: direct index for structure (in highp float PointSize)
-0:37 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:37 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:37 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:37 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
0:37 Constant:
0:37 1 (const int)
0:37 Constant:
@@ -211,8 +211,8 @@
0:36 move second child to first child (temp highp 4-component vector of float)
0:36 'p' (temp highp 4-component vector of float)
0:36 gl_Position: direct index for structure (in highp 4-component vector of float Position)
-0:36 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:36 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:36 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:36 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
0:36 Constant:
0:36 1 (const int)
0:36 Constant:
@@ -221,8 +221,8 @@
0:37 move second child to first child (temp highp float)
0:37 'ps' (temp highp float)
0:37 gl_PointSize: direct index for structure (in highp float PointSize)
-0:37 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:37 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:37 direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:37 'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
0:37 Constant:
0:37 1 (const int)
0:37 Constant:
diff --git a/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out b/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out
new file mode 100644
index 0000000..61b38c8
--- /dev/null
+++ b/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out
@@ -0,0 +1,78 @@
+spv.multiviewPerViewAttributes.tesc
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 37
+
+ Capability Tessellation
+ Capability Bad
+ Extension "SPV_NVX_multiview_per_view_attributes"
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint TessellationControl 4 "main" 17 19 31
+ ExecutionMode 4 OutputVertices 4
+ Source GLSL 450
+ SourceExtension "GL_NVX_multiview_per_view_attributes"
+ Name 4 "main"
+ Name 13 "gl_PerVertex"
+ MemberName 13(gl_PerVertex) 0 "gl_PositionPerViewNV"
+ MemberName 13(gl_PerVertex) 1 "gl_ViewportMaskPerViewNV"
+ Name 17 "gl_out"
+ Name 19 "gl_InvocationID"
+ Name 27 "gl_PerVertex"
+ MemberName 27(gl_PerVertex) 0 "gl_Position"
+ MemberName 27(gl_PerVertex) 1 "gl_PointSize"
+ MemberName 27(gl_PerVertex) 2 "gl_ClipDistance"
+ MemberName 27(gl_PerVertex) 3 "gl_CullDistance"
+ MemberName 27(gl_PerVertex) 4 "gl_SecondaryPositionNV"
+ MemberName 27(gl_PerVertex) 5 "gl_PositionPerViewNV"
+ Name 31 "gl_in"
+ MemberDecorate 13(gl_PerVertex) 0 BuiltIn PositionPerViewNV
+ MemberDecorate 13(gl_PerVertex) 1 BuiltIn ViewportMaskPerViewNV
+ Decorate 13(gl_PerVertex) Block
+ Decorate 19(gl_InvocationID) BuiltIn InvocationId
+ MemberDecorate 27(gl_PerVertex) 0 BuiltIn Position
+ MemberDecorate 27(gl_PerVertex) 1 BuiltIn PointSize
+ MemberDecorate 27(gl_PerVertex) 2 BuiltIn ClipDistance
+ MemberDecorate 27(gl_PerVertex) 3 BuiltIn CullDistance
+ Decorate 27(gl_PerVertex) Block
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeFloat 32
+ 7: TypeVector 6(float) 4
+ 8: TypeInt 32 0
+ 9: 8(int) Constant 1
+ 10: TypeArray 7(fvec4) 9
+ 11: TypeInt 32 1
+ 12: TypeArray 11(int) 9
+13(gl_PerVertex): TypeStruct 10 12
+ 14: 8(int) Constant 4
+ 15: TypeArray 13(gl_PerVertex) 14
+ 16: TypePointer Output 15
+ 17(gl_out): 16(ptr) Variable Output
+ 18: TypePointer Input 11(int)
+19(gl_InvocationID): 18(ptr) Variable Input
+ 21: 11(int) Constant 1
+ 22: 11(int) Constant 0
+ 23: TypePointer Output 11(int)
+ 26: TypeArray 6(float) 9
+27(gl_PerVertex): TypeStruct 7(fvec4) 6(float) 26 26 7(fvec4) 10
+ 28: 8(int) Constant 32
+ 29: TypeArray 27(gl_PerVertex) 28
+ 30: TypePointer Input 29
+ 31(gl_in): 30(ptr) Variable Input
+ 32: TypePointer Input 7(fvec4)
+ 35: TypePointer Output 7(fvec4)
+ 4(main): 2 Function None 3
+ 5: Label
+ 20: 11(int) Load 19(gl_InvocationID)
+ 24: 23(ptr) AccessChain 17(gl_out) 20 21 22
+ Store 24 21
+ 25: 11(int) Load 19(gl_InvocationID)
+ 33: 32(ptr) AccessChain 31(gl_in) 21 22
+ 34: 7(fvec4) Load 33
+ 36: 35(ptr) AccessChain 17(gl_out) 25 22 22
+ Store 36 34
+ Return
+ FunctionEnd
diff --git a/Test/baseResults/spv.multiviewPerViewAttributes.vert.out b/Test/baseResults/spv.multiviewPerViewAttributes.vert.out
new file mode 100644
index 0000000..2f3df9b
--- /dev/null
+++ b/Test/baseResults/spv.multiviewPerViewAttributes.vert.out
@@ -0,0 +1,62 @@
+spv.multiviewPerViewAttributes.vert
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 29
+
+ Capability Shader
+ Capability Bad
+ Extension "SPV_NVX_multiview_per_view_attributes"
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint Vertex 4 "main" 11 20 24
+ Source GLSL 450
+ SourceExtension "GL_NVX_multiview_per_view_attributes"
+ Name 4 "main"
+ Name 11 "gl_ViewportMaskPerViewNV"
+ Name 20 "gl_PositionPerViewNV"
+ Name 22 "gl_PerVertex"
+ MemberName 22(gl_PerVertex) 0 "gl_Position"
+ MemberName 22(gl_PerVertex) 1 "gl_PointSize"
+ MemberName 22(gl_PerVertex) 2 "gl_ClipDistance"
+ MemberName 22(gl_PerVertex) 3 "gl_CullDistance"
+ Name 24 ""
+ Decorate 11(gl_ViewportMaskPerViewNV) BuiltIn ViewportMaskPerViewNV
+ Decorate 20(gl_PositionPerViewNV) BuiltIn PositionPerViewNV
+ MemberDecorate 22(gl_PerVertex) 0 BuiltIn Position
+ MemberDecorate 22(gl_PerVertex) 1 BuiltIn PointSize
+ MemberDecorate 22(gl_PerVertex) 2 BuiltIn ClipDistance
+ MemberDecorate 22(gl_PerVertex) 3 BuiltIn CullDistance
+ Decorate 22(gl_PerVertex) Block
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeInt 32 1
+ 7: TypeInt 32 0
+ 8: 7(int) Constant 1
+ 9: TypeArray 6(int) 8
+ 10: TypePointer Output 9
+11(gl_ViewportMaskPerViewNV): 10(ptr) Variable Output
+ 12: 6(int) Constant 0
+ 13: 6(int) Constant 1
+ 14: TypePointer Output 6(int)
+ 16: TypeFloat 32
+ 17: TypeVector 16(float) 4
+ 18: TypeArray 17(fvec4) 8
+ 19: TypePointer Output 18
+20(gl_PositionPerViewNV): 19(ptr) Variable Output
+ 21: TypeArray 16(float) 8
+22(gl_PerVertex): TypeStruct 17(fvec4) 16(float) 21 21
+ 23: TypePointer Output 22(gl_PerVertex)
+ 24: 23(ptr) Variable Output
+ 25: TypePointer Output 17(fvec4)
+ 4(main): 2 Function None 3
+ 5: Label
+ 15: 14(ptr) AccessChain 11(gl_ViewportMaskPerViewNV) 12
+ Store 15 13
+ 26: 25(ptr) AccessChain 24 12
+ 27: 17(fvec4) Load 26
+ 28: 25(ptr) AccessChain 20(gl_PositionPerViewNV) 12
+ Store 28 27
+ Return
+ FunctionEnd
diff --git a/Test/baseResults/spv.stereoViewRendering.tesc.out b/Test/baseResults/spv.stereoViewRendering.tesc.out
index c8f9642..5d5a3d0 100644
--- a/Test/baseResults/spv.stereoViewRendering.tesc.out
+++ b/Test/baseResults/spv.stereoViewRendering.tesc.out
@@ -3,7 +3,7 @@
// Module Version 10000
// Generated by (magic number): 80001
-// Id's are bound by 38
+// Id's are bound by 39
Capability Geometry
Capability Tessellation
@@ -13,7 +13,7 @@
Extension "SPV_NV_viewport_array2"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
- EntryPoint TessellationControl 4 "main" 16 18 32
+ EntryPoint TessellationControl 4 "main" 16 18 33
ExecutionMode 4 OutputVertices 4
Source GLSL 450
SourceExtension "GL_NV_stereo_view_rendering"
@@ -25,13 +25,14 @@
MemberName 12(gl_PerVertex) 2 "gl_SecondaryViewportMaskNV"
Name 16 "gl_out"
Name 18 "gl_InvocationID"
- Name 28 "gl_PerVertex"
- MemberName 28(gl_PerVertex) 0 "gl_Position"
- MemberName 28(gl_PerVertex) 1 "gl_PointSize"
- MemberName 28(gl_PerVertex) 2 "gl_ClipDistance"
- MemberName 28(gl_PerVertex) 3 "gl_CullDistance"
- MemberName 28(gl_PerVertex) 4 "gl_SecondaryPositionNV"
- Name 32 "gl_in"
+ Name 29 "gl_PerVertex"
+ MemberName 29(gl_PerVertex) 0 "gl_Position"
+ MemberName 29(gl_PerVertex) 1 "gl_PointSize"
+ MemberName 29(gl_PerVertex) 2 "gl_ClipDistance"
+ MemberName 29(gl_PerVertex) 3 "gl_CullDistance"
+ MemberName 29(gl_PerVertex) 4 "gl_SecondaryPositionNV"
+ MemberName 29(gl_PerVertex) 5 "gl_PositionPerViewNV"
+ Name 33 "gl_in"
MemberDecorate 12(gl_PerVertex) 0 BuiltIn Layer
MemberDecorate 12(gl_PerVertex) 0 ViewportRelativeNV
MemberDecorate 12(gl_PerVertex) 0 SecondaryViewportRelativeNV 1
@@ -39,11 +40,11 @@
MemberDecorate 12(gl_PerVertex) 2 BuiltIn SecondaryViewportMaskNV
Decorate 12(gl_PerVertex) Block
Decorate 18(gl_InvocationID) BuiltIn InvocationId
- MemberDecorate 28(gl_PerVertex) 0 BuiltIn Position
- MemberDecorate 28(gl_PerVertex) 1 BuiltIn PointSize
- MemberDecorate 28(gl_PerVertex) 2 BuiltIn ClipDistance
- MemberDecorate 28(gl_PerVertex) 3 BuiltIn CullDistance
- Decorate 28(gl_PerVertex) Block
+ MemberDecorate 29(gl_PerVertex) 0 BuiltIn Position
+ MemberDecorate 29(gl_PerVertex) 1 BuiltIn PointSize
+ MemberDecorate 29(gl_PerVertex) 2 BuiltIn ClipDistance
+ MemberDecorate 29(gl_PerVertex) 3 BuiltIn CullDistance
+ Decorate 29(gl_PerVertex) Block
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
@@ -65,22 +66,23 @@
23: TypePointer Output 6(int)
26: 9(int) Constant 1
27: TypeArray 7(float) 26
-28(gl_PerVertex): TypeStruct 8(fvec4) 7(float) 27 27 8(fvec4)
- 29: 9(int) Constant 32
- 30: TypeArray 28(gl_PerVertex) 29
- 31: TypePointer Input 30
- 32(gl_in): 31(ptr) Variable Input
- 33: TypePointer Input 8(fvec4)
- 36: TypePointer Output 8(fvec4)
+ 28: TypeArray 8(fvec4) 26
+29(gl_PerVertex): TypeStruct 8(fvec4) 7(float) 27 27 8(fvec4) 28
+ 30: 9(int) Constant 32
+ 31: TypeArray 29(gl_PerVertex) 30
+ 32: TypePointer Input 31
+ 33(gl_in): 32(ptr) Variable Input
+ 34: TypePointer Input 8(fvec4)
+ 37: TypePointer Output 8(fvec4)
4(main): 2 Function None 3
5: Label
19: 6(int) Load 18(gl_InvocationID)
24: 23(ptr) AccessChain 16(gl_out) 19 20 21
Store 24 22
25: 6(int) Load 18(gl_InvocationID)
- 34: 33(ptr) AccessChain 32(gl_in) 22 21
- 35: 8(fvec4) Load 34
- 37: 36(ptr) AccessChain 16(gl_out) 25 22
- Store 37 35
+ 35: 34(ptr) AccessChain 33(gl_in) 22 21
+ 36: 8(fvec4) Load 35
+ 38: 37(ptr) AccessChain 16(gl_out) 25 22
+ Store 38 36
Return
FunctionEnd
diff --git a/Test/spv.multiviewPerViewAttributes.tesc b/Test/spv.multiviewPerViewAttributes.tesc
new file mode 100644
index 0000000..a0dd64d
--- /dev/null
+++ b/Test/spv.multiviewPerViewAttributes.tesc
@@ -0,0 +1,14 @@
+#version 450
+
+#extension GL_NVX_multiview_per_view_attributes :require
+
+layout(vertices = 4) out;
+out gl_PerVertex {
+ int gl_ViewportMaskPerViewNV[];
+ vec4 gl_PositionPerViewNV[];
+ } gl_out[];
+void main()
+{
+ gl_out[gl_InvocationID].gl_ViewportMaskPerViewNV[0] = 1;
+ gl_out[gl_InvocationID].gl_PositionPerViewNV[0] = gl_in[1].gl_Position;
+}
diff --git a/Test/spv.multiviewPerViewAttributes.vert b/Test/spv.multiviewPerViewAttributes.vert
new file mode 100644
index 0000000..dd64a16
--- /dev/null
+++ b/Test/spv.multiviewPerViewAttributes.vert
@@ -0,0 +1,10 @@
+#version 450
+
+#extension GL_NVX_multiview_per_view_attributes :require
+
+void main()
+{
+ gl_ViewportMaskPerViewNV[0] = 1;
+ gl_PositionPerViewNV[0] = gl_Position;
+}
+
diff --git a/glslang/Include/BaseTypes.h b/glslang/Include/BaseTypes.h
index 449e3ae..f0e3c37 100644
--- a/glslang/Include/BaseTypes.h
+++ b/glslang/Include/BaseTypes.h
@@ -207,6 +207,8 @@
EbvViewportMaskNV,
EbvSecondaryPositionNV,
EbvSecondaryViewportMaskNV,
+ EbvPositionPerViewNV,
+ EbvViewportMaskPerViewNV,
#endif
// HLSL built-ins that live only temporarily, until they get remapped
// to one of the above.
@@ -325,6 +327,8 @@
case EbvViewportMaskNV: return "ViewportMaskNV";
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
+ case EbvPositionPerViewNV: return "PositionPerViewNV";
+ case EbvViewportMaskPerViewNV: return "ViewportMaskPerViewNV";
#endif
default: return "unknown built-in variable";
}
diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
index 605f5f1..4a14843 100644
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -1360,6 +1360,8 @@
case EbvViewportMaskNV:
case EbvSecondaryPositionNV:
case EbvSecondaryViewportMaskNV:
+ case EbvPositionPerViewNV:
+ case EbvViewportMaskPerViewNV:
#endif
return true;
default:
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 287d6d6..b9fa082 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -3249,6 +3249,8 @@
"out int gl_ViewportMask[];"
"out int gl_SecondaryViewportMaskNV[];"
"out vec4 gl_SecondaryPositionNV;"
+ "out vec4 gl_PositionPerViewNV[];"
+ "out int gl_ViewportMaskPerViewNV[];"
);
#endif
@@ -3313,6 +3315,7 @@
"float gl_CullDistance[];"
#ifdef NV_EXTENSIONS
"vec4 gl_SecondaryPositionNV;"
+ "vec4 gl_PositionPerViewNV[];"
#endif
);
stageBuiltins[EShLangGeometry].append(
@@ -3362,9 +3365,11 @@
#ifdef NV_EXTENSIONS
if (version >= 450)
stageBuiltins[EShLangGeometry].append(
- "out int gl_ViewportMask[];"
- "out int gl_SecondaryViewportMaskNV[];"
- "out vec4 gl_SecondaryPositionNV;"
+ "out int gl_ViewportMask[];"
+ "out int gl_SecondaryViewportMaskNV[];"
+ "out vec4 gl_SecondaryPositionNV;"
+ "out vec4 gl_PositionPerViewNV[];"
+ "out int gl_ViewportMaskPerViewNV[];"
);
#endif
@@ -3424,11 +3429,13 @@
stageBuiltins[EShLangTessControl].append(
"float gl_CullDistance[];"
#ifdef NV_EXTENSIONS
- "int gl_ViewportIndex;"
- "int gl_Layer;"
- "int gl_ViewportMask[];"
+ "int gl_ViewportIndex;"
+ "int gl_Layer;"
+ "int gl_ViewportMask[];"
"vec4 gl_SecondaryPositionNV;"
- "int gl_SecondaryViewportMaskNV[];"
+ "int gl_SecondaryViewportMaskNV[];"
+ "vec4 gl_PositionPerViewNV[];"
+ "int gl_ViewportMaskPerViewNV[];"
#endif
);
stageBuiltins[EShLangTessControl].append(
@@ -3503,11 +3510,13 @@
#ifdef NV_EXTENSIONS
if (version >= 450)
stageBuiltins[EShLangTessEvaluation].append(
- "out int gl_ViewportIndex;"
- "out int gl_Layer;"
- "out int gl_ViewportMask[];"
+ "out int gl_ViewportIndex;"
+ "out int gl_Layer;"
+ "out int gl_ViewportMask[];"
"out vec4 gl_SecondaryPositionNV;"
- "out int gl_SecondaryViewportMaskNV[];"
+ "out int gl_SecondaryViewportMaskNV[];"
+ "out vec4 gl_PositionPerViewNV[];"
+ "out int gl_ViewportMaskPerViewNV[];"
);
#endif
@@ -4446,6 +4455,7 @@
"highp float gl_PointSize;"
#ifdef NV_EXTENSIONS
"highp vec4 gl_SecondaryPositionNV;"
+ "highp vec4 gl_PositionPerViewNV[];"
#endif
"} gl_in[gl_MaxPatchVertices];"
"\n");
@@ -4635,6 +4645,7 @@
"float gl_CullDistance[];"
#ifdef NV_EXTENSIONS
"vec4 gl_SecondaryPositionNV;"
+ "vec4 gl_PositionPerViewNV[];"
#endif
);
s.append(
@@ -5033,19 +5044,26 @@
symbolTable.setVariableExtensions("gl_ViewportMask", 1, &E_GL_NV_viewport_array2);
symbolTable.setVariableExtensions("gl_SecondaryPositionNV", 1, &E_GL_NV_stereo_view_rendering);
symbolTable.setVariableExtensions("gl_SecondaryViewportMaskNV", 1, &E_GL_NV_stereo_view_rendering);
+ symbolTable.setVariableExtensions("gl_PositionPerViewNV", 1, &E_GL_NVX_multiview_per_view_attributes);
+ symbolTable.setVariableExtensions("gl_ViewportMaskPerViewNV", 1, &E_GL_NVX_multiview_per_view_attributes);
BuiltInVariable("gl_ViewportMask", EbvViewportMaskNV, symbolTable);
BuiltInVariable("gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
BuiltInVariable("gl_SecondaryViewportMaskNV", EbvSecondaryViewportMaskNV, symbolTable);
+ BuiltInVariable("gl_PositionPerViewNV", EbvPositionPerViewNV, symbolTable);
+ BuiltInVariable("gl_ViewportMaskPerViewNV", EbvViewportMaskPerViewNV, symbolTable);
- if (language != EShLangVertex)
+ if (language != EShLangVertex) {
BuiltInVariable("gl_in", "gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
-
+ BuiltInVariable("gl_in", "gl_PositionPerViewNV", EbvPositionPerViewNV, symbolTable);
+ }
BuiltInVariable("gl_out", "gl_Layer", EbvLayer, symbolTable);
BuiltInVariable("gl_out", "gl_ViewportIndex", EbvViewportIndex, symbolTable);
BuiltInVariable("gl_out", "gl_ViewportMask", EbvViewportMaskNV, symbolTable);
BuiltInVariable("gl_out", "gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
BuiltInVariable("gl_out", "gl_SecondaryViewportMaskNV", EbvSecondaryViewportMaskNV, symbolTable);
+ BuiltInVariable("gl_out", "gl_PositionPerViewNV", EbvPositionPerViewNV, symbolTable);
+ BuiltInVariable("gl_out", "gl_ViewportMaskPerViewNV", EbvViewportMaskPerViewNV, symbolTable);
#endif
BuiltInVariable("gl_PatchVerticesIn", EbvPatchVertices, symbolTable);
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 9025e76..6387538 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -201,6 +201,7 @@
extensionBehavior[E_GL_ARB_shader_viewport_layer_array] = EBhDisable;
extensionBehavior[E_GL_NV_viewport_array2] = EBhDisable;
extensionBehavior[E_GL_NV_stereo_view_rendering] = EBhDisable;
+ extensionBehavior[E_GL_NVX_multiview_per_view_attributes] = EBhDisable;
#endif
// AEP
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index cf8f5e2..474e410 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -149,6 +149,7 @@
const char* const E_GL_ARB_shader_viewport_layer_array = "GL_ARB_shader_viewport_layer_array";
const char* const E_GL_NV_viewport_array2 = "GL_NV_viewport_array2";
const char* const E_GL_NV_stereo_view_rendering = "GL_NV_stereo_view_rendering";
+const char* const E_GL_NVX_multiview_per_view_attributes = "GL_NVX_multiview_per_view_attributes";
// Arrays of extensions for the above viewportEXTs duplications
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index fc0ba06..dabd021 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -386,6 +386,8 @@
"spv.viewportArray2.tesc",
"spv.stereoViewRendering.vert",
"spv.stereoViewRendering.tesc",
+ "spv.multiviewPerViewAttributes.vert",
+ "spv.multiviewPerViewAttributes.tesc",
})),
FileNameAsCustomTestSuffix
);