From 81d151103faca621cfe62c9dfbec842ec9f337c4 Mon Sep 17 00:00:00 2001 From: Ethan Nicholas Date: Fri, 13 Jul 2018 12:48:50 -0400 Subject: 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 Commit-Queue: Ethan Nicholas --- src/sksl/SkSLSPIRVCodeGenerator.cpp | 39 +++++++++++++++++++++++++++++-------- src/sksl/SkSLSPIRVCodeGenerator.h | 2 +- 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) -- cgit v1.2.3