xref: /third_party/skia/src/sksl/dsl/DSLStatement.cpp (revision cb93a386)
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