1 /*
2  * Copyright 2016 Google Inc.
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 #ifndef SKSL_PROGRAM
9 #define SKSL_PROGRAM
10 
11 #include <vector>
12 #include <memory>
13 
14 #include "SkSLContext.h"
15 #include "SkSLModifiers.h"
16 #include "SkSLProgramElement.h"
17 #include "SkSLSymbolTable.h"
18 
19 // name of the render target height uniform
20 #define SKSL_RTHEIGHT_NAME "u_skRTHeight"
21 
22 namespace SkSL {
23 
24 /**
25  * Represents a fully-digested program, ready for code generation.
26  */
27 struct Program {
28     struct Settings {
29         const GrShaderCaps* fCaps = nullptr;
30         // if false, sk_FragCoord is exactly the same as gl_FragCoord. If true, the y coordinate
31         // must be flipped.
32         bool fFlipY = false;
33     };
34 
35     struct Inputs {
36         // if true, this program requires the render target height uniform to be defined
37         bool fRTHeight;
38 
39         // if true, this program must be recompiled if the flipY setting changes. If false, the
40         // program will compile to the same code regardless of the flipY setting.
41         bool fFlipY;
42 
resetProgram::Inputs43         void reset() {
44             fRTHeight = false;
45             fFlipY = false;
46         }
47 
isEmptyProgram::Inputs48         bool isEmpty() {
49             return !fRTHeight && !fFlipY;
50         }
51     };
52 
53     enum Kind {
54         kFragment_Kind,
55         kVertex_Kind,
56         kGeometry_Kind
57     };
58 
ProgramProgram59     Program(Kind kind,
60             Settings settings,
61             Modifiers::Flag defaultPrecision,
62             Context* context,
63             std::vector<std::unique_ptr<ProgramElement>> elements,
64             std::shared_ptr<SymbolTable> symbols,
65             Inputs inputs)
66     : fKind(kind)
67     , fSettings(settings)
68     , fDefaultPrecision(defaultPrecision)
69     , fContext(context)
70     , fSymbols(symbols)
71     , fElements(std::move(elements))
72     , fInputs(inputs) {}
73 
74     Kind fKind;
75     Settings fSettings;
76     // FIXME handle different types; currently it assumes this is for floats
77     Modifiers::Flag fDefaultPrecision;
78     Context* fContext;
79     // it's important to keep fElements defined after (and thus destroyed before) fSymbols,
80     // because destroying elements can modify reference counts in symbols
81     std::shared_ptr<SymbolTable> fSymbols;
82     std::vector<std::unique_ptr<ProgramElement>> fElements;
83     Inputs fInputs;
84 };
85 
86 } // namespace
87 
88 #endif
89