Commit b901ade0 by John Kessenich

SPV: Non-functional: Condense SPV-related versioning, and rationalize all uses.

parent 65336488
...@@ -2,7 +2,6 @@ spv.atomic.comp ...@@ -2,7 +2,6 @@ spv.atomic.comp
Warning, version 310 is not yet complete; most version-specific features are present, but some are missing. Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
Shader version: 310 Shader version: 310
Requested GL_ARB_gl_spirv
local_size = (1, 1, 1) local_size = (1, 1, 1)
0:? Sequence 0:? Sequence
0:14 Function Definition: func(au1; (global highp uint) 0:14 Function Definition: func(au1; (global highp uint)
...@@ -105,7 +104,6 @@ Linked compute stage: ...@@ -105,7 +104,6 @@ Linked compute stage:
Shader version: 310 Shader version: 310
Requested GL_ARB_gl_spirv
local_size = (1, 1, 1) local_size = (1, 1, 1)
0:? Sequence 0:? Sequence
0:14 Function Definition: func(au1; (global highp uint) 0:14 Function Definition: func(au1; (global highp uint)
......
...@@ -17,8 +17,8 @@ ERROR: 0:16: 'constant_id' : cannot declare a default, can only be used on a sca ...@@ -17,8 +17,8 @@ ERROR: 0:16: 'constant_id' : cannot declare a default, can only be used on a sca
ERROR: 0:20: 'subpassLoad' : no matching overloaded function found ERROR: 0:20: 'subpassLoad' : no matching overloaded function found
ERROR: 0:20: 'assign' : cannot convert from 'const float' to 'smooth out 4-component vector of float' ERROR: 0:20: 'assign' : cannot convert from 'const float' to 'smooth out 4-component vector of float'
ERROR: 0:23: 'atomic counter types' : not allowed when using GLSL for Vulkan ERROR: 0:23: 'atomic counter types' : not allowed when using GLSL for Vulkan
ERROR: 0:24: 'shared' : not allowed when using GLSL for Vulkan ERROR: 0:24: 'shared' : not allowed when generating SPIR-V
ERROR: 0:25: 'packed' : not allowed when using GLSL for Vulkan ERROR: 0:25: 'packed' : not allowed when generating SPIR-V
ERROR: 0:32: 'initializer' : can't use with types containing arrays sized with a specialization constant ERROR: 0:32: 'initializer' : can't use with types containing arrays sized with a specialization constant
ERROR: 0:34: '=' : can't use with types containing arrays sized with a specialization constant ERROR: 0:34: '=' : can't use with types containing arrays sized with a specialization constant
ERROR: 0:35: '==' : can't use with types containing arrays sized with a specialization constant ERROR: 0:35: '==' : can't use with types containing arrays sized with a specialization constant
......
#version 310 es #version 310 es
#extension GL_ARB_gl_spirv : enable
layout(binding = 0) uniform atomic_uint counter; layout(binding = 0) uniform atomic_uint counter;
......
...@@ -61,14 +61,14 @@ public: ...@@ -61,14 +61,14 @@ public:
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
TBuiltInParseables(); TBuiltInParseables();
virtual ~TBuiltInParseables(); virtual ~TBuiltInParseables();
virtual void initialize(int version, EProfile, int spv, int vulkan) = 0; virtual void initialize(int version, EProfile, const SpvVersion& spvVersion) = 0;
virtual void initialize(const TBuiltInResource& resources, int version, EProfile, int spv, int vulkan, EShLanguage) = 0; virtual void initialize(const TBuiltInResource& resources, int version, EProfile, const SpvVersion& spvVersion, EShLanguage) = 0;
virtual const TString& getCommonString() const { return commonBuiltins; } virtual const TString& getCommonString() const { return commonBuiltins; }
virtual const TString& getStageString(EShLanguage language) const { return stageBuiltins[language]; } virtual const TString& getStageString(EShLanguage language) const { return stageBuiltins[language]; }
virtual void identifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLanguage language, TSymbolTable& symbolTable) = 0; virtual void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable) = 0;
virtual void identifyBuiltIns(int version, EProfile profile, int spv, int /*vulkan*/, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources) = 0; virtual void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources) = 0;
protected: protected:
TString commonBuiltins; TString commonBuiltins;
...@@ -85,15 +85,15 @@ public: ...@@ -85,15 +85,15 @@ public:
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
TBuiltIns(); TBuiltIns();
virtual ~TBuiltIns(); virtual ~TBuiltIns();
void initialize(int version, EProfile, int spv, int vulkan); void initialize(int version, EProfile, const SpvVersion& spvVersion);
void initialize(const TBuiltInResource& resources, int version, EProfile, int spv, int vulkan, EShLanguage); void initialize(const TBuiltInResource& resources, int version, EProfile, const SpvVersion& spvVersion, EShLanguage);
void identifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLanguage language, TSymbolTable& symbolTable); void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable);
void identifyBuiltIns(int version, EProfile profile, int spv, int /*vulkan*/, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources); void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources);
protected: protected:
void add2ndGenerationSamplingImaging(int version, EProfile profile, int spv, int vulkan); void add2ndGenerationSamplingImaging(int version, EProfile profile, const SpvVersion& spvVersion);
void addSubpassSampling(TSampler, TString& typeName, int version, EProfile profile); void addSubpassSampling(TSampler, TString& typeName, int version, EProfile profile);
void addQueryFunctions(TSampler, TString& typeName, int version, EProfile profile); void addQueryFunctions(TSampler, TString& typeName, int version, EProfile profile);
void addImageFunctions(TSampler, TString& typeName, int version, EProfile profile); void addImageFunctions(TSampler, TString& typeName, int version, EProfile profile);
......
...@@ -49,9 +49,9 @@ extern int yyparse(glslang::TParseContext*); ...@@ -49,9 +49,9 @@ extern int yyparse(glslang::TParseContext*);
namespace glslang { namespace glslang {
TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, bool parsingBuiltins, TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, bool parsingBuiltins,
int version, EProfile profile, int spv, int vulkan, EShLanguage language, int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language,
TInfoSink& infoSink, bool forwardCompatible, EShMessages messages) : TInfoSink& infoSink, bool forwardCompatible, EShMessages messages) :
TParseContextBase(symbolTable, interm, version, profile, spv, vulkan, language, infoSink, forwardCompatible, messages), TParseContextBase(symbolTable, interm, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),
contextPragma(true, false), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0), statementNestingLevel(0), contextPragma(true, false), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0), statementNestingLevel(0),
inMain(false), postMainReturn(false), currentFunctionType(nullptr), blockName(nullptr), inMain(false), postMainReturn(false), currentFunctionType(nullptr), blockName(nullptr),
limits(resources.limits), parsingBuiltins(parsingBuiltins), limits(resources.limits), parsingBuiltins(parsingBuiltins),
...@@ -104,11 +104,11 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b ...@@ -104,11 +104,11 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b
globalUniformDefaults.clear(); globalUniformDefaults.clear();
globalUniformDefaults.layoutMatrix = ElmColumnMajor; globalUniformDefaults.layoutMatrix = ElmColumnMajor;
globalUniformDefaults.layoutPacking = vulkan > 0 ? ElpStd140 : ElpShared; globalUniformDefaults.layoutPacking = spvVersion.spv != 0 ? ElpStd140 : ElpShared;
globalBufferDefaults.clear(); globalBufferDefaults.clear();
globalBufferDefaults.layoutMatrix = ElmColumnMajor; globalBufferDefaults.layoutMatrix = ElmColumnMajor;
globalBufferDefaults.layoutPacking = vulkan > 0 ? ElpStd430 : ElpShared; globalBufferDefaults.layoutPacking = spvVersion.spv != 0 ? ElpStd430 : ElpShared;
globalInputDefaults.clear(); globalInputDefaults.clear();
globalOutputDefaults.clear(); globalOutputDefaults.clear();
...@@ -2565,7 +2565,7 @@ void TParseContext::transparentCheck(const TSourceLoc& loc, const TType& type, c ...@@ -2565,7 +2565,7 @@ void TParseContext::transparentCheck(const TSourceLoc& loc, const TType& type, c
return; return;
// Vulkan doesn't allow transparent uniforms outside of blocks // Vulkan doesn't allow transparent uniforms outside of blocks
if (vulkan == 0 || type.getQualifier().storage != EvqUniform) if (spvVersion.vulkan == 0 || type.getQualifier().storage != EvqUniform)
return; return;
if (type.containsNonOpaque()) if (type.containsNonOpaque())
vulkanRemoved(loc, "non-opaque uniforms outside a block"); vulkanRemoved(loc, "non-opaque uniforms outside a block");
...@@ -3890,14 +3890,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi ...@@ -3890,14 +3890,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
return; return;
} }
if (id == TQualifier::getLayoutPackingString(ElpPacked)) { if (id == TQualifier::getLayoutPackingString(ElpPacked)) {
if (vulkan > 0) if (spvVersion.spv != 0)
vulkanRemoved(loc, "packed"); spvRemoved(loc, "packed");
publicType.qualifier.layoutPacking = ElpPacked; publicType.qualifier.layoutPacking = ElpPacked;
return; return;
} }
if (id == TQualifier::getLayoutPackingString(ElpShared)) { if (id == TQualifier::getLayoutPackingString(ElpShared)) {
if (vulkan > 0) if (spvVersion.spv != 0)
vulkanRemoved(loc, "shared"); spvRemoved(loc, "shared");
publicType.qualifier.layoutPacking = ElpShared; publicType.qualifier.layoutPacking = ElpShared;
return; return;
} }
...@@ -4263,7 +4263,7 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi ...@@ -4263,7 +4263,7 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
publicType.shaderQualifiers.localSize[2] = value; publicType.shaderQualifiers.localSize[2] = value;
return; return;
} }
if (spv > 0) { if (spvVersion.spv != 0) {
if (id == "local_size_x_id") { if (id == "local_size_x_id") {
publicType.shaderQualifiers.localSizeSpecId[0] = value; publicType.shaderQualifiers.localSizeSpecId[0] = value;
return; return;
......
...@@ -74,9 +74,9 @@ typedef std::set<int> TIdSetType; ...@@ -74,9 +74,9 @@ typedef std::set<int> TIdSetType;
class TParseContextBase : public TParseVersions { class TParseContextBase : public TParseVersions {
public: public:
TParseContextBase(TSymbolTable& symbolTable, TIntermediate& interm, int version, TParseContextBase(TSymbolTable& symbolTable, TIntermediate& interm, int version,
EProfile profile, int spv, int vulkan, EShLanguage language, EProfile profile, const SpvVersion& spvVersion, EShLanguage language,
TInfoSink& infoSink, bool forwardCompatible, EShMessages messages) TInfoSink& infoSink, bool forwardCompatible, EShMessages messages)
: TParseVersions(interm, version, profile, spv, vulkan, language, infoSink, forwardCompatible, messages), : TParseVersions(interm, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),
symbolTable(symbolTable), tokensBeforeEOF(false), symbolTable(symbolTable), tokensBeforeEOF(false),
linkage(nullptr), scanContext(nullptr), ppContext(nullptr) { } linkage(nullptr), scanContext(nullptr), ppContext(nullptr) { }
virtual ~TParseContextBase() { } virtual ~TParseContextBase() { }
...@@ -151,7 +151,7 @@ protected: ...@@ -151,7 +151,7 @@ protected:
// //
class TParseContext : public TParseContextBase { class TParseContext : public TParseContextBase {
public: public:
TParseContext(TSymbolTable&, TIntermediate&, bool parsingBuiltins, int version, EProfile, int spv, int vulkan, EShLanguage, TInfoSink&, TParseContext(TSymbolTable&, TIntermediate&, bool parsingBuiltins, int version, EProfile, const SpvVersion& spvVersion, EShLanguage, TInfoSink&,
bool forwardCompatible = false, EShMessages messages = EShMsgDefault); bool forwardCompatible = false, EShMessages messages = EShMsgDefault);
virtual ~TParseContext(); virtual ~TParseContext();
......
...@@ -1092,7 +1092,7 @@ int TScanContext::tokenizeIdentifier() ...@@ -1092,7 +1092,7 @@ int TScanContext::tokenizeIdentifier()
case TEXTURE1DARRAY: case TEXTURE1DARRAY:
case SAMPLER: case SAMPLER:
case SAMPLERSHADOW: case SAMPLERSHADOW:
if (parseContext.spv > 0) if (parseContext.spvVersion.vulkan >= 100)
return keyword; return keyword;
else else
return identifierOrType(); return identifierOrType();
...@@ -1103,7 +1103,7 @@ int TScanContext::tokenizeIdentifier() ...@@ -1103,7 +1103,7 @@ int TScanContext::tokenizeIdentifier()
case ISUBPASSINPUTMS: case ISUBPASSINPUTMS:
case USUBPASSINPUT: case USUBPASSINPUT:
case USUBPASSINPUTMS: case USUBPASSINPUTMS:
if (parseContext.spv > 0) if (parseContext.spvVersion.vulkan >= 100)
return keyword; return keyword;
else else
return identifierOrType(); return identifierOrType();
......
...@@ -293,8 +293,15 @@ void TParseVersions::getPreamble(std::string& preamble) ...@@ -293,8 +293,15 @@ void TParseVersions::getPreamble(std::string& preamble)
"#define GL_GOOGLE_include_directive 1\n" "#define GL_GOOGLE_include_directive 1\n"
; ;
if (vulkan > 0) // #define VULKAN XXXX
preamble += "#define VULKAN 100\n"; if (spvVersion.vulkan > 0) {
preamble += "#define VULKAN ";
char number[12];
snprintf(number, 12, "%d", spvVersion.vulkan);
preamble += number;
preamble += "\n";
}
// gl_spirv TODO
} }
// //
...@@ -575,9 +582,6 @@ void TParseVersions::updateExtensionBehavior(int line, const char* extension, co ...@@ -575,9 +582,6 @@ void TParseVersions::updateExtensionBehavior(int line, const char* extension, co
updateExtensionBehavior(line, "GL_OES_shader_io_blocks", behaviorString); updateExtensionBehavior(line, "GL_OES_shader_io_blocks", behaviorString);
else if (strcmp(extension, "GL_GOOGLE_include_directive") == 0) else if (strcmp(extension, "GL_GOOGLE_include_directive") == 0)
updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString); updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString);
// SPIR-V
else if (strcmp(extension, "GL_ARB_gl_spirv") == 0)
spv = 100;
} }
void TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBehavior behavior) void TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBehavior behavior)
...@@ -649,28 +653,28 @@ void TParseVersions::int64Check(const TSourceLoc& loc, const char* op, bool buil ...@@ -649,28 +653,28 @@ void TParseVersions::int64Check(const TSourceLoc& loc, const char* op, bool buil
// Call for any operation removed because SPIR-V is in use. // Call for any operation removed because SPIR-V is in use.
void TParseVersions::spvRemoved(const TSourceLoc& loc, const char* op) void TParseVersions::spvRemoved(const TSourceLoc& loc, const char* op)
{ {
if (spv > 0) if (spvVersion.spv != 0)
error(loc, "not allowed when generating SPIR-V", op, ""); error(loc, "not allowed when generating SPIR-V", op, "");
} }
// Call for any operation removed because Vulkan SPIR-V is being generated. // Call for any operation removed because Vulkan SPIR-V is being generated.
void TParseVersions::vulkanRemoved(const TSourceLoc& loc, const char* op) void TParseVersions::vulkanRemoved(const TSourceLoc& loc, const char* op)
{ {
if (vulkan > 0) if (spvVersion.vulkan >= 100)
error(loc, "not allowed when using GLSL for Vulkan", op, ""); error(loc, "not allowed when using GLSL for Vulkan", op, "");
} }
// Call for any operation that requires Vulkan. // Call for any operation that requires Vulkan.
void TParseVersions::requireVulkan(const TSourceLoc& loc, const char* op) void TParseVersions::requireVulkan(const TSourceLoc& loc, const char* op)
{ {
if (vulkan == 0) if (spvVersion.vulkan == 0)
error(loc, "only allowed when using GLSL for Vulkan", op, ""); error(loc, "only allowed when using GLSL for Vulkan", op, "");
} }
// Call for any operation that requires SPIR-V. // Call for any operation that requires SPIR-V.
void TParseVersions::requireSpv(const TSourceLoc& loc, const char* op) void TParseVersions::requireSpv(const TSourceLoc& loc, const char* op)
{ {
if (spv == 0) if (spvVersion.spv == 0)
error(loc, "only allowed when generating SPIR-V", op, ""); error(loc, "only allowed when generating SPIR-V", op, "");
} }
......
...@@ -72,6 +72,17 @@ inline const char* ProfileName(EProfile profile) ...@@ -72,6 +72,17 @@ inline const char* ProfileName(EProfile profile)
} }
// //
// SPIR-V has versions for multiple things; tie them together.
// 0 means a target or rule set is not enabled.
//
struct SpvVersion {
SpvVersion() : spv(0), vulkan(0), openGl(0) {}
unsigned int spv; // the version of the targeted SPIR-V, as defined by SPIR-V in word 1 of the SPIR-V binary header
int vulkan; // the version of semantics for Vulkan; e.g., for GLSL from KHR_vulkan_glsl "#define VULKAN"
int openGl; // the version of semantics for OpenGL; gl_spirv TODO
};
//
// The behaviors from the GLSL "#extension extension_name : behavior" // The behaviors from the GLSL "#extension extension_name : behavior"
// //
typedef enum { typedef enum {
......
...@@ -125,7 +125,7 @@ class TVariable; ...@@ -125,7 +125,7 @@ class TVariable;
class TIntermediate { class TIntermediate {
public: public:
explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) : explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) :
source(EShSourceNone), language(l), profile(p), version(v), spv(0), treeRoot(0), source(EShSourceNone), language(l), profile(p), version(v), treeRoot(0),
numMains(0), numErrors(0), numPushConstants(0), recursive(false), numMains(0), numErrors(0), numPushConstants(0), recursive(false),
invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet), inputPrimitive(ElgNone), outputPrimitive(ElgNone), invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet), inputPrimitive(ElgNone), outputPrimitive(ElgNone),
pixelCenterInteger(false), originUpperLeft(false), pixelCenterInteger(false), originUpperLeft(false),
...@@ -154,8 +154,8 @@ public: ...@@ -154,8 +154,8 @@ public:
int getVersion() const { return version; } int getVersion() const { return version; }
void setProfile(EProfile p) { profile = p; } void setProfile(EProfile p) { profile = p; }
EProfile getProfile() const { return profile; } EProfile getProfile() const { return profile; }
void setSpv(int s) { spv = s; } void setSpv(const SpvVersion& s) { spvVersion = s; }
int getSpv() const { return spv; } const SpvVersion& getSpv() const { return spvVersion; }
EShLanguage getStage() const { return language; } EShLanguage getStage() const { return language; }
void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); } void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); }
const std::set<std::string>& getRequestedExtensions() const { return requestedExtensions; } const std::set<std::string>& getRequestedExtensions() const { return requestedExtensions; }
...@@ -352,7 +352,7 @@ protected: ...@@ -352,7 +352,7 @@ protected:
std::string entryPoint; std::string entryPoint;
EProfile profile; EProfile profile;
int version; int version;
int spv; SpvVersion spvVersion;
TIntermNode* treeRoot; TIntermNode* treeRoot;
std::set<std::string> requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them std::set<std::string> requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
TBuiltInResource resources; TBuiltInResource resources;
......
...@@ -54,10 +54,10 @@ namespace glslang { ...@@ -54,10 +54,10 @@ namespace glslang {
class TParseVersions { class TParseVersions {
public: public:
TParseVersions(TIntermediate& interm, int version, EProfile profile, TParseVersions(TIntermediate& interm, int version, EProfile profile,
int spv, int vulkan, EShLanguage language, TInfoSink& infoSink, const SpvVersion& spvVersion, EShLanguage language, TInfoSink& infoSink,
bool forwardCompatible, EShMessages messages) bool forwardCompatible, EShMessages messages)
: infoSink(infoSink), version(version), profile(profile), language(language), : infoSink(infoSink), version(version), profile(profile), language(language),
spv(spv), vulkan(vulkan), forwardCompatible(forwardCompatible), spvVersion(spvVersion), forwardCompatible(forwardCompatible),
intermediate(interm), messages(messages), numErrors(0), currentScanner(0) { } intermediate(interm), messages(messages), numErrors(0), currentScanner(0) { }
virtual ~TParseVersions() { } virtual ~TParseVersions() { }
virtual void initializeExtensionBehavior(); virtual void initializeExtensionBehavior();
...@@ -114,8 +114,7 @@ public: ...@@ -114,8 +114,7 @@ public:
int version; // version, updated by #version in the shader int version; // version, updated by #version in the shader
EProfile profile; // the declared profile in the shader (core by default) EProfile profile; // the declared profile in the shader (core by default)
EShLanguage language; // really the stage EShLanguage language; // really the stage
int spv; // SPIR-V version; 0 means not SPIR-V SpvVersion spvVersion;
int vulkan; // Vulkan version; 0 means not vulkan
bool forwardCompatible; // true if errors are to be given for use of deprecated features bool forwardCompatible; // true if errors are to be given for use of deprecated features
TIntermediate& intermediate; // helper for making and hooking up pieces of the parse tree TIntermediate& intermediate; // helper for making and hooking up pieces of the parse tree
......
...@@ -49,9 +49,9 @@ ...@@ -49,9 +49,9 @@
namespace glslang { namespace glslang {
HlslParseContext::HlslParseContext(TSymbolTable& symbolTable, TIntermediate& interm, bool /*parsingBuiltins*/, HlslParseContext::HlslParseContext(TSymbolTable& symbolTable, TIntermediate& interm, bool /*parsingBuiltins*/,
int version, EProfile profile, int spv, int vulkan, EShLanguage language, TInfoSink& infoSink, int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TInfoSink& infoSink,
bool forwardCompatible, EShMessages messages) : bool forwardCompatible, EShMessages messages) :
TParseContextBase(symbolTable, interm, version, profile, spv, vulkan, language, infoSink, forwardCompatible, messages), TParseContextBase(symbolTable, interm, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),
contextPragma(true, false), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0), contextPragma(true, false), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0),
postMainReturn(false), postMainReturn(false),
limits(resources.limits), limits(resources.limits),
...@@ -62,11 +62,11 @@ HlslParseContext::HlslParseContext(TSymbolTable& symbolTable, TIntermediate& int ...@@ -62,11 +62,11 @@ HlslParseContext::HlslParseContext(TSymbolTable& symbolTable, TIntermediate& int
globalUniformDefaults.clear(); globalUniformDefaults.clear();
globalUniformDefaults.layoutMatrix = ElmColumnMajor; globalUniformDefaults.layoutMatrix = ElmColumnMajor;
globalUniformDefaults.layoutPacking = vulkan > 0 ? ElpStd140 : ElpShared; globalUniformDefaults.layoutPacking = ElpStd140;
globalBufferDefaults.clear(); globalBufferDefaults.clear();
globalBufferDefaults.layoutMatrix = ElmColumnMajor; globalBufferDefaults.layoutMatrix = ElmColumnMajor;
globalBufferDefaults.layoutPacking = vulkan > 0 ? ElpStd430 : ElpShared; globalBufferDefaults.layoutPacking = ElpStd430;
globalInputDefaults.clear(); globalInputDefaults.clear();
globalOutputDefaults.clear(); globalOutputDefaults.clear();
...@@ -2416,18 +2416,6 @@ void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& pu ...@@ -2416,18 +2416,6 @@ void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& pu
publicType.qualifier.layoutMatrix = ElmRowMajor; publicType.qualifier.layoutMatrix = ElmRowMajor;
return; return;
} }
if (id == TQualifier::getLayoutPackingString(ElpPacked)) {
if (vulkan > 0)
vulkanRemoved(loc, "packed");
publicType.qualifier.layoutPacking = ElpPacked;
return;
}
if (id == TQualifier::getLayoutPackingString(ElpShared)) {
if (vulkan > 0)
vulkanRemoved(loc, "shared");
publicType.qualifier.layoutPacking = ElpShared;
return;
}
if (id == "push_constant") { if (id == "push_constant") {
requireVulkan(loc, "push_constant"); requireVulkan(loc, "push_constant");
publicType.qualifier.layoutPushConstant = true; publicType.qualifier.layoutPushConstant = true;
...@@ -2714,7 +2702,7 @@ void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& pu ...@@ -2714,7 +2702,7 @@ void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& pu
publicType.shaderQualifiers.localSize[2] = value; publicType.shaderQualifiers.localSize[2] = value;
return; return;
} }
if (spv > 0) { if (spvVersion.spv != 0) {
if (id == "local_size_x_id") { if (id == "local_size_x_id") {
publicType.shaderQualifiers.localSizeSpecId[0] = value; publicType.shaderQualifiers.localSizeSpecId[0] = value;
return; return;
......
...@@ -44,7 +44,7 @@ namespace glslang { ...@@ -44,7 +44,7 @@ namespace glslang {
class HlslParseContext : public TParseContextBase { class HlslParseContext : public TParseContextBase {
public: public:
HlslParseContext(TSymbolTable&, TIntermediate&, bool parsingBuiltins, HlslParseContext(TSymbolTable&, TIntermediate&, bool parsingBuiltins,
int version, EProfile, int spv, int vulkan, EShLanguage, TInfoSink&, int version, EProfile, const SpvVersion& spvVersion, EShLanguage, TInfoSink&,
bool forwardCompatible = false, EShMessages messages = EShMsgDefault); bool forwardCompatible = false, EShMessages messages = EShMsgDefault);
virtual ~HlslParseContext(); virtual ~HlslParseContext();
void setLimits(const TBuiltInResource&); void setLimits(const TBuiltInResource&);
......
...@@ -218,7 +218,7 @@ TBuiltInParseablesHlsl::TBuiltInParseablesHlsl() ...@@ -218,7 +218,7 @@ TBuiltInParseablesHlsl::TBuiltInParseablesHlsl()
// Most built-ins variables can be added as simple text strings. Some need to // Most built-ins variables can be added as simple text strings. Some need to
// be added programmatically, which is done later in IdentifyBuiltIns() below. // be added programmatically, which is done later in IdentifyBuiltIns() below.
// //
void TBuiltInParseablesHlsl::initialize(int version, EProfile profile, int spv, int vulkan) void TBuiltInParseablesHlsl::initialize(int version, EProfile profile, const SpvVersion& spvVersion)
{ {
static const EShLanguageMask EShLangAll = EShLanguageMask(EShLangCount - 1); static const EShLanguageMask EShLangAll = EShLanguageMask(EShLangCount - 1);
...@@ -229,8 +229,8 @@ void TBuiltInParseablesHlsl::initialize(int version, EProfile profile, int spv, ...@@ -229,8 +229,8 @@ void TBuiltInParseablesHlsl::initialize(int version, EProfile profile, int spv,
// typekey can be: // typekey can be:
// D = double, F = float, U = uint, I = int, B = bool, S = sampler, - = void // D = double, F = float, U = uint, I = int, B = bool, S = sampler, - = void
// An empty order or type key repeats the first one. E.g: SVM,, means 3 args each of SVM. // An empty order or type key repeats the first one. E.g: SVM,, means 3 args each of SVM.
// '>' as first letter of order creates an output paremeter // '>' as first letter of order creates an output parameter
// '<' as first letter of order creates an input paremeter // '<' as first letter of order creates an input parameter
// '^' as first letter of order takes transpose dimensions // '^' as first letter of order takes transpose dimensions
static const struct { static const struct {
...@@ -498,8 +498,8 @@ void TBuiltInParseablesHlsl::initialize(int version, EProfile profile, int spv, ...@@ -498,8 +498,8 @@ void TBuiltInParseablesHlsl::initialize(int version, EProfile profile, int spv,
// add stage-specific entries to the commonBuiltins, and only if that stage // add stage-specific entries to the commonBuiltins, and only if that stage
// was requested. // was requested.
// //
void TBuiltInParseablesHlsl::initialize(const TBuiltInResource &resources, int version, EProfile profile, int spv, void TBuiltInParseablesHlsl::initialize(const TBuiltInResource &resources, int version, EProfile profile,
int vulkan, EShLanguage language) const SpvVersion& spvVersion, EShLanguage language)
{ {
} }
...@@ -512,7 +512,7 @@ void TBuiltInParseablesHlsl::initialize(const TBuiltInResource &resources, int v ...@@ -512,7 +512,7 @@ void TBuiltInParseablesHlsl::initialize(const TBuiltInResource &resources, int v
// 3) Tag extension-related symbols added to their base version with their extensions, so // 3) Tag extension-related symbols added to their base version with their extensions, so
// that if an early version has the extension turned off, there is an error reported on use. // that if an early version has the extension turned off, there is an error reported on use.
// //
void TBuiltInParseablesHlsl::identifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLanguage language, void TBuiltInParseablesHlsl::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language,
TSymbolTable& symbolTable) TSymbolTable& symbolTable)
{ {
// symbolTable.relateToOperator("abort", EOpAbort); // symbolTable.relateToOperator("abort", EOpAbort);
...@@ -660,7 +660,7 @@ void TBuiltInParseablesHlsl::identifyBuiltIns(int version, EProfile profile, int ...@@ -660,7 +660,7 @@ void TBuiltInParseablesHlsl::identifyBuiltIns(int version, EProfile profile, int
// 2) Tag extension-related symbols added to their base version with their extensions, so // 2) Tag extension-related symbols added to their base version with their extensions, so
// that if an early version has the extension turned off, there is an error reported on use. // that if an early version has the extension turned off, there is an error reported on use.
// //
void TBuiltInParseablesHlsl::identifyBuiltIns(int version, EProfile profile, int spv, int /*vulkan*/, EShLanguage language, void TBuiltInParseablesHlsl::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language,
TSymbolTable& symbolTable, const TBuiltInResource &resources) TSymbolTable& symbolTable, const TBuiltInResource &resources)
{ {
} }
......
...@@ -48,12 +48,12 @@ class TBuiltInParseablesHlsl : public TBuiltInParseables { ...@@ -48,12 +48,12 @@ class TBuiltInParseablesHlsl : public TBuiltInParseables {
public: public:
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
TBuiltInParseablesHlsl(); TBuiltInParseablesHlsl();
void initialize(int version, EProfile, int spv, int vulkan); void initialize(int version, EProfile, const SpvVersion& spvVersion);
void initialize(const TBuiltInResource& resources, int version, EProfile, int spv, int vulkan, EShLanguage); void initialize(const TBuiltInResource& resources, int version, EProfile, const SpvVersion& spvVersion, EShLanguage);
void identifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLanguage language, TSymbolTable& symbolTable); void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable);
void identifyBuiltIns(int version, EProfile profile, int spv, int /*vulkan*/, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources); void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources);
}; };
} // end namespace glslang } // end namespace glslang
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment