Merge pull request #2286 from ben-clayton/kokoro-static-shared
Kokoro: Split linux cmake cfgs into static/shared
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index b63d901..e0480d1 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -5336,6 +5336,8 @@
// need space to hold the copy
arg = builder.createVariable(spv::StorageClassFunction,
builder.getContainedTypeId(function->getParamType(a)), "param");
+ if (function->isReducedPrecisionParam(a))
+ builder.setPrecision(arg, spv::DecorationRelaxedPrecision);
if (qualifiers[a] == glslang::EvqIn || qualifiers[a] == glslang::EvqInOut) {
// need to copy the input into output space
builder.setAccessChain(lValues[lValueCount]);
@@ -5346,13 +5348,21 @@
}
++lValueCount;
} else {
+ const bool argIsRelaxedPrecision = TranslatePrecisionDecoration(*argTypes[a]) ==
+ spv::DecorationRelaxedPrecision;
// process r-value, which involves a copy for a type mismatch
- if (function->getParamType(a) != convertGlslangToSpvType(*argTypes[a])) {
+ if (function->getParamType(a) != convertGlslangToSpvType(*argTypes[a]) ||
+ argIsRelaxedPrecision != function->isReducedPrecisionParam(a))
+ {
spv::Id argCopy = builder.createVariable(spv::StorageClassFunction, function->getParamType(a), "arg");
+ if (function->isReducedPrecisionParam(a))
+ builder.setPrecision(argCopy, spv::DecorationRelaxedPrecision);
builder.clearAccessChain();
builder.setAccessChainLValue(argCopy);
multiTypeStore(*argTypes[a], rValues[rValueCount]);
arg = builder.createLoad(argCopy);
+ if (function->isReducedPrecisionParam(a))
+ builder.setPrecision(arg, spv::DecorationRelaxedPrecision);
} else
arg = rValues[rValueCount];
++rValueCount;
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index 62b7d0e..f884224 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -1298,8 +1298,11 @@
// Set up the precisions
setPrecision(function->getId(), precision);
for (unsigned p = 0; p < (unsigned)decorations.size(); ++p) {
- for (int d = 0; d < (int)decorations[p].size(); ++d)
+ for (int d = 0; d < (int)decorations[p].size(); ++d) {
addDecoration(firstParamId + p, decorations[p][d]);
+ if (decorations[p][d] == DecorationRelaxedPrecision)
+ function->addReducedPrecisionParam(p);
+ }
}
// CFG
diff --git a/SPIRV/spvIR.h b/SPIRV/spvIR.h
index 6523035..6146518 100755
--- a/SPIRV/spvIR.h
+++ b/SPIRV/spvIR.h
@@ -55,6 +55,7 @@
#include <iostream>
#include <memory>
#include <vector>
+#include <set>
namespace spv {
@@ -355,6 +356,10 @@
void setImplicitThis() { implicitThis = true; }
bool hasImplicitThis() const { return implicitThis; }
+ void addReducedPrecisionParam(int p) { reducedPrecisionParams.insert(p); }
+ bool isReducedPrecisionParam(int p) const
+ { return reducedPrecisionParams.find(p) != reducedPrecisionParams.end(); }
+
void dump(std::vector<unsigned int>& out) const
{
// OpFunction
@@ -379,6 +384,7 @@
std::vector<Instruction*> parameterInstructions;
std::vector<Block*> blocks;
bool implicitThis; // true if this is a member function expecting to be passed a 'this' as the first argument
+ std::set<int> reducedPrecisionParams; // list of parameter indexes that need a relaxed precision arg
};
//
diff --git a/Test/baseResults/spv.forwardFun.frag.out b/Test/baseResults/spv.forwardFun.frag.out
index 0a0e5e3..e0d749b 100644
--- a/Test/baseResults/spv.forwardFun.frag.out
+++ b/Test/baseResults/spv.forwardFun.frag.out
@@ -26,6 +26,7 @@
Decorate 15(bar) RelaxedPrecision
Decorate 18(color) RelaxedPrecision
Decorate 20(BaseColor) RelaxedPrecision
+ Decorate 21(param) RelaxedPrecision
Decorate 22 RelaxedPrecision
Decorate 23 RelaxedPrecision
Decorate 24 RelaxedPrecision
diff --git a/Test/baseResults/spv.noDeadDecorations.vert.out b/Test/baseResults/spv.noDeadDecorations.vert.out
index e48cba0..4a4d7b3 100644
--- a/Test/baseResults/spv.noDeadDecorations.vert.out
+++ b/Test/baseResults/spv.noDeadDecorations.vert.out
@@ -23,6 +23,7 @@
MemberDecorate 20(gl_PerVertex) 0 BuiltIn Position
MemberDecorate 20(gl_PerVertex) 1 BuiltIn PointSize
Decorate 20(gl_PerVertex) Block
+ Decorate 26(param) RelaxedPrecision
Decorate 27 RelaxedPrecision
2: TypeVoid
3: TypeFunction 2
diff --git a/Test/baseResults/spv.precisionArgs.frag.out b/Test/baseResults/spv.precisionArgs.frag.out
new file mode 100755
index 0000000..b670fc8
--- /dev/null
+++ b/Test/baseResults/spv.precisionArgs.frag.out
@@ -0,0 +1,92 @@
+spv.precisionArgs.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 42
+
+ Capability Shader
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint Fragment 4 "main"
+ ExecutionMode 4 OriginUpperLeft
+ Source ESSL 310
+ Name 4 "main"
+ Name 10 "fooConst(f1;f1;"
+ Name 8 "f"
+ Name 9 "g"
+ Name 16 "foo(f1;f1;"
+ Name 14 "f"
+ Name 15 "g"
+ Name 18 "aM"
+ Name 20 "bM"
+ Name 22 "arg"
+ Name 25 "aH"
+ Name 27 "bH"
+ Name 29 "arg"
+ Name 32 "param"
+ Name 34 "param"
+ Name 37 "param"
+ Name 39 "param"
+ Decorate 8(f) RelaxedPrecision
+ Decorate 14(f) RelaxedPrecision
+ Decorate 18(aM) RelaxedPrecision
+ Decorate 19 RelaxedPrecision
+ Decorate 20(bM) RelaxedPrecision
+ Decorate 21 RelaxedPrecision
+ Decorate 29(arg) RelaxedPrecision
+ Decorate 30 RelaxedPrecision
+ Decorate 32(param) RelaxedPrecision
+ Decorate 33 RelaxedPrecision
+ Decorate 35 RelaxedPrecision
+ Decorate 37(param) RelaxedPrecision
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeFloat 32
+ 7: TypeFunction 2 6(float) 6(float)
+ 12: TypePointer Function 6(float)
+ 13: TypeFunction 2 12(ptr) 12(ptr)
+ 4(main): 2 Function None 3
+ 5: Label
+ 18(aM): 12(ptr) Variable Function
+ 20(bM): 12(ptr) Variable Function
+ 22(arg): 12(ptr) Variable Function
+ 25(aH): 12(ptr) Variable Function
+ 27(bH): 12(ptr) Variable Function
+ 29(arg): 12(ptr) Variable Function
+ 32(param): 12(ptr) Variable Function
+ 34(param): 12(ptr) Variable Function
+ 37(param): 12(ptr) Variable Function
+ 39(param): 12(ptr) Variable Function
+ 19: 6(float) Load 18(aM)
+ 21: 6(float) Load 20(bM)
+ Store 22(arg) 21
+ 23: 6(float) Load 22(arg)
+ 24: 2 FunctionCall 10(fooConst(f1;f1;) 19 23
+ 26: 6(float) Load 25(aH)
+ 28: 6(float) Load 27(bH)
+ Store 29(arg) 26
+ 30: 6(float) Load 29(arg)
+ 31: 2 FunctionCall 10(fooConst(f1;f1;) 30 28
+ 33: 6(float) Load 18(aM)
+ Store 32(param) 33
+ 35: 6(float) Load 20(bM)
+ Store 34(param) 35
+ 36: 2 FunctionCall 16(foo(f1;f1;) 32(param) 34(param)
+ 38: 6(float) Load 25(aH)
+ Store 37(param) 38
+ 40: 6(float) Load 27(bH)
+ Store 39(param) 40
+ 41: 2 FunctionCall 16(foo(f1;f1;) 37(param) 39(param)
+ Return
+ FunctionEnd
+10(fooConst(f1;f1;): 2 Function None 7
+ 8(f): 6(float) FunctionParameter
+ 9(g): 6(float) FunctionParameter
+ 11: Label
+ Return
+ FunctionEnd
+ 16(foo(f1;f1;): 2 Function None 13
+ 14(f): 12(ptr) FunctionParameter
+ 15(g): 12(ptr) FunctionParameter
+ 17: Label
+ Return
+ FunctionEnd
diff --git a/Test/baseResults/spv.switch.frag.out b/Test/baseResults/spv.switch.frag.out
index dda061f..cd6dde2 100644
--- a/Test/baseResults/spv.switch.frag.out
+++ b/Test/baseResults/spv.switch.frag.out
@@ -154,15 +154,21 @@
Decorate 230 RelaxedPrecision
Decorate 231 RelaxedPrecision
Decorate 233(v) RelaxedPrecision
+ Decorate 234(param) RelaxedPrecision
Decorate 235 RelaxedPrecision
+ Decorate 236(param) RelaxedPrecision
Decorate 237 RelaxedPrecision
+ Decorate 238(param) RelaxedPrecision
Decorate 239 RelaxedPrecision
Decorate 240 RelaxedPrecision
Decorate 243 RelaxedPrecision
Decorate 244 RelaxedPrecision
Decorate 245 RelaxedPrecision
+ Decorate 246(param) RelaxedPrecision
Decorate 247 RelaxedPrecision
+ Decorate 248(param) RelaxedPrecision
Decorate 249 RelaxedPrecision
+ Decorate 250(param) RelaxedPrecision
Decorate 251 RelaxedPrecision
Decorate 252 RelaxedPrecision
Decorate 254 RelaxedPrecision
diff --git a/Test/spv.precisionArgs.frag b/Test/spv.precisionArgs.frag
new file mode 100644
index 0000000..24be1d0
--- /dev/null
+++ b/Test/spv.precisionArgs.frag
@@ -0,0 +1,17 @@
+#version 310 es
+
+precision mediump float;
+
+void fooConst(const in float f, const in highp float g) { }
+
+void foo(in float f, in highp float g) { }
+
+void main()
+{
+ float aM, bM;
+ highp float aH, bH;
+ fooConst(aM, bM); // must copy bM
+ fooConst(aH, bH); // must copy aH
+ foo(aM, bM);
+ foo(aH, bH);
+}
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index e1d9735..80a75aa 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -375,6 +375,7 @@
"spv.Operations.frag",
"spv.paramMemory.frag",
"spv.precision.frag",
+ "spv.precisionArgs.frag",
"spv.precisionNonESSamp.frag",
"spv.prepost.frag",
"spv.privateVariableTypes.frag",