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>
101 lines
2.9 KiB
C++
101 lines
2.9 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.
|
|
*/
|
|
|
|
#ifndef SKSL_DSL_FUNCTION
|
|
#define SKSL_DSL_FUNCTION
|
|
|
|
#include "include/sksl/DSLBlock.h"
|
|
#include "include/sksl/DSLExpression.h"
|
|
#include "include/sksl/DSLType.h"
|
|
#include "include/sksl/DSLVar.h"
|
|
#include "include/sksl/DSLWrapper.h"
|
|
|
|
namespace SkSL {
|
|
|
|
class Block;
|
|
class FunctionDeclaration;
|
|
class Variable;
|
|
|
|
namespace dsl {
|
|
|
|
class DSLType;
|
|
|
|
class DSLFunction {
|
|
public:
|
|
template<class... Parameters>
|
|
DSLFunction(const DSLType& returnType, const char* name, Parameters&... parameters) {
|
|
SkTArray<DSLVar*> parameterArray;
|
|
parameterArray.reserve_back(sizeof...(parameters));
|
|
|
|
// in C++17, we could just do:
|
|
// (parameterArray.push_back(¶meters), ...);
|
|
int unused[] = {0, (static_cast<void>(parameterArray.push_back(¶meters)), 0)...};
|
|
static_cast<void>(unused);
|
|
this->init(returnType, name, std::move(parameterArray));
|
|
}
|
|
|
|
DSLFunction(const DSLType& returnType, const char* name, SkTArray<DSLVar*> parameters) {
|
|
this->init(returnType, name, std::move(parameters));
|
|
}
|
|
|
|
DSLFunction(const SkSL::FunctionDeclaration* decl)
|
|
: fDecl(decl) {}
|
|
|
|
virtual ~DSLFunction() = default;
|
|
|
|
template<class... Stmt>
|
|
void define(Stmt... stmts) {
|
|
DSLBlock block = DSLBlock(DSLStatement(std::move(stmts))...);
|
|
this->define(std::move(block));
|
|
}
|
|
|
|
void define(DSLBlock block);
|
|
|
|
/**
|
|
* Invokes the function with the given arguments.
|
|
*/
|
|
template<class... Args>
|
|
DSLExpression operator()(Args&&... args) {
|
|
SkTArray<DSLWrapper<DSLExpression>> argArray;
|
|
argArray.reserve_back(sizeof...(args));
|
|
this->collectArgs(argArray, std::forward<Args>(args)...);
|
|
return this->call(std::move(argArray));
|
|
}
|
|
|
|
/**
|
|
* Invokes the function with the given arguments.
|
|
*/
|
|
DSLExpression call(SkTArray<DSLWrapper<DSLExpression>> args);
|
|
|
|
private:
|
|
void collectArgs(SkTArray<DSLWrapper<DSLExpression>>& args) {}
|
|
|
|
template<class... RemainingArgs>
|
|
void collectArgs(SkTArray<DSLWrapper<DSLExpression>>& args, DSLVar& var,
|
|
RemainingArgs&&... remaining) {
|
|
args.push_back(DSLWrapper<DSLExpression>(var));
|
|
collectArgs(args, std::forward<RemainingArgs>(remaining)...);
|
|
}
|
|
|
|
template<class... RemainingArgs>
|
|
void collectArgs(SkTArray<DSLWrapper<DSLExpression>>& args, DSLExpression expr,
|
|
RemainingArgs&&... remaining) {
|
|
args.push_back(DSLWrapper<DSLExpression>(std::move(expr)));
|
|
collectArgs(args, std::forward<RemainingArgs>(remaining)...);
|
|
}
|
|
|
|
void init(const DSLType& returnType, const char* name, SkTArray<DSLVar*> params);
|
|
|
|
const SkSL::FunctionDeclaration* fDecl = nullptr;
|
|
};
|
|
|
|
} // namespace dsl
|
|
|
|
} // namespace SkSL
|
|
|
|
#endif
|