SPV: Add modes for spacing, depth, depth replacing, winding, and point mode.

This commit is contained in:
John Kessenich 2015-10-13 16:29:02 -06:00
parent f685df8c16
commit e690332c3c
7 changed files with 55 additions and 13 deletions

View File

@ -450,10 +450,25 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
if (mode != spv::BadValue) if (mode != spv::BadValue)
builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode); builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);
// TODO switch (glslangIntermediate->getVertexSpacing()) {
//builder.addExecutionMode(spv::VertexSpacingMdName, glslangIntermediate->getVertexSpacing()); case glslang::EvsEqual: mode = spv::ExecutionModeSpacingEqual; break;
//builder.addExecutionMode(spv::VertexOrderMdName, glslangIntermediate->getVertexOrder()); case glslang::EvsFractionalEven: mode = spv::ExecutionModeSpacingFractionalEven; break;
//builder.addExecutionMode(spv::PointModeMdName, glslangIntermediate->getPointMode()); case glslang::EvsFractionalOdd: mode = spv::ExecutionModeSpacingFractionalOdd; break;
default: mode = spv::BadValue; break;
}
if (mode != spv::BadValue)
builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);
switch (glslangIntermediate->getVertexOrder()) {
case glslang::EvoCw: mode = spv::ExecutionModeVertexOrderCw; break;
case glslang::EvoCcw: mode = spv::ExecutionModeVertexOrderCcw; break;
default: mode = spv::BadValue; break;
}
if (mode != spv::BadValue)
builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);
if (glslangIntermediate->getPointMode())
builder.addExecutionMode(shaderEntry, spv::ExecutionModePointMode);
break; break;
case EShLangGeometry: case EShLangGeometry:
@ -468,6 +483,7 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
} }
if (mode != spv::BadValue) if (mode != spv::BadValue)
builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode); builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);
builder.addExecutionMode(shaderEntry, spv::ExecutionModeInvocations, glslangIntermediate->getInvocations()); builder.addExecutionMode(shaderEntry, spv::ExecutionModeInvocations, glslangIntermediate->getInvocations());
switch (glslangIntermediate->getOutputPrimitive()) { switch (glslangIntermediate->getOutputPrimitive()) {
@ -485,10 +501,26 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
builder.addCapability(spv::CapabilityShader); builder.addCapability(spv::CapabilityShader);
if (glslangIntermediate->getPixelCenterInteger()) if (glslangIntermediate->getPixelCenterInteger())
builder.addExecutionMode(shaderEntry, spv::ExecutionModePixelCenterInteger); builder.addExecutionMode(shaderEntry, spv::ExecutionModePixelCenterInteger);
if (glslangIntermediate->getOriginUpperLeft()) if (glslangIntermediate->getOriginUpperLeft())
builder.addExecutionMode(shaderEntry, spv::ExecutionModeOriginUpperLeft); builder.addExecutionMode(shaderEntry, spv::ExecutionModeOriginUpperLeft);
else else
builder.addExecutionMode(shaderEntry, spv::ExecutionModeOriginLowerLeft); builder.addExecutionMode(shaderEntry, spv::ExecutionModeOriginLowerLeft);
if (glslangIntermediate->getEarlyFragmentTests())
builder.addExecutionMode(shaderEntry, spv::ExecutionModeEarlyFragmentTests);
switch(glslangIntermediate->getDepth()) {
case glslang::EldAny: mode = spv::ExecutionModeDepthAny; break;
case glslang::EldGreater: mode = spv::ExecutionModeDepthGreater; break;
case glslang::EldLess: mode = spv::ExecutionModeDepthLess; break;
default: mode = spv::BadValue; break;
}
if (mode != spv::BadValue)
builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);
if (glslangIntermediate->getDepth() != glslang::EldUnchanged && glslangIntermediate->isDepthReplacing())
builder.addExecutionMode(shaderEntry, spv::ExecutionModeDepthReplacing);
break; break;
case EShLangCompute: case EShLangCompute:

View File

@ -16,6 +16,9 @@ Linked tessellation evaluation stage:
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint TessellationEvaluation 4 "main" EntryPoint TessellationEvaluation 4 "main"
ExecutionMode 4 InputTriangles ExecutionMode 4 InputTriangles
ExecutionMode 4 SpacingFractionalOdd
ExecutionMode 4 VertexOrderCcw
ExecutionMode 4 PointMode
Name 4 "main" Name 4 "main"
Name 8 "a" Name 8 "a"
Name 13 "p" Name 13 "p"

View File

@ -1,6 +1,5 @@
spv.depthOut.frag spv.depthOut.frag
WARNING: 0:3: varying deprecated in version 130; may be removed in future release Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
WARNING: 0:4: varying deprecated in version 130; may be removed in future release
Linked fragment stage: Linked fragment stage:
@ -10,12 +9,14 @@ Linked fragment stage:
// Generated by (magic number): 51a00bb // Generated by (magic number): 51a00bb
// Id's are bound by 18 // Id's are bound by 18
Source GLSL 130 Source GLSL 450
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" EntryPoint Fragment 4 "main"
ExecutionMode 4 OriginLowerLeft ExecutionMode 4 OriginLowerLeft
ExecutionMode 4 DepthAny
ExecutionMode 4 DepthReplacing
Name 4 "main" Name 4 "main"
Name 8 "gl_FragDepth" Name 8 "gl_FragDepth"
Name 10 "Depth" Name 10 "Depth"

View File

@ -1,7 +1,9 @@
#version 130 #version 450
varying vec4 Color; in vec4 Color;
varying float Depth; in float Depth;
layout(depth_any) out float gl_FragDepth;
void main() void main()
{ {

View File

@ -2,5 +2,5 @@
// For the version, it uses the latest git tag followed by the number of commits. // For the version, it uses the latest git tag followed by the number of commits.
// For the date, it uses the current date (when then script is run). // For the date, it uses the current date (when then script is run).
#define GLSLANG_REVISION "3.0.785" #define GLSLANG_REVISION "3.0.786"
#define GLSLANG_DATE "13-Oct-2015" #define GLSLANG_DATE "13-Oct-2015"

View File

@ -1921,6 +1921,7 @@ bool TParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, TInt
message = "can't modify a readonly buffer"; message = "can't modify a readonly buffer";
break; break;
case EvqFragDepth: case EvqFragDepth:
intermediate.setDepthReplacing();
// "In addition, it is an error to statically write to gl_FragDepth in the fragment shader." // "In addition, it is an error to statically write to gl_FragDepth in the fragment shader."
if (profile == EEsProfile && intermediate.getEarlyFragmentTests()) if (profile == EEsProfile && intermediate.getEarlyFragmentTests())
message = "can't modify gl_FragDepth if using early_fragment_tests"; message = "can't modify gl_FragDepth if using early_fragment_tests";

View File

@ -127,7 +127,7 @@ public:
explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) : language(l), treeRoot(0), profile(p), version(v), explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) : language(l), treeRoot(0), profile(p), version(v),
numMains(0), numErrors(0), recursive(false), numMains(0), numErrors(0), recursive(false),
invocations(0), vertices(0), inputPrimitive(ElgNone), outputPrimitive(ElgNone), pixelCenterInteger(false), originUpperLeft(false), invocations(0), vertices(0), inputPrimitive(ElgNone), outputPrimitive(ElgNone), pixelCenterInteger(false), originUpperLeft(false),
vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false), depthLayout(EldNone), blendEquations(0), xfbMode(false) vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false), depthLayout(EldNone), depthReplacing(false), blendEquations(0), xfbMode(false)
{ {
localSize[0] = 1; localSize[0] = 1;
localSize[1] = 1; localSize[1] = 1;
@ -276,6 +276,8 @@ public:
return true; return true;
} }
TLayoutDepth getDepth() const { return depthLayout; } TLayoutDepth getDepth() const { return depthLayout; }
void setDepthReplacing() { depthReplacing = true; }
bool isDepthReplacing() const { return depthReplacing; }
void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); } void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); }
unsigned int getBlendEquations() const { return blendEquations; } unsigned int getBlendEquations() const { return blendEquations; }
@ -335,6 +337,7 @@ protected:
int localSize[3]; int localSize[3];
bool earlyFragmentTests; bool earlyFragmentTests;
TLayoutDepth depthLayout; TLayoutDepth depthLayout;
bool depthReplacing;
int blendEquations; // an 'or'ing of masks of shifts of TBlendEquationShift int blendEquations; // an 'or'ing of masks of shifts of TBlendEquationShift
bool xfbMode; bool xfbMode;