aboutsummaryrefslogtreecommitdiff
path: root/glslang/MachineIndependent/linkValidate.cpp
diff options
context:
space:
mode:
authorDavid Neto <dneto@google.com>2023-01-16 16:35:49 -0500
committerDavid Neto <dneto@google.com>2023-01-16 18:39:12 -0500
commit3413ac75f77bea1fb8cc7f04fd83a62384e1d34e (patch)
treeeb7973ea8406bd6e91a6e1ecc1e3119fc66b0887 /glslang/MachineIndependent/linkValidate.cpp
parent7e8734f89a7a56ec1326e9ea9bfbc847f38e2f32 (diff)
parent1fb2f1d7896627d62a289439a2c3e750e551a7ab (diff)
downloadglslang-3413ac75f77bea1fb8cc7f04fd83a62384e1d34e.tar.gz
Merge remote-tracking branch 'aosp/upstream-master' into update-shaderc
Includes: 1fb2f1d7 Merge pull request #3108 from greg-lunarg/i3105 9b67d41b Fix crash on bad structure member reference 06a7078c build: Remove AMD_EXTENSIONS / NV_EXTENSIONS defines 1d978158 Merge pull request #3100 from daniel-story/fix-dual-src-draw-buffers d1fc064e Merge pull request #3102 from jeremy-lunarg/hayes-fix-debuginfo-disassembly d38d06c0 Fix debuginfo disassembly 68935bc2 Merge pull request #3099 from jeremy-lunarg/hayes-fix-issue-3095 bec8359b Fix const parameter debug types a88f6741 Fix issues with MaxDualSourceDrawBuffersEXT dcae1873 Remove languages from cmake project statement f9b760e6 [glslang] Refine implicit array size interfaces. (#3074) c6b3f279 Merge pull request #3087 from dneto0/remove-unused 4fe00178 Remove the name of unused formal paramters 6d8b00b1 Add support for GL_NV_shader_invocation_reorder. (#3054) 4fc43cd3 Add support for GL_NV_shader_invocation_reorder. (#3054) 19d816c8 Merge pull request #3086 from jeremy-lunarg/hayes-fix-3073 586baa35 Guard AppleClang linker options ed257e2b Merge pull request #3066 from ShchchowAMD/shaochi/bindless 16526fd9 [glslang][EXT] Support extension ARB_bindless_texture. 77551c42 Merge pull request #3081 from jeremy-lunarg/hayes-update-changes 5f6fa4e7 Merge pull request #3080 from jeremy-lunarg/hayes-update-known-good 683c0f34 Update CHANGES for release 11.13.0 08cf7bd2 Update known_good.json e3e8baf8 Merge pull request #3079 from gby/GL_ARM_shader_core_builtins 0464ff45 GL_ARM_shader_core_builtins support a7603c13 Use nullptr where possible instead of NULL or 0 728c6895 Include: PoolAlloc: do not rely on CMake define 12bb8602 Merge pull request #3077 from greg-lunarg/edos3 7f047b98 Add EliminateDeadOutputStores to API. 0cd93a0e Merge pull request #3076 from greg-lunarg/kg124 1ddba01a Update known goods 88fd417b Fix locations of cmake files in side compat shims 2b2523fb Merge pull request #3061 from ShabbyX/remove-angle-build-flag 6b2493a4 Remove GLSLANG_ANGLE f4cba22d Merge pull request #3060 from greg-lunarg/limit3 cc4c7330 Fix include in resource_limits_c.h 5e08deae Merge pull request #3057 from ShabbyX/fix-gn-build 1813a14a Fix gn build 8da64950 Merge pull request #3055 from greg-lunarg/limit2 90c52143 Improve ResourceLimits interface to be more forward compatible 1a8869e4 Merge pull request #3050 from Try/mesh-shader-ibo-fixup 11409249 update failing test-cases 980ac508 Merge pull request #3047 from akien-mga/spirv.hpp-dos2unix 0c3c37de Merge pull request #3046 from amdrexu/bugfix a0ad0d70 Merge pull request #3043 from gnl21/helper-invocation a21b8d8d mesh shader: fix implicit index-array size calculation for lines and triangles 5c352476 Test for spv1.6 + memory model HelperInvocation d570b2b0 Change Volatile generation for HelperInvocation 5755de46 Merge pull request #3049 from jeremy-lunarg/hayes-update-changes 78221d61 Update CHANGES for release 11.12.0 ef6c9714 Merge pull request #3048 from jeremy-lunarg/hayes-update-known-good a77d26f0 Update known_good.json 568e233e Merge pull request #3037 from mbechard/master 15bd5048 Merge pull request #3045 from James2022-rgb/feature/c_interface_preamble_support 7541f398 Convert spirv.hpp line endings to LF (Unix style) 17b0a218 Fix incorrect parse message of mesh shader 573e9849 CInterface: Add preamble support. d11c3ff3 only use dead input elimination on vertex shaders Testing: checkbuild.py on Linux Change-Id: Ie3eacf3d18a88f7e160487515296cc82edef0ad8
Diffstat (limited to 'glslang/MachineIndependent/linkValidate.cpp')
-rw-r--r--glslang/MachineIndependent/linkValidate.cpp55
1 files changed, 49 insertions, 6 deletions
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index acc512fd..3a4cb567 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -89,7 +89,7 @@ void TIntermediate::warn(TInfoSink& infoSink, const char* message, EShLanguage u
//
void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
{
-#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
+#if !defined(GLSLANG_WEB)
mergeCallGraphs(infoSink, unit);
mergeModes(infoSink, unit);
mergeTrees(infoSink, unit);
@@ -161,7 +161,7 @@ void TIntermediate::mergeCallGraphs(TInfoSink& infoSink, TIntermediate& unit)
callGraph.insert(callGraph.end(), unit.callGraph.begin(), unit.callGraph.end());
}
-#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
+#if !defined(GLSLANG_WEB)
#define MERGE_MAX(member) member = std::max(member, unit.member)
#define MERGE_TRUE(member) if (unit.member) member = unit.member;
@@ -750,6 +750,21 @@ void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& lin
}
// Update implicit array sizes
+ if (symbol->getWritableType().isImplicitlySizedArray() && unitSymbol->getType().isImplicitlySizedArray()) {
+ if (unitSymbol->getType().getImplicitArraySize() > symbol->getType().getImplicitArraySize()){
+ symbol->getWritableType().updateImplicitArraySize(unitSymbol->getType().getImplicitArraySize());
+ }
+ }
+ else if (symbol->getWritableType().isImplicitlySizedArray() && unitSymbol->getType().isSizedArray()) {
+ if (symbol->getWritableType().getImplicitArraySize() > unitSymbol->getType().getOuterArraySize())
+ error(infoSink, "Implicit size of unsized array doesn't match same symbol among multiple shaders.");
+ }
+ else if (unitSymbol->getType().isImplicitlySizedArray() && symbol->getWritableType().isSizedArray()) {
+ if (unitSymbol->getType().getImplicitArraySize() > symbol->getWritableType().getOuterArraySize())
+ error(infoSink, "Implicit size of unsized array doesn't match same symbol among multiple shaders.");
+ }
+
+ // Update implicit array sizes
mergeImplicitArraySizes(symbol->getWritableType(), unitSymbol->getType());
// Check for consistent types/qualification/initializers etc.
@@ -759,6 +774,19 @@ void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& lin
else if (symbol->getQualifier().isPushConstant() && unitSymbol->getQualifier().isPushConstant() && getStage() == unitStage)
error(infoSink, "Only one push_constant block is allowed per stage");
}
+
+ // Check conflicts between preset primitives and sizes of I/O variables among multiple geometry shaders
+ if (language == EShLangGeometry && unitStage == EShLangGeometry)
+ {
+ TIntermSymbol* unitSymbol = unitLinkerObjects[unitLinkObj]->getAsSymbolNode();
+ if (unitSymbol->isArray() && unitSymbol->getQualifier().storage == EvqVaryingIn && unitSymbol->getQualifier().builtIn == EbvNone)
+ if ((unitSymbol->getArraySizes()->isImplicitlySized() &&
+ unitSymbol->getArraySizes()->getImplicitSize() != TQualifier::mapGeometryToSize(getInputPrimitive())) ||
+ (! unitSymbol->getArraySizes()->isImplicitlySized() &&
+ unitSymbol->getArraySizes()->getDimSize(0) != TQualifier::mapGeometryToSize(getInputPrimitive())))
+ error(infoSink, "Not all array sizes match across all geometry shaders in the program");
+ }
+
if (merge) {
linkerObjects.push_back(unitLinkerObjects[unitLinkObj]);
@@ -828,7 +856,7 @@ void TIntermediate::mergeImplicitArraySizes(TType& type, const TType& unitType)
//
void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& symbol, const TIntermSymbol& unitSymbol, EShLanguage unitStage)
{
-#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
+#if !defined(GLSLANG_WEB)
bool crossStage = getStage() != unitStage;
bool writeTypeComparison = false;
bool errorReported = false;
@@ -863,7 +891,8 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
else {
arraysMatch = symbol.getType().sameArrayness(unitSymbol.getType()) ||
(symbol.getType().isArray() && unitSymbol.getType().isArray() &&
- (symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()));
+ (symbol.getType().isImplicitlySizedArray() || unitSymbol.getType().isImplicitlySizedArray() ||
+ symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()));
}
int lpidx = -1;
@@ -1383,7 +1412,7 @@ void TIntermediate::checkCallGraphCycles(TInfoSink& infoSink)
TCall* newRoot;
do {
// See if we have unvisited parts of the graph.
- newRoot = 0;
+ newRoot = nullptr;
for (TGraph::iterator call = callGraph.begin(); call != callGraph.end(); ++call) {
if (! call->visited) {
newRoot = &(*call);
@@ -1517,7 +1546,10 @@ void TIntermediate::checkCallGraphBodies(TInfoSink& infoSink, bool keepUncalled)
if (! keepUncalled) {
for (int f = 0; f < (int)functionSequence.size(); ++f) {
if (! reachable[f])
+ {
+ resetTopLevelUncalledStatus(functionSequence[f]->getAsAggregate()->getName());
functionSequence[f] = nullptr;
+ }
}
functionSequence.erase(std::remove(functionSequence.begin(), functionSequence.end(), nullptr), functionSequence.end());
}
@@ -1611,6 +1643,8 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ
setRT = 0;
else if (qualifier.isAnyCallable())
setRT = 1;
+ else if (qualifier.isHitObjectAttrNV())
+ setRT = 2;
else
return -1;
@@ -1650,7 +1684,7 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ
// slot irrespective of type.
int collision = -1; // no collision
#ifndef GLSLANG_WEB
- if (qualifier.isAnyPayload() || qualifier.isAnyCallable()) {
+ if (qualifier.isAnyPayload() || qualifier.isAnyCallable() || qualifier.isHitObjectAttrNV()) {
TRange range(qualifier.layoutLocation, qualifier.layoutLocation);
collision = checkLocationRT(setRT, qualifier.layoutLocation);
if (collision < 0)
@@ -2012,6 +2046,15 @@ int TIntermediate::getBaseAlignmentScalar(const TType& type, int& size)
case EbtInt16:
case EbtUint16: size = 2; return 2;
case EbtReference: size = 8; return 8;
+ case EbtSampler:
+ {
+ if (type.isBindlessImage() || type.isBindlessTexture()) {
+ size = 8; return 8;
+ }
+ else {
+ size = 4; return 4;
+ }
+ }
default: size = 4; return 4;
}
}