1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/sksl/dsl/priv/DSLFPs.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "src/sksl/SkSLThreadContext.h" 11cb93a386Sopenharmony_ci#include "src/sksl/dsl/priv/DSLWriter.h" 12cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLCodeStringExpression.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ci#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cinamespace SkSL { 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_cinamespace dsl { 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_civoid StartFragmentProcessor(GrFragmentProcessor::ProgramImpl* processor, 21cb93a386Sopenharmony_ci GrFragmentProcessor::ProgramImpl::EmitArgs* emitArgs) { 22cb93a386Sopenharmony_ci ThreadContext::StartFragmentProcessor(processor, emitArgs); 23cb93a386Sopenharmony_ci} 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_civoid EndFragmentProcessor() { 26cb93a386Sopenharmony_ci ThreadContext::EndFragmentProcessor(); 27cb93a386Sopenharmony_ci} 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ciDSLGlobalVar sk_SampleCoord() { 30cb93a386Sopenharmony_ci return DSLGlobalVar("sk_SampleCoord"); 31cb93a386Sopenharmony_ci} 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ciDSLExpression SampleChild(int index, DSLExpression sampleExpr) { 34cb93a386Sopenharmony_ci std::unique_ptr<SkSL::Expression> expr = sampleExpr.releaseIfPossible(); 35cb93a386Sopenharmony_ci if (expr) { 36cb93a386Sopenharmony_ci SkASSERT(expr->type().isVector()); 37cb93a386Sopenharmony_ci SkASSERT(expr->type().componentType().isFloat()); 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci GrFragmentProcessor::ProgramImpl* proc = ThreadContext::CurrentProcessor(); 41cb93a386Sopenharmony_ci GrFragmentProcessor::ProgramImpl::EmitArgs& emitArgs = *ThreadContext::CurrentEmitArgs(); 42cb93a386Sopenharmony_ci SkString code; 43cb93a386Sopenharmony_ci switch (expr ? expr->type().columns() : 0) { 44cb93a386Sopenharmony_ci default: 45cb93a386Sopenharmony_ci SkASSERTF(0, "unsupported SampleChild type: %s", expr->type().description().c_str()); 46cb93a386Sopenharmony_ci [[fallthrough]]; 47cb93a386Sopenharmony_ci case 0: 48cb93a386Sopenharmony_ci code = proc->invokeChild(index, emitArgs); 49cb93a386Sopenharmony_ci break; 50cb93a386Sopenharmony_ci case 2: 51cb93a386Sopenharmony_ci code = proc->invokeChild(index, emitArgs, /*skslCoords=*/expr->description()); 52cb93a386Sopenharmony_ci break; 53cb93a386Sopenharmony_ci case 4: 54cb93a386Sopenharmony_ci code = proc->invokeChild(index, /*inputColor=*/expr->description().c_str(), emitArgs); 55cb93a386Sopenharmony_ci break; 56cb93a386Sopenharmony_ci } 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci return DSLExpression(std::make_unique<SkSL::CodeStringExpression>( 59cb93a386Sopenharmony_ci code.c_str(), ThreadContext::Context().fTypes.fHalf4.get())); 60cb93a386Sopenharmony_ci} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ciGrGLSLUniformHandler::UniformHandle VarUniformHandle(const DSLGlobalVar& var) { 63cb93a386Sopenharmony_ci return DSLWriter::VarUniformHandle(var); 64cb93a386Sopenharmony_ci} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci} // namespace dsl 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci} // namespace SkSL 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci#endif // !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU 71