a2d22b2e08
Previously, DSLVar represented local, global, and parameter variables. This splits it into three separate subclasses. In addition to just being a cleaner API in general, this also addresses an issue we ran into with the upcoming DSLParser: previously, a global DSLVar's storage was not set correctly until DeclareGlobal was called, so an AddToSymbolTable call prior to DeclareGlobal would create the SkSL variable with the wrong storage, causing spurious errors on global-only modifiers. But holding off on the AddToSymbolTable tends to break constructs like "int x = 0, y = x", so improving the API seemed like the best way to address it. Now that we have greater type safety around variables, we can potentially avoid having to call AddToSymbolTable for DSLVar and DSLGlobalVar altogether, since we know they are both supposed to end up in the symbol table, but that isn't something I want to change in this CL. Change-Id: I5f390a7384ce0af6a2131d84f97fc5e5b318063f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/428576 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
62 lines
2.3 KiB
C++
62 lines
2.3 KiB
C++
/*
|
|
* Copyright 2021 Google LLC.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "gm/gm.h"
|
|
#include "include/effects/SkRuntimeEffect.h"
|
|
#include "src/gpu/GrSurfaceDrawContext.h"
|
|
#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
|
|
#include "src/sksl/dsl/priv/DSLFPs.h"
|
|
#include "src/sksl/dsl/priv/DSLWriter.h"
|
|
#include "src/sksl/ir/SkSLVariable.h"
|
|
|
|
class SimpleDSLEffect : public GrFragmentProcessor {
|
|
public:
|
|
static constexpr GrProcessor::ClassID CLASS_ID = (GrProcessor::ClassID) 100;
|
|
|
|
SimpleDSLEffect() : GrFragmentProcessor(CLASS_ID, kNone_OptimizationFlags) {
|
|
}
|
|
|
|
const char* name() const override { return "DSLEffect"; }
|
|
void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {}
|
|
bool onIsEqual(const GrFragmentProcessor& that) const override { return this == &that; }
|
|
std::unique_ptr<GrFragmentProcessor> clone() const override { return nullptr; }
|
|
|
|
std::unique_ptr<GrGLSLFragmentProcessor> onMakeProgramImpl() const override {
|
|
class Impl : public GrGLSLFragmentProcessor {
|
|
void emitCode(EmitArgs& args) override {
|
|
using namespace SkSL::dsl;
|
|
StartFragmentProcessor(this, &args);
|
|
|
|
// Test for skbug.com/11384
|
|
Var x(kInt_Type, 1);
|
|
Declare(x);
|
|
SkASSERT(DSLWriter::Var(x)->initialValue()->description() == "1");
|
|
|
|
GlobalVar blueAlpha(kUniform_Modifier, kHalf2_Type, "blueAlpha");
|
|
Declare(blueAlpha);
|
|
fBlueAlphaUniform = VarUniformHandle(blueAlpha);
|
|
Var coords(kFloat4_Type, sk_FragCoord());
|
|
Declare(coords);
|
|
Return(Half4(Swizzle(coords, X, Y) / 100, blueAlpha));
|
|
EndFragmentProcessor();
|
|
}
|
|
|
|
void onSetData(const GrGLSLProgramDataManager& pdman,
|
|
const GrFragmentProcessor& effect) override {
|
|
pdman.set2f(fBlueAlphaUniform, 0.0, 1.0);
|
|
}
|
|
|
|
GrGLSLProgramDataManager::UniformHandle fBlueAlphaUniform;
|
|
};
|
|
return std::make_unique<Impl>();
|
|
}
|
|
};
|
|
|
|
DEF_SIMPLE_GPU_GM(simple_dsl_test, rContext, sdc, canvas, 100, 100) {
|
|
sdc->fillWithFP(std::make_unique<SimpleDSLEffect>());
|
|
}
|