| /* |
| * Copyright 2022 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/private/SkSLModifiers.h" |
| #include "src/sksl/SkSLAnalysis.h" |
| #include "src/sksl/SkSLContext.h" |
| #include "src/sksl/SkSLModifiersPool.h" |
| #include "src/sksl/analysis/SkSLProgramUsage.h" |
| #include "src/sksl/ir/SkSLVariable.h" |
| #include "src/sksl/transform/SkSLTransform.h" |
| |
| namespace SkSL { |
| |
| class Expression; |
| |
| const Modifiers* Transform::AddConstToVarModifiers(const Context& context, |
| const Variable& var, |
| const Expression* initialValue, |
| const ProgramUsage* usage) { |
| // If the variable is already marked as `const`, keep our existing modifiers. |
| const Modifiers* modifiers = &var.modifiers(); |
| if (modifiers->fFlags & Modifiers::kConst_Flag) { |
| return modifiers; |
| } |
| // If the variable doesn't have a compile-time-constant initial value, we can't `const` it. |
| if (!initialValue || !Analysis::IsCompileTimeConstant(*initialValue)) { |
| return modifiers; |
| } |
| // This only works for variables that are written-to a single time. |
| ProgramUsage::VariableCounts counts = usage->get(var); |
| if (counts.fWrite != 1) { |
| return modifiers; |
| } |
| // Add `const` to our variable's modifiers, making it eligible for constant-folding. |
| Modifiers constModifiers = *modifiers; |
| constModifiers.fFlags |= Modifiers::kConst_Flag; |
| return context.fModifiersPool->add(constModifiers); |
| } |
| |
| } // namespace SkSL |