aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sksl
diff options
context:
space:
mode:
authorGravatar Ethan Nicholas <ethannicholas@google.com>2018-07-13 12:48:50 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-07-13 18:35:34 +0000
commit81d151103faca621cfe62c9dfbec842ec9f337c4 (patch)
treecc871ef37e60158ee9dc3865fe096a9327188473 /src/sksl
parentbe396c05f904af1ced1c902df230098ad11555d7 (diff)
Fixed SPIR-V geometry shaders
sk_in count was being computed incorrectly, and the capabilities and interfaces were incorrect. Bug: skia:8143 Change-Id: If9ac7c152a3b04be3b81ead09270af6d053e006e Reviewed-on: https://skia-review.googlesource.com/141230 Reviewed-by: Chris Dalton <csmartdalton@google.com> Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Diffstat (limited to 'src/sksl')
-rw-r--r--src/sksl/SkSLSPIRVCodeGenerator.cpp39
-rw-r--r--src/sksl/SkSLSPIRVCodeGenerator.h2
2 files changed, 32 insertions, 9 deletions
diff --git a/src/sksl/SkSLSPIRVCodeGenerator.cpp b/src/sksl/SkSLSPIRVCodeGenerator.cpp
index 9cc933a921..84a15f1da1 100644
--- a/src/sksl/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/SkSLSPIRVCodeGenerator.cpp
@@ -362,6 +362,9 @@ void SPIRVCodeGenerator::writeCapabilities(OutputStream& out) {
if (fProgram.fKind == Program::kGeometry_Kind) {
this->writeInstruction(SpvOpCapability, SpvCapabilityGeometry, out);
}
+ else {
+ this->writeInstruction(SpvOpCapability, SpvCapabilityShader, out);
+ }
}
SpvId SPIRVCodeGenerator::nextId() {
@@ -2536,6 +2539,28 @@ void SPIRVCodeGenerator::writeLayout(const Layout& layout, SpvId target, int mem
}
}
+static void update_sk_in_count(const Modifiers& m, int* outSkInCount) {
+ switch (m.fLayout.fPrimitive) {
+ case Layout::kPoints_Primitive:
+ *outSkInCount = 1;
+ break;
+ case Layout::kLines_Primitive:
+ *outSkInCount = 2;
+ break;
+ case Layout::kLinesAdjacency_Primitive:
+ *outSkInCount = 4;
+ break;
+ case Layout::kTriangles_Primitive:
+ *outSkInCount = 3;
+ break;
+ case Layout::kTrianglesAdjacency_Primitive:
+ *outSkInCount = 6;
+ break;
+ default:
+ return;
+ }
+}
+
SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) {
bool isBuffer = (0 != (intf.fVariable.fModifiers.fFlags & Modifiers::kBuffer_Flag));
bool pushConstant = (0 != (intf.fVariable.fModifiers.fLayout.fFlags &
@@ -2559,12 +2584,7 @@ SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) {
for (const auto& e : fProgram) {
if (e.fKind == ProgramElement::kModifiers_Kind) {
const Modifiers& m = ((ModifiersDeclaration&) e).fModifiers;
- if (m.fFlags & Modifiers::kIn_Flag) {
- if (m.fLayout.fInvocations != -1) {
- fSkInCount = m.fLayout.fInvocations;
- break;
- }
- }
+ update_sk_in_count(m, &fSkInCount);
}
}
typeId = this->getType(Type("sk_in", Type::kArray_Kind, intf.fVariable.fType.componentType(),
@@ -2943,7 +2963,6 @@ void SPIRVCodeGenerator::writeGeometryShaderExecutionMode(SpvId entryPoint, Outp
if (m.fFlags & Modifiers::kIn_Flag) {
if (m.fLayout.fInvocations != -1) {
invocations = m.fLayout.fInvocations;
- fSkInCount = invocations;
}
SpvId input;
switch (m.fLayout.fPrimitive) {
@@ -2966,6 +2985,7 @@ void SPIRVCodeGenerator::writeGeometryShaderExecutionMode(SpvId entryPoint, Outp
input = 0;
break;
}
+ update_sk_in_count(m, &fSkInCount);
if (input) {
this->writeInstruction(SpvOpExecutionMode, entryPoint, input, out);
}
@@ -3072,9 +3092,12 @@ void SPIRVCodeGenerator::writeInstructions(const Program& program, OutputStream&
SkASSERT(main);
for (auto entry : fVariableMap) {
const Variable* var = entry.first;
+ int builtin = var->fModifiers.fLayout.fBuiltin;
if (var->fStorage == Variable::kGlobal_Storage &&
((var->fModifiers.fFlags & Modifiers::kIn_Flag) ||
- (var->fModifiers.fFlags & Modifiers::kOut_Flag))) {
+ (var->fModifiers.fFlags & Modifiers::kOut_Flag)) &&
+ builtin != SK_OUT_BUILTIN &&
+ builtin != SK_INVOCATIONID_BUILTIN) {
interfaceVars.insert(entry.second);
}
}
diff --git a/src/sksl/SkSLSPIRVCodeGenerator.h b/src/sksl/SkSLSPIRVCodeGenerator.h
index 16f5beb68f..7010c84701 100644
--- a/src/sksl/SkSLSPIRVCodeGenerator.h
+++ b/src/sksl/SkSLSPIRVCodeGenerator.h
@@ -69,7 +69,7 @@ public:
: INHERITED(program, errors, out)
, fContext(*context)
, fDefaultLayout(MemoryLayout::k140_Standard)
- , fCapabilities(1 << SpvCapabilityShader)
+ , fCapabilities(0)
, fIdCount(1)
, fBoolTrue(0)
, fBoolFalse(0)