aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects/GrSkSLFP.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/effects/GrSkSLFP.cpp')
-rw-r--r--src/gpu/effects/GrSkSLFP.cpp220
1 files changed, 0 insertions, 220 deletions
diff --git a/src/gpu/effects/GrSkSLFP.cpp b/src/gpu/effects/GrSkSLFP.cpp
deleted file mode 100644
index 0fc949edda..0000000000
--- a/src/gpu/effects/GrSkSLFP.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright 2018 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "GrSkSLFP.h"
-#include "glsl/GrGLSLFragmentProcessor.h"
-#include "glsl/GrGLSLFragmentShaderBuilder.h"
-#include "glsl/GrGLSLProgramBuilder.h"
-#include "GrContext.h"
-#include "GrContextPriv.h"
-#include "GrTexture.h"
-#include "SkSLUtil.h"
-
-GrSkSLFPFactory::GrSkSLFPFactory(const char* name, const GrShaderCaps* shaderCaps, const char* sksl)
-: fName(name) {
- SkSL::Program::Settings settings;
- settings.fCaps = shaderCaps;
- fBaseProgram = fCompiler.convertProgram(SkSL::Program::kPipelineStage_Kind,
- SkSL::String(sksl),
- settings);
- if (fCompiler.errorCount()) {
- SkDebugf("%s\n", fCompiler.errorText().c_str());
- }
- SkASSERT(fBaseProgram);
- SkASSERT(!fCompiler.errorCount());
- for (const auto& e : *fBaseProgram) {
- if (e.fKind == SkSL::ProgramElement::kVar_Kind) {
- SkSL::VarDeclarations& v = (SkSL::VarDeclarations&) e;
- for (const auto& varStatement : v.fVars) {
- const SkSL::Variable& var = *((SkSL::VarDeclaration&) *varStatement).fVar;
- if (var.fModifiers.fFlags & SkSL::Modifiers::kIn_Flag) {
- fInputVars.push_back(&var);
- }
- if (var.fModifiers.fLayout.fKey) {
- fKeyVars.push_back(&var);
- }
- }
- }
- }
-}
-
-std::unique_ptr<GrFragmentProcessor> GrSkSLFPFactory::make(const void* inputs, size_t inputSize) {
- SkASSERT(!fCompiler.errorCount());
- SkSL::String key;
- size_t offset = 0;
- for (const auto& v : fInputVars) {
- if (&v->fType == fCompiler.context().fInt_Type.get()) {
- offset = SkAlign4(offset);
- if (v->fModifiers.fLayout.fKey) {
- key += ((char*) inputs)[offset + 0];
- key += ((char*) inputs)[offset + 1];
- key += ((char*) inputs)[offset + 2];
- key += ((char*) inputs)[offset + 3];
- }
- offset += sizeof(int32_t);
- }
- else {
- // unsupported input var type
- SkASSERT(false);
- }
- }
- SkASSERT(offset == inputSize);
- return std::unique_ptr<GrFragmentProcessor>(new GrSkSLFP(this, inputs, inputSize,
- std::move(key)));
-}
-
-const SkSL::Program* GrSkSLFPFactory::getSpecialization(const SkSL::String& key, const void* inputs,
- size_t inputSize) {
- const auto& found = fSpecializations.find(key);
- if (found != fSpecializations.end()) {
- return found->second.get();
- }
-
- std::unordered_map<SkSL::String, SkSL::Program::Settings::Value> inputMap;
- size_t offset = 0;
- for (const auto& v : fInputVars) {
- SkSL::String name(v->fName);
- if (&v->fType == fCompiler.context().fInt_Type.get()) {
- offset = SkAlign4(offset);
- int32_t v = *(int32_t*) (((uint8_t*) inputs) + offset);
- inputMap.insert(std::make_pair(name, SkSL::Program::Settings::Value(v)));
- offset += sizeof(int32_t);
- }
- }
- SkASSERT(offset == inputSize);
-
- std::unique_ptr<SkSL::Program> specialized = fCompiler.specialize(*fBaseProgram, inputMap);
- SkAssertResult(fCompiler.optimize(*specialized));
- const SkSL::Program* result = specialized.get();
- fSpecializations.insert(std::make_pair(key, std::move(specialized)));
- return result;
-}
-
-class GrGLSLSkSLFP : public GrGLSLFragmentProcessor {
-public:
- GrGLSLSkSLFP(SkSL::String glsl, std::vector<SkSL::Compiler::FormatArg> formatArgs)
- : fGLSL(glsl)
- , fFormatArgs(formatArgs) {}
-
- void emitCode(EmitArgs& args) override {
- GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
- int substringStartIndex = 0;
- int formatArgIndex = 0;
- for (size_t i = 0; i < fGLSL.length(); ++i) {
- char c = fGLSL[i];
- if (c == '%') {
- fragBuilder->codeAppend(fGLSL.c_str() + substringStartIndex,
- i - substringStartIndex);
- ++i;
- c = fGLSL[i];
- switch (c) {
- case 's':
- switch (fFormatArgs[formatArgIndex++]) {
- case SkSL::Compiler::FormatArg::kInput:
- fragBuilder->codeAppend(args.fInputColor ? args.fInputColor
- : "half4(1)");
- break;
- case SkSL::Compiler::FormatArg::kOutput:
- fragBuilder->codeAppend(args.fOutputColor);
- break;
- }
- break;
- default:
- fragBuilder->codeAppendf("%c", c);
- }
- substringStartIndex = i + 1;
- }
- }
- fragBuilder->codeAppend(fGLSL.c_str() + substringStartIndex,
- fGLSL.length() - substringStartIndex);
- }
-
- // nearly-finished GLSL; still contains printf-style "%s" format tokens
- const SkSL::String fGLSL;
- std::vector<SkSL::Compiler::FormatArg> fFormatArgs;
-};
-
-std::unique_ptr<GrFragmentProcessor> GrSkSLFP::Make(GrContext* context, int index, const char* name,
- const char* sksl, const void* inputs,
- size_t inputSize) {
- GrSkSLFPFactory* factory = context->contextPriv().getFPFactory(index);
- if (!factory) {
- factory = new GrSkSLFPFactory(name, context->contextPriv().caps()->shaderCaps(), sksl);
- context->contextPriv().setFPFactory(index, factory);
- }
- return factory->make(inputs, inputSize);
-}
-
-const char* GrSkSLFP::name() const {
- return fFactory.fName;
-}
-
-GrGLSLFragmentProcessor* GrSkSLFP::onCreateGLSLInstance() const {
- const SkSL::Program* specialized = fFactory.getSpecialization(fKey, fInputs.get(), fInputSize);
- SkSL::String glsl;
- std::vector<SkSL::Compiler::FormatArg> formatArgs;
- if (!fFactory.fCompiler.toPipelineStage(*specialized, &glsl, &formatArgs)) {
- printf("%s\n", fFactory.fCompiler.errorText().c_str());
- abort();
- }
- return new GrGLSLSkSLFP(glsl, formatArgs);
-}
-
-void GrSkSLFP::onGetGLSLProcessorKey(const GrShaderCaps& caps,
- GrProcessorKeyBuilder* b) const {
- const char* current = fKey.data();
- size_t length = fKey.length();
- for (size_t i = 0; i < length / 4; ++i) {
- b->add32(*(int32_t*) current);
- current += 4;
- }
- size_t excessCount = length % 4;
- if (excessCount) {
- int32_t excess = 0;
- for (size_t i = 0; i < excessCount; ++i) {
- excess <<= 8;
- excess += *current;
- ++current;
- }
- b->add32(excess);
- }
-}
-
-bool GrSkSLFP::onIsEqual(const GrFragmentProcessor& other) const {
- const GrSkSLFP& sk = other.cast<GrSkSLFP>();
- SkASSERT(fFactory.fBaseProgram != sk.fFactory.fBaseProgram || fInputSize == sk.fInputSize);
- return fFactory.fBaseProgram == sk.fFactory.fBaseProgram &&
- !memcmp(fInputs.get(), sk.fInputs.get(), fInputSize);
-}
-
-std::unique_ptr<GrFragmentProcessor> GrSkSLFP::clone() const {
- return std::unique_ptr<GrFragmentProcessor>(new GrSkSLFP(*this));
-}
-
-GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSkSLFP);
-
-#if GR_TEST_UTILS
-
-#include "SkGr.h"
-
-using Value = SkSL::Program::Settings::Value;
-
-std::unique_ptr<GrFragmentProcessor> GrSkSLFP::TestCreate(GrProcessorTestData* d) {
- int type = d->fRandom->nextULessThan(1);
- switch (type) {
- case 0: {
- static int ditherIndex = NewIndex();
- int rangeType = d->fRandom->nextULessThan(3);
- return GrSkSLFP::Make(d->context(), ditherIndex, "Dither", SKSL_DITHER_SRC, &rangeType,
- sizeof(rangeType));
- }
- }
- SK_ABORT("unreachable");
- return nullptr;
-}
-
-#endif