xref: /aosp_15_r20/external/skia/tools/viewer/Viewer.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef Viewer_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define Viewer_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextOptions.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skcms/skcms.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLProgram.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/MemoryCache.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "tools/sk_app/Application.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "tools/sk_app/CommandSet.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "tools/sk_app/Window.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/AnimTimer.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/ImGuiLayer.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/StatsLayer.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/TouchGesture.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "tools/window/DisplayParams.h"
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
30*c8dee2aaSAndroid Build Coastguard Worker #include <atomic>
31*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
32*c8dee2aaSAndroid Build Coastguard Worker #include <string>
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker class SkImage;
35*c8dee2aaSAndroid Build Coastguard Worker class SkSurface;
36*c8dee2aaSAndroid Build Coastguard Worker class Slide;
37*c8dee2aaSAndroid Build Coastguard Worker namespace skui {
38*c8dee2aaSAndroid Build Coastguard Worker enum class InputState;
39*c8dee2aaSAndroid Build Coastguard Worker enum class Key;
40*c8dee2aaSAndroid Build Coastguard Worker enum class ModifierKey;
41*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skui
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker class Viewer : public sk_app::Application, sk_app::Window::Layer {
44*c8dee2aaSAndroid Build Coastguard Worker public:
45*c8dee2aaSAndroid Build Coastguard Worker     Viewer(int argc, char** argv, void* platformData);
46*c8dee2aaSAndroid Build Coastguard Worker     ~Viewer() override;
47*c8dee2aaSAndroid Build Coastguard Worker 
48*c8dee2aaSAndroid Build Coastguard Worker     void onIdle() override;
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker     void onBackendCreated() override;
51*c8dee2aaSAndroid Build Coastguard Worker     void onPaint(SkSurface*) override;
52*c8dee2aaSAndroid Build Coastguard Worker     void onResize(int width, int height) override;
53*c8dee2aaSAndroid Build Coastguard Worker     bool onTouch(intptr_t owner, skui::InputState state, float x, float y) override;
54*c8dee2aaSAndroid Build Coastguard Worker     bool onMouse(int x, int y, skui::InputState state, skui::ModifierKey modifiers) override;
55*c8dee2aaSAndroid Build Coastguard Worker     bool onMouseWheel(float delta, int x, int y, skui::ModifierKey) override;
56*c8dee2aaSAndroid Build Coastguard Worker     void onUIStateChanged(const SkString& stateName, const SkString& stateValue) override;
57*c8dee2aaSAndroid Build Coastguard Worker     bool onKey(skui::Key key, skui::InputState state, skui::ModifierKey modifiers) override;
58*c8dee2aaSAndroid Build Coastguard Worker     bool onChar(SkUnichar c, skui::ModifierKey modifiers) override;
59*c8dee2aaSAndroid Build Coastguard Worker     bool onPinch(skui::InputState state, float scale, float x, float y) override;
60*c8dee2aaSAndroid Build Coastguard Worker     bool onFling(skui::InputState state) override;
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     static GrContextOptions::ShaderErrorHandler* ShaderErrorHandler();
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker     struct SkFontFields {
overridesSomethingSkFontFields65*c8dee2aaSAndroid Build Coastguard Worker         bool overridesSomething() const {
66*c8dee2aaSAndroid Build Coastguard Worker             return fTypeface ||
67*c8dee2aaSAndroid Build Coastguard Worker                    fSize ||
68*c8dee2aaSAndroid Build Coastguard Worker                    fScaleX ||
69*c8dee2aaSAndroid Build Coastguard Worker                    fSkewX ||
70*c8dee2aaSAndroid Build Coastguard Worker                    fHinting ||
71*c8dee2aaSAndroid Build Coastguard Worker                    fEdging ||
72*c8dee2aaSAndroid Build Coastguard Worker                    fSubpixel ||
73*c8dee2aaSAndroid Build Coastguard Worker                    fForceAutoHinting ||
74*c8dee2aaSAndroid Build Coastguard Worker                    fEmbeddedBitmaps ||
75*c8dee2aaSAndroid Build Coastguard Worker                    fLinearMetrics ||
76*c8dee2aaSAndroid Build Coastguard Worker                    fEmbolden ||
77*c8dee2aaSAndroid Build Coastguard Worker                    fBaselineSnap;
78*c8dee2aaSAndroid Build Coastguard Worker         }
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker         bool fTypeface = false;
81*c8dee2aaSAndroid Build Coastguard Worker         bool fSize = false;
82*c8dee2aaSAndroid Build Coastguard Worker         SkScalar fSizeRange[2] = { 0, 20 };
83*c8dee2aaSAndroid Build Coastguard Worker         bool fScaleX = false;
84*c8dee2aaSAndroid Build Coastguard Worker         bool fSkewX = false;
85*c8dee2aaSAndroid Build Coastguard Worker         bool fHinting = false;
86*c8dee2aaSAndroid Build Coastguard Worker         bool fEdging = false;
87*c8dee2aaSAndroid Build Coastguard Worker         bool fSubpixel = false;
88*c8dee2aaSAndroid Build Coastguard Worker         bool fForceAutoHinting = false;
89*c8dee2aaSAndroid Build Coastguard Worker         bool fEmbeddedBitmaps = false;
90*c8dee2aaSAndroid Build Coastguard Worker         bool fLinearMetrics = false;
91*c8dee2aaSAndroid Build Coastguard Worker         bool fEmbolden = false;
92*c8dee2aaSAndroid Build Coastguard Worker         bool fBaselineSnap = false;
93*c8dee2aaSAndroid Build Coastguard Worker     };
94*c8dee2aaSAndroid Build Coastguard Worker     struct SkPaintFields {
overridesSomethingSkPaintFields95*c8dee2aaSAndroid Build Coastguard Worker         bool overridesSomething() const {
96*c8dee2aaSAndroid Build Coastguard Worker             return fPathEffect ||
97*c8dee2aaSAndroid Build Coastguard Worker                    fShader ||
98*c8dee2aaSAndroid Build Coastguard Worker                    fMaskFilter ||
99*c8dee2aaSAndroid Build Coastguard Worker                    fColorFilter ||
100*c8dee2aaSAndroid Build Coastguard Worker                    fImageFilter ||
101*c8dee2aaSAndroid Build Coastguard Worker                    fColor ||
102*c8dee2aaSAndroid Build Coastguard Worker                    fStrokeWidth ||
103*c8dee2aaSAndroid Build Coastguard Worker                    fMiterLimit ||
104*c8dee2aaSAndroid Build Coastguard Worker                    fBlendMode ||
105*c8dee2aaSAndroid Build Coastguard Worker                    fAntiAlias ||
106*c8dee2aaSAndroid Build Coastguard Worker                    fDither ||
107*c8dee2aaSAndroid Build Coastguard Worker                    fForceRuntimeBlend ||
108*c8dee2aaSAndroid Build Coastguard Worker                    fCapType ||
109*c8dee2aaSAndroid Build Coastguard Worker                    fJoinType ||
110*c8dee2aaSAndroid Build Coastguard Worker                    fStyle;
111*c8dee2aaSAndroid Build Coastguard Worker         }
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker         bool fPathEffect = false;
114*c8dee2aaSAndroid Build Coastguard Worker         bool fShader = false;
115*c8dee2aaSAndroid Build Coastguard Worker         bool fMaskFilter = false;
116*c8dee2aaSAndroid Build Coastguard Worker         bool fColorFilter = false;
117*c8dee2aaSAndroid Build Coastguard Worker         bool fImageFilter = false;
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker         bool fColor = false;
120*c8dee2aaSAndroid Build Coastguard Worker         bool fStrokeWidth = false;
121*c8dee2aaSAndroid Build Coastguard Worker         bool fMiterLimit = false;
122*c8dee2aaSAndroid Build Coastguard Worker         bool fBlendMode = false;
123*c8dee2aaSAndroid Build Coastguard Worker 
124*c8dee2aaSAndroid Build Coastguard Worker         bool fAntiAlias = false;
125*c8dee2aaSAndroid Build Coastguard Worker         bool fDither = false;
126*c8dee2aaSAndroid Build Coastguard Worker         bool fForceRuntimeBlend = false;
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker         bool fCapType = false;
129*c8dee2aaSAndroid Build Coastguard Worker         bool fJoinType = false;
130*c8dee2aaSAndroid Build Coastguard Worker         bool fStyle = false;
131*c8dee2aaSAndroid Build Coastguard Worker     };
132*c8dee2aaSAndroid Build Coastguard Worker     struct SkSurfacePropsFields {
133*c8dee2aaSAndroid Build Coastguard Worker         bool fFlags = false;
134*c8dee2aaSAndroid Build Coastguard Worker         bool fPixelGeometry = false;
135*c8dee2aaSAndroid Build Coastguard Worker     };
136*c8dee2aaSAndroid Build Coastguard Worker     struct DisplayFields {
137*c8dee2aaSAndroid Build Coastguard Worker         bool fColorType = false;
138*c8dee2aaSAndroid Build Coastguard Worker         bool fColorSpace = false;
139*c8dee2aaSAndroid Build Coastguard Worker         bool fMSAASampleCount = false;
140*c8dee2aaSAndroid Build Coastguard Worker         bool fGrContextOptions = false;
141*c8dee2aaSAndroid Build Coastguard Worker         SkSurfacePropsFields fSurfaceProps;
142*c8dee2aaSAndroid Build Coastguard Worker         bool fDisableVsync = false;
143*c8dee2aaSAndroid Build Coastguard Worker     };
144*c8dee2aaSAndroid Build Coastguard Worker private:
145*c8dee2aaSAndroid Build Coastguard Worker     enum class ColorMode {
146*c8dee2aaSAndroid Build Coastguard Worker         kLegacy,                // 8888, no color management
147*c8dee2aaSAndroid Build Coastguard Worker         kColorManaged8888,      // 8888 with color management
148*c8dee2aaSAndroid Build Coastguard Worker         kColorManagedF16,       // F16 with color management
149*c8dee2aaSAndroid Build Coastguard Worker         kColorManagedF16Norm,   // Normalized F16 with color management
150*c8dee2aaSAndroid Build Coastguard Worker     };
151*c8dee2aaSAndroid Build Coastguard Worker 
152*c8dee2aaSAndroid Build Coastguard Worker     void initSlides();
153*c8dee2aaSAndroid Build Coastguard Worker     void updateTitle();
154*c8dee2aaSAndroid Build Coastguard Worker     void setBackend(sk_app::Window::BackendType);
155*c8dee2aaSAndroid Build Coastguard Worker     void initGpuTimer();
156*c8dee2aaSAndroid Build Coastguard Worker     void setColorMode(ColorMode);
157*c8dee2aaSAndroid Build Coastguard Worker     int startupSlide() const;
158*c8dee2aaSAndroid Build Coastguard Worker     void setCurrentSlide(int);
159*c8dee2aaSAndroid Build Coastguard Worker     void setupCurrentSlide();
160*c8dee2aaSAndroid Build Coastguard Worker     SkISize currentSlideSize() const;
161*c8dee2aaSAndroid Build Coastguard Worker     void listNames() const;
162*c8dee2aaSAndroid Build Coastguard Worker     void dumpShadersToResources();
163*c8dee2aaSAndroid Build Coastguard Worker 
164*c8dee2aaSAndroid Build Coastguard Worker     void updateUIState();
165*c8dee2aaSAndroid Build Coastguard Worker 
166*c8dee2aaSAndroid Build Coastguard Worker     void drawSlide(SkSurface* surface);
167*c8dee2aaSAndroid Build Coastguard Worker     void drawImGui();
168*c8dee2aaSAndroid Build Coastguard Worker 
169*c8dee2aaSAndroid Build Coastguard Worker     void changeZoomLevel(float delta);
170*c8dee2aaSAndroid Build Coastguard Worker     void updateGestureTransLimit();
171*c8dee2aaSAndroid Build Coastguard Worker     SkMatrix computePreTouchMatrix();
172*c8dee2aaSAndroid Build Coastguard Worker     SkMatrix computePerspectiveMatrix();
173*c8dee2aaSAndroid Build Coastguard Worker     SkMatrix computeMatrix();
174*c8dee2aaSAndroid Build Coastguard Worker     SkPoint mapEvent(float x, float y);
175*c8dee2aaSAndroid Build Coastguard Worker 
176*c8dee2aaSAndroid Build Coastguard Worker     sk_app::Window*        fWindow;
177*c8dee2aaSAndroid Build Coastguard Worker 
178*c8dee2aaSAndroid Build Coastguard Worker     StatsLayer             fStatsLayer;
179*c8dee2aaSAndroid Build Coastguard Worker     StatsLayer::Timer      fPaintTimer;
180*c8dee2aaSAndroid Build Coastguard Worker     StatsLayer::Timer      fFlushTimer;
181*c8dee2aaSAndroid Build Coastguard Worker     StatsLayer::Timer      fAnimateTimer;
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker     AnimTimer              fAnimTimer;
184*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<sk_sp<Slide>> fSlides;
185*c8dee2aaSAndroid Build Coastguard Worker     int                    fCurrentSlide;
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker     bool                   fRefresh; // whether to continuously refresh for measuring render time
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker     bool                   fSaveToSKP;
190*c8dee2aaSAndroid Build Coastguard Worker     bool                   fShowSlideDimensions;
191*c8dee2aaSAndroid Build Coastguard Worker 
192*c8dee2aaSAndroid Build Coastguard Worker     ImGuiLayer             fImGuiLayer;
193*c8dee2aaSAndroid Build Coastguard Worker     SkPaint                fImGuiGamutPaint;
194*c8dee2aaSAndroid Build Coastguard Worker     bool                   fShowImGuiDebugWindow;
195*c8dee2aaSAndroid Build Coastguard Worker     bool                   fShowSlidePicker;
196*c8dee2aaSAndroid Build Coastguard Worker     bool                   fShowImGuiTestWindow;
197*c8dee2aaSAndroid Build Coastguard Worker     bool                   fShowHistogramWindow;
198*c8dee2aaSAndroid Build Coastguard Worker 
199*c8dee2aaSAndroid Build Coastguard Worker     bool                   fShowZoomWindow;
200*c8dee2aaSAndroid Build Coastguard Worker     bool                   fZoomWindowFixed;
201*c8dee2aaSAndroid Build Coastguard Worker     SkPoint                fZoomWindowLocation;
202*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage>         fLastImage;
203*c8dee2aaSAndroid Build Coastguard Worker     bool                   fZoomUI;
204*c8dee2aaSAndroid Build Coastguard Worker 
205*c8dee2aaSAndroid Build Coastguard Worker     sk_app::Window::BackendType fBackendType;
206*c8dee2aaSAndroid Build Coastguard Worker 
207*c8dee2aaSAndroid Build Coastguard Worker     // Color properties for slide rendering
208*c8dee2aaSAndroid Build Coastguard Worker     ColorMode              fColorMode;
209*c8dee2aaSAndroid Build Coastguard Worker     SkColorSpacePrimaries  fColorSpacePrimaries;
210*c8dee2aaSAndroid Build Coastguard Worker     skcms_TransferFunction fColorSpaceTransferFn;
211*c8dee2aaSAndroid Build Coastguard Worker 
212*c8dee2aaSAndroid Build Coastguard Worker     // transform data
213*c8dee2aaSAndroid Build Coastguard Worker     bool                   fApplyBackingScale;
214*c8dee2aaSAndroid Build Coastguard Worker     SkScalar               fZoomLevel;
215*c8dee2aaSAndroid Build Coastguard Worker     SkScalar               fRotation;
216*c8dee2aaSAndroid Build Coastguard Worker     SkVector               fOffset;
217*c8dee2aaSAndroid Build Coastguard Worker 
218*c8dee2aaSAndroid Build Coastguard Worker     sk_app::CommandSet     fCommands;
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     enum class GestureDevice {
221*c8dee2aaSAndroid Build Coastguard Worker         kNone,
222*c8dee2aaSAndroid Build Coastguard Worker         kTouch,
223*c8dee2aaSAndroid Build Coastguard Worker         kMouse,
224*c8dee2aaSAndroid Build Coastguard Worker     };
225*c8dee2aaSAndroid Build Coastguard Worker 
226*c8dee2aaSAndroid Build Coastguard Worker     TouchGesture           fGesture;
227*c8dee2aaSAndroid Build Coastguard Worker     GestureDevice          fGestureDevice;
228*c8dee2aaSAndroid Build Coastguard Worker 
229*c8dee2aaSAndroid Build Coastguard Worker     // identity unless the window initially scales the content to fit the screen.
230*c8dee2aaSAndroid Build Coastguard Worker     SkMatrix               fDefaultMatrix;
231*c8dee2aaSAndroid Build Coastguard Worker 
232*c8dee2aaSAndroid Build Coastguard Worker     bool                   fTiled;
233*c8dee2aaSAndroid Build Coastguard Worker     bool                   fDrawTileBoundaries;
234*c8dee2aaSAndroid Build Coastguard Worker     SkSize                 fTileScale;
235*c8dee2aaSAndroid Build Coastguard Worker     bool                   fDrawViaSerialize = false;
236*c8dee2aaSAndroid Build Coastguard Worker 
237*c8dee2aaSAndroid Build Coastguard Worker     enum PerspectiveMode {
238*c8dee2aaSAndroid Build Coastguard Worker         kPerspective_Off,
239*c8dee2aaSAndroid Build Coastguard Worker         kPerspective_Real,
240*c8dee2aaSAndroid Build Coastguard Worker         kPerspective_Fake,
241*c8dee2aaSAndroid Build Coastguard Worker     };
242*c8dee2aaSAndroid Build Coastguard Worker     PerspectiveMode        fPerspectiveMode;
243*c8dee2aaSAndroid Build Coastguard Worker     SkPoint                fPerspectivePoints[4];
244*c8dee2aaSAndroid Build Coastguard Worker 
245*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<std::function<void()>> fDeferredActions;
246*c8dee2aaSAndroid Build Coastguard Worker 
247*c8dee2aaSAndroid Build Coastguard Worker     // fPaint contains override values, fPaintOverrides controls if overrides are applied.
248*c8dee2aaSAndroid Build Coastguard Worker     SkPaint fPaint;
249*c8dee2aaSAndroid Build Coastguard Worker     SkPaintFields fPaintOverrides;
250*c8dee2aaSAndroid Build Coastguard Worker 
251*c8dee2aaSAndroid Build Coastguard Worker     // fFont contains override values, fFontOverrides controls if overrides are applied.
252*c8dee2aaSAndroid Build Coastguard Worker     SkFont fFont;
253*c8dee2aaSAndroid Build Coastguard Worker     SkFontFields fFontOverrides;
254*c8dee2aaSAndroid Build Coastguard Worker 
255*c8dee2aaSAndroid Build Coastguard Worker     // fDisplay contains default values (fWindow.fRequestedDisplayParams contains the overrides),
256*c8dee2aaSAndroid Build Coastguard Worker     // fDisplayOverrides controls if overrides are applied.
257*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<skwindow::DisplayParams> fDisplay;
258*c8dee2aaSAndroid Build Coastguard Worker     DisplayFields fDisplayOverrides;
259*c8dee2aaSAndroid Build Coastguard Worker 
260*c8dee2aaSAndroid Build Coastguard Worker     struct CachedShader {
261*c8dee2aaSAndroid Build Coastguard Worker         bool                fHovered = false;
262*c8dee2aaSAndroid Build Coastguard Worker 
263*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<const SkData> fKey;
264*c8dee2aaSAndroid Build Coastguard Worker         SkString            fKeyString;
265*c8dee2aaSAndroid Build Coastguard Worker         SkString            fKeyDescription;
266*c8dee2aaSAndroid Build Coastguard Worker 
267*c8dee2aaSAndroid Build Coastguard Worker         SkFourByteTag            fShaderType;
268*c8dee2aaSAndroid Build Coastguard Worker         std::string              fShader[kGrShaderTypeCount];
269*c8dee2aaSAndroid Build Coastguard Worker         SkSL::Program::Interface fInterfaces[kGrShaderTypeCount];
270*c8dee2aaSAndroid Build Coastguard Worker     };
271*c8dee2aaSAndroid Build Coastguard Worker 
272*c8dee2aaSAndroid Build Coastguard Worker     sk_gpu_test::MemoryCache fPersistentCache;
273*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<CachedShader>   fCachedShaders;
274*c8dee2aaSAndroid Build Coastguard Worker 
275*c8dee2aaSAndroid Build Coastguard Worker     enum ShaderOptLevel : int {
276*c8dee2aaSAndroid Build Coastguard Worker         kShaderOptLevel_Source,
277*c8dee2aaSAndroid Build Coastguard Worker         kShaderOptLevel_Compile,
278*c8dee2aaSAndroid Build Coastguard Worker         kShaderOptLevel_Optimize,
279*c8dee2aaSAndroid Build Coastguard Worker         kShaderOptLevel_Inline,
280*c8dee2aaSAndroid Build Coastguard Worker     };
281*c8dee2aaSAndroid Build Coastguard Worker     ShaderOptLevel fOptLevel = kShaderOptLevel_Source;
282*c8dee2aaSAndroid Build Coastguard Worker };
283*c8dee2aaSAndroid Build Coastguard Worker 
284*c8dee2aaSAndroid Build Coastguard Worker #endif
285