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 "include/sksl/DSLStatement.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/sksl/DSLBlock.h" 11cb93a386Sopenharmony_ci#include "include/sksl/DSLExpression.h" 12cb93a386Sopenharmony_ci#include "src/sksl/SkSLCompiler.h" 13cb93a386Sopenharmony_ci#include "src/sksl/SkSLThreadContext.h" 14cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLBlock.h" 15cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLExpressionStatement.h" 16cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLNop.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU 19cb93a386Sopenharmony_ci#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h" 20cb93a386Sopenharmony_ci#endif 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cinamespace SkSL { 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cinamespace dsl { 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciDSLStatement::DSLStatement() {} 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ciDSLStatement::DSLStatement(DSLBlock block) 29cb93a386Sopenharmony_ci : fStatement(block.release()) {} 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciDSLStatement::DSLStatement(DSLExpression expr) { 32cb93a386Sopenharmony_ci std::unique_ptr<SkSL::Expression> skslExpr = expr.release(); 33cb93a386Sopenharmony_ci if (skslExpr) { 34cb93a386Sopenharmony_ci fStatement = SkSL::ExpressionStatement::Make(ThreadContext::Context(), std::move(skslExpr)); 35cb93a386Sopenharmony_ci } 36cb93a386Sopenharmony_ci} 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ciDSLStatement::DSLStatement(std::unique_ptr<SkSL::Expression> expr) 39cb93a386Sopenharmony_ci : fStatement(SkSL::ExpressionStatement::Make(ThreadContext::Context(), std::move(expr))) { 40cb93a386Sopenharmony_ci SkASSERT(this->hasValue()); 41cb93a386Sopenharmony_ci} 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ciDSLStatement::DSLStatement(std::unique_ptr<SkSL::Statement> stmt) 44cb93a386Sopenharmony_ci : fStatement(std::move(stmt)) { 45cb93a386Sopenharmony_ci SkASSERT(this->hasValue()); 46cb93a386Sopenharmony_ci} 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ciDSLStatement::DSLStatement(DSLPossibleExpression expr, PositionInfo pos) 49cb93a386Sopenharmony_ci : DSLStatement(DSLExpression(std::move(expr), pos)) {} 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ciDSLStatement::DSLStatement(DSLPossibleStatement stmt, PositionInfo pos) { 52cb93a386Sopenharmony_ci ThreadContext::ReportErrors(pos); 53cb93a386Sopenharmony_ci if (stmt.hasValue()) { 54cb93a386Sopenharmony_ci fStatement = std::move(stmt.fStatement); 55cb93a386Sopenharmony_ci } else { 56cb93a386Sopenharmony_ci fStatement = SkSL::Nop::Make(); 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ci if (pos.line() != -1) { 59cb93a386Sopenharmony_ci fStatement->fLine = pos.line(); 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci} 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ciDSLStatement::~DSLStatement() { 64cb93a386Sopenharmony_ci#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU 65cb93a386Sopenharmony_ci if (fStatement && ThreadContext::InFragmentProcessor()) { 66cb93a386Sopenharmony_ci ThreadContext::CurrentEmitArgs()->fFragBuilder->codeAppend(this->release()); 67cb93a386Sopenharmony_ci return; 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci#endif 70cb93a386Sopenharmony_ci SkASSERTF(!fStatement || !ThreadContext::Settings().fAssertDSLObjectsReleased, 71cb93a386Sopenharmony_ci "Statement destroyed without being incorporated into program (see " 72cb93a386Sopenharmony_ci "ProgramSettings::fAssertDSLObjectsReleased)"); 73cb93a386Sopenharmony_ci} 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ciDSLPossibleStatement::DSLPossibleStatement(std::unique_ptr<SkSL::Statement> statement) 76cb93a386Sopenharmony_ci : fStatement(std::move(statement)) {} 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ciDSLPossibleStatement::~DSLPossibleStatement() { 79cb93a386Sopenharmony_ci if (fStatement) { 80cb93a386Sopenharmony_ci // this handles incorporating the expression into the output tree 81cb93a386Sopenharmony_ci DSLStatement(std::move(fStatement)); 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci} 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ciDSLStatement operator,(DSLStatement left, DSLStatement right) { 86cb93a386Sopenharmony_ci int line = left.fStatement->fLine; 87cb93a386Sopenharmony_ci StatementArray stmts; 88cb93a386Sopenharmony_ci stmts.reserve_back(2); 89cb93a386Sopenharmony_ci stmts.push_back(left.release()); 90cb93a386Sopenharmony_ci stmts.push_back(right.release()); 91cb93a386Sopenharmony_ci return DSLStatement(SkSL::Block::MakeUnscoped(line, std::move(stmts))); 92cb93a386Sopenharmony_ci} 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci} // namespace dsl 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ci} // namespace SkSL 97