55a63afc5f
The DSL would not previously function within the compiler, because it expected to be in charge of everything itself. The compiler and DSL also disagreed about how to handle some things, such as the DSL not respecting the compiler's override flags. This CL moves responsibility for much of the setup process into DSL::Start(), which the compiler now invokes. DSL::Start() now also takes a ProgramSettings instead of DSL-specific flags, and the externalFunctions vector has been moved into ProgramSettings. Change-Id: I283ed8366e25d67f02c43833743c5f8afdedaefc Reviewed-on: https://skia-review.googlesource.com/c/skia/+/408136 Commit-Queue: Ethan Nicholas <ethannicholas@google.com> Reviewed-by: Brian Osman <brianosman@google.com> Reviewed-by: John Stiles <johnstiles@google.com>
164 lines
4.1 KiB
C++
164 lines
4.1 KiB
C++
/*
|
|
* Copyright 2020 Google LLC
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef SKSL_DSL_VAR
|
|
#define SKSL_DSL_VAR
|
|
|
|
#include "include/sksl/DSLExpression.h"
|
|
#include "include/sksl/DSLModifiers.h"
|
|
#include "include/sksl/DSLType.h"
|
|
|
|
namespace SkSL {
|
|
|
|
class IRGenerator;
|
|
class Variable;
|
|
enum class VariableStorage : int8_t;
|
|
|
|
namespace dsl {
|
|
|
|
class DSLVar {
|
|
public:
|
|
/**
|
|
* Creates an empty, unpopulated DSLVar. Can be replaced with a real DSLVar later via `swap`.
|
|
*/
|
|
DSLVar() : fType(kVoid_Type), fDeclared(true) {}
|
|
|
|
/**
|
|
* Constructs a new variable with the specified type and name. The name is used (in mangled
|
|
* form) in the resulting shader code; it is not otherwise important. Since mangling prevents
|
|
* name conflicts and the variable's name is only important when debugging shaders, the name
|
|
* parameter is optional.
|
|
*/
|
|
DSLVar(DSLType type, const char* name = "var", DSLExpression initialValue = DSLExpression());
|
|
|
|
DSLVar(DSLType type, DSLExpression initialValue);
|
|
|
|
DSLVar(DSLModifiers modifiers, DSLType type, const char* name = "var",
|
|
DSLExpression initialValue = DSLExpression());
|
|
|
|
DSLVar(DSLModifiers modifiers, DSLType type, DSLExpression initialValue);
|
|
|
|
DSLVar(DSLVar&&) = default;
|
|
|
|
~DSLVar();
|
|
|
|
const char* name() const {
|
|
return fName;
|
|
}
|
|
|
|
void swap(DSLVar& other);
|
|
|
|
DSLExpression x() {
|
|
return DSLExpression(*this).x();
|
|
}
|
|
|
|
DSLExpression y() {
|
|
return DSLExpression(*this).y();
|
|
}
|
|
|
|
DSLExpression z() {
|
|
return DSLExpression(*this).z();
|
|
}
|
|
|
|
DSLExpression w() {
|
|
return DSLExpression(*this).w();
|
|
}
|
|
|
|
DSLExpression r() {
|
|
return DSLExpression(*this).r();
|
|
}
|
|
|
|
DSLExpression g() {
|
|
return DSLExpression(*this).g();
|
|
}
|
|
|
|
DSLExpression b() {
|
|
return DSLExpression(*this).b();
|
|
}
|
|
|
|
DSLExpression a() {
|
|
return DSLExpression(*this).a();
|
|
}
|
|
|
|
DSLExpression field(const char* name) {
|
|
return DSLExpression(*this).field(name);
|
|
}
|
|
|
|
DSLPossibleExpression operator=(DSLVar& var) {
|
|
return this->operator=(DSLExpression(var));
|
|
}
|
|
|
|
DSLPossibleExpression operator=(DSLExpression expr);
|
|
|
|
DSLPossibleExpression operator=(int expr) {
|
|
return this->operator=(DSLExpression(expr));
|
|
}
|
|
|
|
DSLPossibleExpression operator=(float expr) {
|
|
return this->operator=(DSLExpression(expr));
|
|
}
|
|
|
|
DSLPossibleExpression operator=(double expr) {
|
|
return this->operator=(DSLExpression(expr));
|
|
}
|
|
|
|
DSLPossibleExpression operator[](DSLExpression&& index);
|
|
|
|
DSLPossibleExpression operator++() {
|
|
return ++DSLExpression(*this);
|
|
}
|
|
|
|
DSLPossibleExpression operator++(int) {
|
|
return DSLExpression(*this)++;
|
|
}
|
|
|
|
DSLPossibleExpression operator--() {
|
|
return --DSLExpression(*this);
|
|
}
|
|
|
|
DSLPossibleExpression operator--(int) {
|
|
return DSLExpression(*this)--;
|
|
}
|
|
|
|
private:
|
|
/**
|
|
* Constructs a reference to a variable that already exists in the symbol table. This is used
|
|
* internally to reference built-in vars.
|
|
*/
|
|
DSLVar(const char* name);
|
|
|
|
DSLModifiers fModifiers;
|
|
// We only need to keep track of the type here so that we can create the SkSL::Variable. For
|
|
// predefined variables this field is unnecessary, so we don't bother tracking it and just set
|
|
// it to kVoid; in other words, you shouldn't generally be relying on this field to be correct.
|
|
// If you need to determine the variable's type, look at DSLWriter::Var(...).type() instead.
|
|
DSLType fType;
|
|
int fUniformHandle = -1;
|
|
std::unique_ptr<SkSL::Statement> fDeclaration;
|
|
const SkSL::Variable* fVar = nullptr;
|
|
const char* fRawName = nullptr; // for error reporting
|
|
const char* fName = nullptr;
|
|
DSLExpression fInitialValue;
|
|
VariableStorage fStorage;
|
|
bool fDeclared = false;
|
|
|
|
friend DSLVar sk_SampleCoord();
|
|
|
|
friend class DSLCore;
|
|
friend class DSLExpression;
|
|
friend class DSLFunction;
|
|
friend class DSLWriter;
|
|
friend class ::SkSL::IRGenerator;
|
|
};
|
|
|
|
} // namespace dsl
|
|
|
|
} // namespace SkSL
|
|
|
|
|
|
#endif
|