• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 Google LLC
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "include/private/SkSLModifiers.h"
9 #include "src/sksl/SkSLAnalysis.h"
10 #include "src/sksl/SkSLContext.h"
11 #include "src/sksl/SkSLModifiersPool.h"
12 #include "src/sksl/analysis/SkSLProgramUsage.h"
13 #include "src/sksl/ir/SkSLVariable.h"
14 #include "src/sksl/transform/SkSLTransform.h"
15 
16 namespace SkSL {
17 
18 class Expression;
19 
AddConstToVarModifiers(const Context & context,const Variable & var,const Expression * initialValue,const ProgramUsage * usage)20 const Modifiers* Transform::AddConstToVarModifiers(const Context& context,
21                                                    const Variable& var,
22                                                    const Expression* initialValue,
23                                                    const ProgramUsage* usage) {
24     // If the variable is already marked as `const`, keep our existing modifiers.
25     const Modifiers* modifiers = &var.modifiers();
26     if (modifiers->fFlags & Modifiers::kConst_Flag) {
27         return modifiers;
28     }
29     // If the variable doesn't have a compile-time-constant initial value, we can't `const` it.
30     if (!initialValue || !Analysis::IsCompileTimeConstant(*initialValue)) {
31         return modifiers;
32     }
33     // This only works for variables that are written-to a single time.
34     ProgramUsage::VariableCounts counts = usage->get(var);
35     if (counts.fWrite != 1) {
36         return modifiers;
37     }
38     // Add `const` to our variable's modifiers, making it eligible for constant-folding.
39     Modifiers constModifiers = *modifiers;
40     constModifiers.fFlags |= Modifiers::kConst_Flag;
41     return context.fModifiersPool->add(constModifiers);
42 }
43 
44 }  // namespace SkSL
45