SkSL: In the front-end, rename PipelineStage to RuntimeEffect
This maps to usage better, and makes some code simpler to understand. Note that there is still a PipelineStage *back-end*, which is specific to the runtime-effect FP. A kRuntimeEffect_Kind program can be used to generate a PipelineStage (for the GPU backend), or an skvm program (for the CPU backend). Change-Id: Id3f535db93a239726c595225aafe9467f0d19817 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/344969 Reviewed-by: John Stiles <johnstiles@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
This commit is contained in:
parent
3a8538187d
commit
9194675a3e
2
BUILD.gn
2
BUILD.gn
@ -609,8 +609,8 @@ if (skia_compile_processors || skia_compile_sksl_tests) {
|
|||||||
"src/sksl/sksl_geom.sksl",
|
"src/sksl/sksl_geom.sksl",
|
||||||
"src/sksl/sksl_gpu.sksl",
|
"src/sksl/sksl_gpu.sksl",
|
||||||
"src/sksl/sksl_interp.sksl",
|
"src/sksl/sksl_interp.sksl",
|
||||||
"src/sksl/sksl_pipeline.sksl",
|
|
||||||
"src/sksl/sksl_public.sksl",
|
"src/sksl/sksl_public.sksl",
|
||||||
|
"src/sksl/sksl_runtime.sksl",
|
||||||
"src/sksl/sksl_vert.sksl",
|
"src/sksl/sksl_vert.sksl",
|
||||||
]
|
]
|
||||||
outputs = [ "$root_out_dir/{{source_file_part}}" ]
|
outputs = [ "$root_out_dir/{{source_file_part}}" ]
|
||||||
|
@ -595,7 +595,7 @@ void RunSkSLMemoryBenchmarks(NanoJSONResultsWriter* log) {
|
|||||||
int before = heap_bytes_used();
|
int before = heap_bytes_used();
|
||||||
GrShaderCaps caps(GrContextOptions{});
|
GrShaderCaps caps(GrContextOptions{});
|
||||||
SkSL::Compiler compiler(&caps);
|
SkSL::Compiler compiler(&caps);
|
||||||
compiler.moduleForProgramKind(SkSL::Program::kPipelineStage_Kind);
|
compiler.moduleForProgramKind(SkSL::Program::kRuntimeEffect_Kind);
|
||||||
int after = heap_bytes_used();
|
int after = heap_bytes_used();
|
||||||
bench("sksl_compiler_runtimeeffect", after - before);
|
bench("sksl_compiler_runtimeeffect", after - before);
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ bool FuzzSKSL2Pipeline(sk_sp<SkData> bytes) {
|
|||||||
SkSL::Compiler compiler(caps.get());
|
SkSL::Compiler compiler(caps.get());
|
||||||
SkSL::Program::Settings settings;
|
SkSL::Program::Settings settings;
|
||||||
std::unique_ptr<SkSL::Program> program = compiler.convertProgram(
|
std::unique_ptr<SkSL::Program> program = compiler.convertProgram(
|
||||||
SkSL::Program::kPipelineStage_Kind,
|
SkSL::Program::kRuntimeEffect_Kind,
|
||||||
SkSL::String((const char*) bytes->data(),
|
SkSL::String((const char*) bytes->data(),
|
||||||
bytes->size()),
|
bytes->size()),
|
||||||
settings);
|
settings);
|
||||||
|
@ -156,7 +156,7 @@ SkRuntimeEffect::EffectResult SkRuntimeEffect::Make(SkString sksl) {
|
|||||||
SkSL::Program::Settings settings;
|
SkSL::Program::Settings settings;
|
||||||
settings.fInlineThreshold = compiler.getInlineThreshold();
|
settings.fInlineThreshold = compiler.getInlineThreshold();
|
||||||
settings.fAllowNarrowingConversions = true;
|
settings.fAllowNarrowingConversions = true;
|
||||||
auto program = compiler->convertProgram(SkSL::Program::kPipelineStage_Kind,
|
auto program = compiler->convertProgram(SkSL::Program::kRuntimeEffect_Kind,
|
||||||
SkSL::String(sksl.c_str(), sksl.size()),
|
SkSL::String(sksl.c_str(), sksl.size()),
|
||||||
settings);
|
settings);
|
||||||
// TODO: Many errors aren't caught until we process the generated Program here. Catching those
|
// TODO: Many errors aren't caught until we process the generated Program here. Catching those
|
||||||
|
@ -60,8 +60,8 @@
|
|||||||
#include "src/sksl/generated/sksl_geom.dehydrated.sksl"
|
#include "src/sksl/generated/sksl_geom.dehydrated.sksl"
|
||||||
#include "src/sksl/generated/sksl_gpu.dehydrated.sksl"
|
#include "src/sksl/generated/sksl_gpu.dehydrated.sksl"
|
||||||
#include "src/sksl/generated/sksl_interp.dehydrated.sksl"
|
#include "src/sksl/generated/sksl_interp.dehydrated.sksl"
|
||||||
#include "src/sksl/generated/sksl_pipeline.dehydrated.sksl"
|
|
||||||
#include "src/sksl/generated/sksl_public.dehydrated.sksl"
|
#include "src/sksl/generated/sksl_public.dehydrated.sksl"
|
||||||
|
#include "src/sksl/generated/sksl_runtime.dehydrated.sksl"
|
||||||
#include "src/sksl/generated/sksl_vert.dehydrated.sksl"
|
#include "src/sksl/generated/sksl_vert.dehydrated.sksl"
|
||||||
|
|
||||||
#define MODULE_DATA(name) MakeModuleData(SKSL_INCLUDE_sksl_##name,\
|
#define MODULE_DATA(name) MakeModuleData(SKSL_INCLUDE_sksl_##name,\
|
||||||
@ -227,39 +227,39 @@ const ParsedModule& Compiler::loadPublicModule() {
|
|||||||
return fPublicModule;
|
return fPublicModule;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ParsedModule& Compiler::loadPipelineModule() {
|
const ParsedModule& Compiler::loadRuntimeEffectModule() {
|
||||||
if (!fPipelineModule.fSymbols) {
|
if (!fRuntimeEffectModule.fSymbols) {
|
||||||
fPipelineModule = this->parseModule(Program::kPipelineStage_Kind, MODULE_DATA(pipeline),
|
fRuntimeEffectModule = this->parseModule(Program::kRuntimeEffect_Kind, MODULE_DATA(runtime),
|
||||||
this->loadPublicModule());
|
this->loadPublicModule());
|
||||||
|
|
||||||
// Add some aliases to the pipeline module so that it's friendlier, and more like GLSL
|
// Add some aliases to the runtime effect module so that it's friendlier, and more like GLSL
|
||||||
fPipelineModule.fSymbols->addAlias("shader", fContext->fFragmentProcessor_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("shader", fContext->fFragmentProcessor_Type.get());
|
||||||
|
|
||||||
fPipelineModule.fSymbols->addAlias("vec2", fContext->fFloat2_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("vec2", fContext->fFloat2_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("vec3", fContext->fFloat3_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("vec3", fContext->fFloat3_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("vec4", fContext->fFloat4_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("vec4", fContext->fFloat4_Type.get());
|
||||||
|
|
||||||
fPipelineModule.fSymbols->addAlias("bvec2", fContext->fBool2_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("bvec2", fContext->fBool2_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("bvec3", fContext->fBool3_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("bvec3", fContext->fBool3_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("bvec4", fContext->fBool4_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("bvec4", fContext->fBool4_Type.get());
|
||||||
|
|
||||||
fPipelineModule.fSymbols->addAlias("mat2", fContext->fFloat2x2_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat2", fContext->fFloat2x2_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("mat3", fContext->fFloat3x3_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat3", fContext->fFloat3x3_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("mat4", fContext->fFloat4x4_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat4", fContext->fFloat4x4_Type.get());
|
||||||
|
|
||||||
fPipelineModule.fSymbols->addAlias("mat2x2", fContext->fFloat2x2_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat2x2", fContext->fFloat2x2_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("mat2x3", fContext->fFloat2x3_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat2x3", fContext->fFloat2x3_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("mat2x4", fContext->fFloat2x4_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat2x4", fContext->fFloat2x4_Type.get());
|
||||||
|
|
||||||
fPipelineModule.fSymbols->addAlias("mat3x2", fContext->fFloat3x2_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat3x2", fContext->fFloat3x2_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("mat3x3", fContext->fFloat3x3_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat3x3", fContext->fFloat3x3_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("mat3x4", fContext->fFloat3x4_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat3x4", fContext->fFloat3x4_Type.get());
|
||||||
|
|
||||||
fPipelineModule.fSymbols->addAlias("mat4x2", fContext->fFloat4x2_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat4x2", fContext->fFloat4x2_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("mat4x3", fContext->fFloat4x3_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat4x3", fContext->fFloat4x3_Type.get());
|
||||||
fPipelineModule.fSymbols->addAlias("mat4x4", fContext->fFloat4x4_Type.get());
|
fRuntimeEffectModule.fSymbols->addAlias("mat4x4", fContext->fFloat4x4_Type.get());
|
||||||
}
|
}
|
||||||
return fPipelineModule;
|
return fRuntimeEffectModule;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ParsedModule& Compiler::loadInterpreterModule() {
|
const ParsedModule& Compiler::loadInterpreterModule() {
|
||||||
@ -272,12 +272,12 @@ const ParsedModule& Compiler::loadInterpreterModule() {
|
|||||||
|
|
||||||
const ParsedModule& Compiler::moduleForProgramKind(Program::Kind kind) {
|
const ParsedModule& Compiler::moduleForProgramKind(Program::Kind kind) {
|
||||||
switch (kind) {
|
switch (kind) {
|
||||||
case Program::kVertex_Kind: return this->loadVertexModule(); break;
|
case Program::kVertex_Kind: return this->loadVertexModule(); break;
|
||||||
case Program::kFragment_Kind: return this->loadFragmentModule(); break;
|
case Program::kFragment_Kind: return this->loadFragmentModule(); break;
|
||||||
case Program::kGeometry_Kind: return this->loadGeometryModule(); break;
|
case Program::kGeometry_Kind: return this->loadGeometryModule(); break;
|
||||||
case Program::kFragmentProcessor_Kind: return this->loadFPModule(); break;
|
case Program::kFragmentProcessor_Kind: return this->loadFPModule(); break;
|
||||||
case Program::kPipelineStage_Kind: return this->loadPipelineModule(); break;
|
case Program::kRuntimeEffect_Kind: return this->loadRuntimeEffectModule(); break;
|
||||||
case Program::kGeneric_Kind: return this->loadInterpreterModule(); break;
|
case Program::kGeneric_Kind: return this->loadInterpreterModule(); break;
|
||||||
}
|
}
|
||||||
SkUNREACHABLE;
|
SkUNREACHABLE;
|
||||||
}
|
}
|
||||||
|
@ -232,7 +232,7 @@ private:
|
|||||||
const ParsedModule& loadGeometryModule();
|
const ParsedModule& loadGeometryModule();
|
||||||
const ParsedModule& loadPublicModule();
|
const ParsedModule& loadPublicModule();
|
||||||
const ParsedModule& loadInterpreterModule();
|
const ParsedModule& loadInterpreterModule();
|
||||||
const ParsedModule& loadPipelineModule();
|
const ParsedModule& loadRuntimeEffectModule();
|
||||||
|
|
||||||
void addDefinition(const Expression* lvalue, std::unique_ptr<Expression>* expr,
|
void addDefinition(const Expression* lvalue, std::unique_ptr<Expression>* expr,
|
||||||
DefinitionMap* definitions);
|
DefinitionMap* definitions);
|
||||||
@ -279,18 +279,18 @@ private:
|
|||||||
std::shared_ptr<SymbolTable> fRootSymbolTable;
|
std::shared_ptr<SymbolTable> fRootSymbolTable;
|
||||||
std::shared_ptr<SymbolTable> fPrivateSymbolTable;
|
std::shared_ptr<SymbolTable> fPrivateSymbolTable;
|
||||||
|
|
||||||
ParsedModule fRootModule; // Core types
|
ParsedModule fRootModule; // Core types
|
||||||
|
|
||||||
ParsedModule fPrivateModule; // [Root] + Internal types
|
ParsedModule fPrivateModule; // [Root] + Internal types
|
||||||
ParsedModule fGPUModule; // [Private] + GPU intrinsics, helper functions
|
ParsedModule fGPUModule; // [Private] + GPU intrinsics, helper functions
|
||||||
ParsedModule fVertexModule; // [GPU] + Vertex stage decls
|
ParsedModule fVertexModule; // [GPU] + Vertex stage decls
|
||||||
ParsedModule fFragmentModule; // [GPU] + Fragment stage decls
|
ParsedModule fFragmentModule; // [GPU] + Fragment stage decls
|
||||||
ParsedModule fGeometryModule; // [GPU] + Geometry stage decls
|
ParsedModule fGeometryModule; // [GPU] + Geometry stage decls
|
||||||
ParsedModule fFPModule; // [GPU] + FP features
|
ParsedModule fFPModule; // [GPU] + FP features
|
||||||
|
|
||||||
ParsedModule fPublicModule; // [Root] + Public features
|
ParsedModule fPublicModule; // [Root] + Public features
|
||||||
ParsedModule fInterpreterModule; // [Public] + Interpreter-only decls
|
ParsedModule fInterpreterModule; // [Public] + Interpreter-only decls
|
||||||
ParsedModule fPipelineModule; // [Public] + Runtime effect decls
|
ParsedModule fRuntimeEffectModule; // [Public] + Runtime effect decls
|
||||||
|
|
||||||
// holds ModifiersPools belonging to the core includes for lifetime purposes
|
// holds ModifiersPools belonging to the core includes for lifetime purposes
|
||||||
std::vector<std::unique_ptr<ModifiersPool>> fModifiers;
|
std::vector<std::unique_ptr<ModifiersPool>> fModifiers;
|
||||||
|
@ -1069,10 +1069,6 @@ void GLSLCodeGenerator::writeFunction(const FunctionDefinition& f) {
|
|||||||
fSetupFragPositionLocal = false;
|
fSetupFragPositionLocal = false;
|
||||||
fSetupFragCoordWorkaround = false;
|
fSetupFragCoordWorkaround = false;
|
||||||
|
|
||||||
// The pipeline-stage code generator can't use functions written this way, so make sure we don't
|
|
||||||
// accidentally end up here.
|
|
||||||
SkASSERT(fProgramKind != Program::kPipelineStage_Kind);
|
|
||||||
|
|
||||||
this->writeFunctionDeclaration(f.declaration());
|
this->writeFunctionDeclaration(f.declaration());
|
||||||
this->writeLine(" {");
|
this->writeLine(" {");
|
||||||
fIndentation++;
|
fIndentation++;
|
||||||
|
@ -301,7 +301,7 @@ StatementArray IRGenerator::convertVarDeclarations(const ASTNode& decls,
|
|||||||
fErrors.error(decls.fOffset, "'key' is only permitted within fragment processors");
|
fErrors.error(decls.fOffset, "'key' is only permitted within fragment processors");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fKind == Program::kPipelineStage_Kind) {
|
if (fKind == Program::kRuntimeEffect_Kind) {
|
||||||
if ((modifiers.fFlags & Modifiers::kIn_Flag) &&
|
if ((modifiers.fFlags & Modifiers::kIn_Flag) &&
|
||||||
baseType->nonnullable() != *fContext.fFragmentProcessor_Type) {
|
baseType->nonnullable() != *fContext.fFragmentProcessor_Type) {
|
||||||
fErrors.error(decls.fOffset, "'in' variables not permitted in runtime effects");
|
fErrors.error(decls.fOffset, "'in' variables not permitted in runtime effects");
|
||||||
@ -311,7 +311,7 @@ StatementArray IRGenerator::convertVarDeclarations(const ASTNode& decls,
|
|||||||
fErrors.error(decls.fOffset, "'key' is not permitted on 'uniform' variables");
|
fErrors.error(decls.fOffset, "'key' is not permitted on 'uniform' variables");
|
||||||
}
|
}
|
||||||
if (modifiers.fLayout.fMarker.fLength) {
|
if (modifiers.fLayout.fMarker.fLength) {
|
||||||
if (fKind != Program::kPipelineStage_Kind) {
|
if (fKind != Program::kRuntimeEffect_Kind) {
|
||||||
fErrors.error(decls.fOffset, "'marker' is only permitted in runtime effects");
|
fErrors.error(decls.fOffset, "'marker' is only permitted in runtime effects");
|
||||||
}
|
}
|
||||||
if (!(modifiers.fFlags & Modifiers::kUniform_Flag)) {
|
if (!(modifiers.fFlags & Modifiers::kUniform_Flag)) {
|
||||||
@ -322,7 +322,7 @@ StatementArray IRGenerator::convertVarDeclarations(const ASTNode& decls,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (modifiers.fLayout.fFlags & Layout::kSRGBUnpremul_Flag) {
|
if (modifiers.fLayout.fFlags & Layout::kSRGBUnpremul_Flag) {
|
||||||
if (fKind != Program::kPipelineStage_Kind) {
|
if (fKind != Program::kRuntimeEffect_Kind) {
|
||||||
fErrors.error(decls.fOffset, "'srgb_unpremul' is only permitted in runtime effects");
|
fErrors.error(decls.fOffset, "'srgb_unpremul' is only permitted in runtime effects");
|
||||||
}
|
}
|
||||||
if (!(modifiers.fFlags & Modifiers::kUniform_Flag)) {
|
if (!(modifiers.fFlags & Modifiers::kUniform_Flag)) {
|
||||||
@ -341,7 +341,7 @@ StatementArray IRGenerator::convertVarDeclarations(const ASTNode& decls,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (modifiers.fFlags & Modifiers::kVarying_Flag) {
|
if (modifiers.fFlags & Modifiers::kVarying_Flag) {
|
||||||
if (fKind != Program::kPipelineStage_Kind) {
|
if (fKind != Program::kRuntimeEffect_Kind) {
|
||||||
fErrors.error(decls.fOffset, "'varying' is only permitted in runtime effects");
|
fErrors.error(decls.fOffset, "'varying' is only permitted in runtime effects");
|
||||||
}
|
}
|
||||||
if (!baseType->isFloat() &&
|
if (!baseType->isFloat() &&
|
||||||
@ -879,7 +879,7 @@ void IRGenerator::convertFunction(const ASTNode& f) {
|
|||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
GrSLType unusedSLType;
|
GrSLType unusedSLType;
|
||||||
return fKind != Program::kPipelineStage_Kind ||
|
return fKind != Program::kRuntimeEffect_Kind ||
|
||||||
type_to_grsltype(fContext, *t, &unusedSLType);
|
type_to_grsltype(fContext, *t, &unusedSLType);
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
@ -917,7 +917,7 @@ void IRGenerator::convertFunction(const ASTNode& f) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Modifiers m = pd.fModifiers;
|
Modifiers m = pd.fModifiers;
|
||||||
if (funcData.fName == "main" && (fKind == Program::kPipelineStage_Kind ||
|
if (funcData.fName == "main" && (fKind == Program::kRuntimeEffect_Kind ||
|
||||||
fKind == Program::kFragmentProcessor_Kind)) {
|
fKind == Program::kFragmentProcessor_Kind)) {
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
// We verify that the type is correct later, for now, if there is a parameter to
|
// We verify that the type is correct later, for now, if there is a parameter to
|
||||||
@ -940,7 +940,7 @@ void IRGenerator::convertFunction(const ASTNode& f) {
|
|||||||
|
|
||||||
if (funcData.fName == "main") {
|
if (funcData.fName == "main") {
|
||||||
switch (fKind) {
|
switch (fKind) {
|
||||||
case Program::kPipelineStage_Kind: {
|
case Program::kRuntimeEffect_Kind: {
|
||||||
// (half4|float4) main() -or- (half4|float4) main(float2)
|
// (half4|float4) main() -or- (half4|float4) main(float2)
|
||||||
if (*returnType != *fContext.fHalf4_Type && *returnType != *fContext.fFloat4_Type) {
|
if (*returnType != *fContext.fHalf4_Type && *returnType != *fContext.fFloat4_Type) {
|
||||||
fErrors.error(f.fOffset, "'main' must return: 'vec4', 'float4', or 'half4'");
|
fErrors.error(f.fOffset, "'main' must return: 'vec4', 'float4', or 'half4'");
|
||||||
@ -1225,7 +1225,7 @@ void IRGenerator::convertGlobalVarDeclarations(const ASTNode& decl) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IRGenerator::convertEnum(const ASTNode& e) {
|
void IRGenerator::convertEnum(const ASTNode& e) {
|
||||||
if (fKind == Program::kPipelineStage_Kind) {
|
if (fKind == Program::kRuntimeEffect_Kind) {
|
||||||
fErrors.error(e.fOffset, "enum is not allowed here");
|
fErrors.error(e.fOffset, "enum is not allowed here");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2129,7 +2129,7 @@ std::unique_ptr<Expression> IRGenerator::call(int offset,
|
|||||||
fErrors.error(offset, msg);
|
fErrors.error(offset, msg);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (fKind == Program::kPipelineStage_Kind && !function.definition() && !function.isBuiltin()) {
|
if (fKind == Program::kRuntimeEffect_Kind && !function.definition() && !function.isBuiltin()) {
|
||||||
String msg = "call to undefined function '" + function.name() + "'";
|
String msg = "call to undefined function '" + function.name() + "'";
|
||||||
fErrors.error(offset, msg);
|
fErrors.error(offset, msg);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -253,11 +253,10 @@ ResultCode processCommand(std::vector<SkSL::String>& args) {
|
|||||||
kind = SkSL::Program::kGeometry_Kind;
|
kind = SkSL::Program::kGeometry_Kind;
|
||||||
} else if (inputPath.endsWith(".fp")) {
|
} else if (inputPath.endsWith(".fp")) {
|
||||||
kind = SkSL::Program::kFragmentProcessor_Kind;
|
kind = SkSL::Program::kFragmentProcessor_Kind;
|
||||||
} else if (inputPath.endsWith(".stage")) {
|
} else if (inputPath.endsWith(".rte")) {
|
||||||
kind = SkSL::Program::kPipelineStage_Kind;
|
kind = SkSL::Program::kRuntimeEffect_Kind;
|
||||||
} else {
|
} else {
|
||||||
printf("input filename must end in '.vert', '.frag', '.geom', '.fp', '.stage', or "
|
printf("input filename must end in '.vert', '.frag', '.geom', '.fp', '.rte', or '.sksl'\n");
|
||||||
"'.sksl'\n");
|
|
||||||
return ResultCode::kInputError;
|
return ResultCode::kInputError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
static uint8_t SKSL_INCLUDE_sksl_pipeline[] = {87,0,
|
static uint8_t SKSL_INCLUDE_sksl_runtime[] = {87,0,
|
||||||
12,115,107,95,70,114,97,103,67,111,111,114,100,
|
12,115,107,95,70,114,97,103,67,111,111,114,100,
|
||||||
6,102,108,111,97,116,52,
|
6,102,108,111,97,116,52,
|
||||||
2,102,112,
|
2,102,112,
|
||||||
@ -53,4 +53,4 @@ static uint8_t SKSL_INCLUDE_sksl_pipeline[] = {87,0,
|
|||||||
42,2,0,0,
|
42,2,0,0,
|
||||||
52,
|
52,
|
||||||
13,};
|
13,};
|
||||||
static constexpr size_t SKSL_INCLUDE_sksl_pipeline_LENGTH = sizeof(SKSL_INCLUDE_sksl_pipeline);
|
static constexpr size_t SKSL_INCLUDE_sksl_runtime_LENGTH = sizeof(SKSL_INCLUDE_sksl_runtime);
|
@ -176,7 +176,7 @@ struct Program {
|
|||||||
kVertex_Kind,
|
kVertex_Kind,
|
||||||
kGeometry_Kind,
|
kGeometry_Kind,
|
||||||
kFragmentProcessor_Kind,
|
kFragmentProcessor_Kind,
|
||||||
kPipelineStage_Kind,
|
kRuntimeEffect_Kind,
|
||||||
kGeneric_Kind,
|
kGeneric_Kind,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user