xref: /aosp_15_r20/external/skia/include/gpu/ganesh/GrContextOptions.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2015 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 GrContextOptions_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrContextOptions_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ShaderErrorHandler.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDriverBugWorkarounds.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker #include <optional>
20*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker class SkExecutor;
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker struct SK_API GrContextOptions {
25*c8dee2aaSAndroid Build Coastguard Worker     enum class Enable {
26*c8dee2aaSAndroid Build Coastguard Worker         /** Forces an option to be disabled. */
27*c8dee2aaSAndroid Build Coastguard Worker         kNo,
28*c8dee2aaSAndroid Build Coastguard Worker         /** Forces an option to be enabled. */
29*c8dee2aaSAndroid Build Coastguard Worker         kYes,
30*c8dee2aaSAndroid Build Coastguard Worker         /**
31*c8dee2aaSAndroid Build Coastguard Worker          * Uses Skia's default behavior, which may use runtime properties (e.g. driver version).
32*c8dee2aaSAndroid Build Coastguard Worker          */
33*c8dee2aaSAndroid Build Coastguard Worker         kDefault
34*c8dee2aaSAndroid Build Coastguard Worker     };
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker     enum class ShaderCacheStrategy {
37*c8dee2aaSAndroid Build Coastguard Worker         kSkSL,
38*c8dee2aaSAndroid Build Coastguard Worker         kBackendSource,
39*c8dee2aaSAndroid Build Coastguard Worker         kBackendBinary,
40*c8dee2aaSAndroid Build Coastguard Worker     };
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     /**
43*c8dee2aaSAndroid Build Coastguard Worker      * Abstract class which stores Skia data in a cache that persists between sessions. Currently,
44*c8dee2aaSAndroid Build Coastguard Worker      * Skia stores compiled shader binaries (only when glProgramBinary / glGetProgramBinary are
45*c8dee2aaSAndroid Build Coastguard Worker      * supported) when provided a persistent cache, but this may extend to other data in the future.
46*c8dee2aaSAndroid Build Coastguard Worker      */
47*c8dee2aaSAndroid Build Coastguard Worker     class SK_API PersistentCache {
48*c8dee2aaSAndroid Build Coastguard Worker     public:
49*c8dee2aaSAndroid Build Coastguard Worker         virtual ~PersistentCache() = default;
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker         /**
52*c8dee2aaSAndroid Build Coastguard Worker          * Returns the data for the key if it exists in the cache, otherwise returns null.
53*c8dee2aaSAndroid Build Coastguard Worker          */
54*c8dee2aaSAndroid Build Coastguard Worker         virtual sk_sp<SkData> load(const SkData& key) = 0;
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker         // Placeholder until all clients override the 3-parameter store(), then remove this, and
57*c8dee2aaSAndroid Build Coastguard Worker         // make that version pure virtual.
storeGrContextOptions58*c8dee2aaSAndroid Build Coastguard Worker         virtual void store(const SkData& /*key*/, const SkData& /*data*/) { SkASSERT(false); }
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker         /**
61*c8dee2aaSAndroid Build Coastguard Worker          * Stores data in the cache, indexed by key. description provides a human-readable
62*c8dee2aaSAndroid Build Coastguard Worker          * version of the key.
63*c8dee2aaSAndroid Build Coastguard Worker          */
storeGrContextOptions64*c8dee2aaSAndroid Build Coastguard Worker         virtual void store(const SkData& key, const SkData& data, const SkString& /*description*/) {
65*c8dee2aaSAndroid Build Coastguard Worker             this->store(key, data);
66*c8dee2aaSAndroid Build Coastguard Worker         }
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker     protected:
69*c8dee2aaSAndroid Build Coastguard Worker         PersistentCache() = default;
70*c8dee2aaSAndroid Build Coastguard Worker         PersistentCache(const PersistentCache&) = delete;
71*c8dee2aaSAndroid Build Coastguard Worker         PersistentCache& operator=(const PersistentCache&) = delete;
72*c8dee2aaSAndroid Build Coastguard Worker     };
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     using ShaderErrorHandler = skgpu::ShaderErrorHandler;
75*c8dee2aaSAndroid Build Coastguard Worker 
GrContextOptionsGrContextOptions76*c8dee2aaSAndroid Build Coastguard Worker     GrContextOptions() {}
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker     /**
79*c8dee2aaSAndroid Build Coastguard Worker      * If Skia is creating a default VMA allocator for the Vulkan backend this value will be used
80*c8dee2aaSAndroid Build Coastguard Worker      * for the preferredLargeHeapBlockSize. If the value is not set, then Skia will use an
81*c8dee2aaSAndroid Build Coastguard Worker      * inernally defined default size.
82*c8dee2aaSAndroid Build Coastguard Worker      *
83*c8dee2aaSAndroid Build Coastguard Worker      * However, it is highly discouraged to have Skia make a default allocator (and support for
84*c8dee2aaSAndroid Build Coastguard Worker      * doing so will be removed soon,  b/321962001). Instead clients should create their own
85*c8dee2aaSAndroid Build Coastguard Worker      * allocator to pass into Skia where they can fine tune this value themeselves.
86*c8dee2aaSAndroid Build Coastguard Worker      */
87*c8dee2aaSAndroid Build Coastguard Worker     std::optional<uint64_t> fVulkanVMALargeHeapBlockSize;
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     /**
90*c8dee2aaSAndroid Build Coastguard Worker      * Optional callback that can be passed into the GrDirectContext which will be called when the
91*c8dee2aaSAndroid Build Coastguard Worker      * GrDirectContext is about to be destroyed. When this call is made, it will be safe for the
92*c8dee2aaSAndroid Build Coastguard Worker      * client to delete the GPU backend context that is backing the GrDirectContext. The
93*c8dee2aaSAndroid Build Coastguard Worker      * GrDirectContextDestroyedContext will be passed back to the client in the callback.
94*c8dee2aaSAndroid Build Coastguard Worker      */
95*c8dee2aaSAndroid Build Coastguard Worker     GrDirectContextDestroyedContext fContextDeleteContext = nullptr;
96*c8dee2aaSAndroid Build Coastguard Worker     GrDirectContextDestroyedProc fContextDeleteProc = nullptr;
97*c8dee2aaSAndroid Build Coastguard Worker 
98*c8dee2aaSAndroid Build Coastguard Worker     /**
99*c8dee2aaSAndroid Build Coastguard Worker      * Executor to handle threaded work within Ganesh. If this is nullptr, then all work will be
100*c8dee2aaSAndroid Build Coastguard Worker      * done serially on the main thread. To have worker threads assist with various tasks, set this
101*c8dee2aaSAndroid Build Coastguard Worker      * to a valid SkExecutor instance. Currently, used for software path rendering, but may be used
102*c8dee2aaSAndroid Build Coastguard Worker      * for other tasks.
103*c8dee2aaSAndroid Build Coastguard Worker      */
104*c8dee2aaSAndroid Build Coastguard Worker     SkExecutor* fExecutor = nullptr;
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     /**
107*c8dee2aaSAndroid Build Coastguard Worker      * Cache in which to store compiled shader binaries between runs.
108*c8dee2aaSAndroid Build Coastguard Worker      */
109*c8dee2aaSAndroid Build Coastguard Worker     PersistentCache* fPersistentCache = nullptr;
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker     /**
112*c8dee2aaSAndroid Build Coastguard Worker      * If present, use this object to report shader compilation failures. If not, report failures
113*c8dee2aaSAndroid Build Coastguard Worker      * via SkDebugf and assert.
114*c8dee2aaSAndroid Build Coastguard Worker      */
115*c8dee2aaSAndroid Build Coastguard Worker     ShaderErrorHandler* fShaderErrorHandler = nullptr;
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker     /** Default minimum size to use when allocating buffers for uploading data to textures. The
118*c8dee2aaSAndroid Build Coastguard Worker         larger the value the more uploads can be packed into one buffer, but at the cost of
119*c8dee2aaSAndroid Build Coastguard Worker         more gpu memory allocated that may not be used. Uploads larger than the minimum will still
120*c8dee2aaSAndroid Build Coastguard Worker         work by allocating a dedicated buffer. */
121*c8dee2aaSAndroid Build Coastguard Worker     size_t fMinimumStagingBufferSize = 64 * 1024;
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker     /**
124*c8dee2aaSAndroid Build Coastguard Worker      * The maximum size of cache textures used for Skia's Glyph cache.
125*c8dee2aaSAndroid Build Coastguard Worker      */
126*c8dee2aaSAndroid Build Coastguard Worker     size_t fGlyphCacheTextureMaximumBytes = 2048 * 1024 * 4;
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker     /**
129*c8dee2aaSAndroid Build Coastguard Worker      * Controls whether we check for GL errors after functions that allocate resources (e.g.
130*c8dee2aaSAndroid Build Coastguard Worker      * glTexImage2D), at the end of a GPU submission, or checking framebuffer completeness. The
131*c8dee2aaSAndroid Build Coastguard Worker      * results of shader compilation and program linking are always checked, regardless of this
132*c8dee2aaSAndroid Build Coastguard Worker      * option. Ignored on backends other than GL.
133*c8dee2aaSAndroid Build Coastguard Worker      */
134*c8dee2aaSAndroid Build Coastguard Worker     Enable fSkipGLErrorChecks = Enable::kDefault;
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker     /**
137*c8dee2aaSAndroid Build Coastguard Worker      * Can the glyph atlas use multiple textures. If allowed, the each texture's size is bound by
138*c8dee2aaSAndroid Build Coastguard Worker      * fGlypheCacheTextureMaximumBytes.
139*c8dee2aaSAndroid Build Coastguard Worker      */
140*c8dee2aaSAndroid Build Coastguard Worker     Enable fAllowMultipleGlyphCacheTextures = Enable::kDefault;
141*c8dee2aaSAndroid Build Coastguard Worker 
142*c8dee2aaSAndroid Build Coastguard Worker     /**
143*c8dee2aaSAndroid Build Coastguard Worker      * Enables driver workaround to use draws instead of HW clears, e.g. glClear on the GL backend.
144*c8dee2aaSAndroid Build Coastguard Worker      */
145*c8dee2aaSAndroid Build Coastguard Worker     Enable fUseDrawInsteadOfClear = Enable::kDefault;
146*c8dee2aaSAndroid Build Coastguard Worker 
147*c8dee2aaSAndroid Build Coastguard Worker     /**
148*c8dee2aaSAndroid Build Coastguard Worker      * Allow Ganesh to more aggressively reorder operations to reduce the number of render passes.
149*c8dee2aaSAndroid Build Coastguard Worker      * Offscreen draws will be done upfront instead of interrupting the main render pass when
150*c8dee2aaSAndroid Build Coastguard Worker      * possible. May increase VRAM usage, but still observes the resource cache limit.
151*c8dee2aaSAndroid Build Coastguard Worker      * Enabled by default.
152*c8dee2aaSAndroid Build Coastguard Worker      */
153*c8dee2aaSAndroid Build Coastguard Worker     Enable fReduceOpsTaskSplitting = Enable::kDefault;
154*c8dee2aaSAndroid Build Coastguard Worker 
155*c8dee2aaSAndroid Build Coastguard Worker     /**
156*c8dee2aaSAndroid Build Coastguard Worker      * This affects the usage of the PersistentCache. We can cache SkSL, backend source (GLSL), or
157*c8dee2aaSAndroid Build Coastguard Worker      * backend binaries (GL program binaries). By default we cache binaries, but if the driver's
158*c8dee2aaSAndroid Build Coastguard Worker      * binary loading/storing is believed to have bugs, this can be limited to caching GLSL.
159*c8dee2aaSAndroid Build Coastguard Worker      * Caching GLSL strings still saves CPU work when a GL program is created.
160*c8dee2aaSAndroid Build Coastguard Worker      */
161*c8dee2aaSAndroid Build Coastguard Worker     ShaderCacheStrategy fShaderCacheStrategy = ShaderCacheStrategy::kBackendBinary;
162*c8dee2aaSAndroid Build Coastguard Worker 
163*c8dee2aaSAndroid Build Coastguard Worker     /** Overrides: These options override feature detection using backend API queries. These
164*c8dee2aaSAndroid Build Coastguard Worker         overrides can only reduce the feature set or limits, never increase them beyond the
165*c8dee2aaSAndroid Build Coastguard Worker         detected values. */
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     int  fMaxTextureSizeOverride = SK_MaxS32;
168*c8dee2aaSAndroid Build Coastguard Worker 
169*c8dee2aaSAndroid Build Coastguard Worker     /** the threshold in bytes above which we will use a buffer mapping API to map vertex and index
170*c8dee2aaSAndroid Build Coastguard Worker         buffers to CPU memory in order to update them.  A value of -1 means the GrContext should
171*c8dee2aaSAndroid Build Coastguard Worker         deduce the optimal value for this platform. */
172*c8dee2aaSAndroid Build Coastguard Worker     int  fBufferMapThreshold = -1;
173*c8dee2aaSAndroid Build Coastguard Worker 
174*c8dee2aaSAndroid Build Coastguard Worker     /**
175*c8dee2aaSAndroid Build Coastguard Worker      * Maximum number of GPU programs or pipelines to keep active in the runtime cache.
176*c8dee2aaSAndroid Build Coastguard Worker      */
177*c8dee2aaSAndroid Build Coastguard Worker     int fRuntimeProgramCacheSize = 256;
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker     /**
180*c8dee2aaSAndroid Build Coastguard Worker      * Specifies the number of samples Ganesh should use when performing internal draws with MSAA
181*c8dee2aaSAndroid Build Coastguard Worker      * (hardware capabilities permitting).
182*c8dee2aaSAndroid Build Coastguard Worker      *
183*c8dee2aaSAndroid Build Coastguard Worker      * If 0, Ganesh will disable internal code paths that use multisampling.
184*c8dee2aaSAndroid Build Coastguard Worker      */
185*c8dee2aaSAndroid Build Coastguard Worker     int  fInternalMultisampleCount = 4;
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker     /**
188*c8dee2aaSAndroid Build Coastguard Worker      * In Skia's vulkan backend a single GrContext submit equates to the submission of a single
189*c8dee2aaSAndroid Build Coastguard Worker      * primary command buffer to the VkQueue. This value specifies how many vulkan secondary command
190*c8dee2aaSAndroid Build Coastguard Worker      * buffers we will cache for reuse on a given primary command buffer. A single submit may use
191*c8dee2aaSAndroid Build Coastguard Worker      * more than this many secondary command buffers, but after the primary command buffer is
192*c8dee2aaSAndroid Build Coastguard Worker      * finished on the GPU it will only hold on to this many secondary command buffers for reuse.
193*c8dee2aaSAndroid Build Coastguard Worker      *
194*c8dee2aaSAndroid Build Coastguard Worker      * A value of -1 means we will pick a limit value internally.
195*c8dee2aaSAndroid Build Coastguard Worker      */
196*c8dee2aaSAndroid Build Coastguard Worker     int fMaxCachedVulkanSecondaryCommandBuffers = -1;
197*c8dee2aaSAndroid Build Coastguard Worker 
198*c8dee2aaSAndroid Build Coastguard Worker     /**
199*c8dee2aaSAndroid Build Coastguard Worker      * Below this threshold size in device space distance field fonts won't be used. Distance field
200*c8dee2aaSAndroid Build Coastguard Worker      * fonts don't support hinting which is more important at smaller sizes.
201*c8dee2aaSAndroid Build Coastguard Worker      */
202*c8dee2aaSAndroid Build Coastguard Worker     float fMinDistanceFieldFontSize = 18;
203*c8dee2aaSAndroid Build Coastguard Worker 
204*c8dee2aaSAndroid Build Coastguard Worker     /**
205*c8dee2aaSAndroid Build Coastguard Worker      * Above this threshold size in device space glyphs are drawn as individual paths.
206*c8dee2aaSAndroid Build Coastguard Worker      */
207*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_ANDROID)
208*c8dee2aaSAndroid Build Coastguard Worker     float fGlyphsAsPathsFontSize = 384;
209*c8dee2aaSAndroid Build Coastguard Worker #elif defined(SK_BUILD_FOR_MAC)
210*c8dee2aaSAndroid Build Coastguard Worker     float fGlyphsAsPathsFontSize = 256;
211*c8dee2aaSAndroid Build Coastguard Worker #else
212*c8dee2aaSAndroid Build Coastguard Worker     float fGlyphsAsPathsFontSize = 324;
213*c8dee2aaSAndroid Build Coastguard Worker #endif
214*c8dee2aaSAndroid Build Coastguard Worker 
215*c8dee2aaSAndroid Build Coastguard Worker     GrDriverBugWorkarounds fDriverBugWorkarounds;
216*c8dee2aaSAndroid Build Coastguard Worker 
217*c8dee2aaSAndroid Build Coastguard Worker     /** Construct mipmaps manually, via repeated downsampling draw-calls. This is used when
218*c8dee2aaSAndroid Build Coastguard Worker         the driver's implementation (glGenerateMipmap) contains bugs. This requires mipmap
219*c8dee2aaSAndroid Build Coastguard Worker         level control (ie desktop or ES3). */
220*c8dee2aaSAndroid Build Coastguard Worker     bool fDoManualMipmapping = false;
221*c8dee2aaSAndroid Build Coastguard Worker 
222*c8dee2aaSAndroid Build Coastguard Worker     /**
223*c8dee2aaSAndroid Build Coastguard Worker      * Disables the use of coverage counting shortcuts to render paths. Coverage counting can cause
224*c8dee2aaSAndroid Build Coastguard Worker      * artifacts along shared edges if care isn't taken to ensure both contours wind in the same
225*c8dee2aaSAndroid Build Coastguard Worker      * direction.
226*c8dee2aaSAndroid Build Coastguard Worker      */
227*c8dee2aaSAndroid Build Coastguard Worker     // FIXME: Once this is removed from Chrome and Android, rename to fEnable"".
228*c8dee2aaSAndroid Build Coastguard Worker     bool fDisableCoverageCountingPaths = true;
229*c8dee2aaSAndroid Build Coastguard Worker 
230*c8dee2aaSAndroid Build Coastguard Worker     /**
231*c8dee2aaSAndroid Build Coastguard Worker      * Disables distance field rendering for paths. Distance field computation can be expensive,
232*c8dee2aaSAndroid Build Coastguard Worker      * and yields no benefit if a path is not rendered multiple times with different transforms.
233*c8dee2aaSAndroid Build Coastguard Worker      */
234*c8dee2aaSAndroid Build Coastguard Worker     bool fDisableDistanceFieldPaths = false;
235*c8dee2aaSAndroid Build Coastguard Worker 
236*c8dee2aaSAndroid Build Coastguard Worker     /**
237*c8dee2aaSAndroid Build Coastguard Worker      * If true this allows path mask textures to be cached. This is only really useful if paths
238*c8dee2aaSAndroid Build Coastguard Worker      * are commonly rendered at the same scale and fractional translation.
239*c8dee2aaSAndroid Build Coastguard Worker      */
240*c8dee2aaSAndroid Build Coastguard Worker     bool fAllowPathMaskCaching = true;
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker     /**
243*c8dee2aaSAndroid Build Coastguard Worker      * If true, the GPU will not be used to perform YUV -> RGB conversion when generating
244*c8dee2aaSAndroid Build Coastguard Worker      * textures from codec-backed images.
245*c8dee2aaSAndroid Build Coastguard Worker      */
246*c8dee2aaSAndroid Build Coastguard Worker     bool fDisableGpuYUVConversion = false;
247*c8dee2aaSAndroid Build Coastguard Worker 
248*c8dee2aaSAndroid Build Coastguard Worker     /**
249*c8dee2aaSAndroid Build Coastguard Worker      * Bugs on certain drivers cause stencil buffers to leak. This flag causes Skia to avoid
250*c8dee2aaSAndroid Build Coastguard Worker      * allocating stencil buffers and use alternate rasterization paths, avoiding the leak.
251*c8dee2aaSAndroid Build Coastguard Worker      */
252*c8dee2aaSAndroid Build Coastguard Worker     bool fAvoidStencilBuffers = false;
253*c8dee2aaSAndroid Build Coastguard Worker 
254*c8dee2aaSAndroid Build Coastguard Worker     /**
255*c8dee2aaSAndroid Build Coastguard Worker      * If true, texture fetches from mip-mapped textures will be biased to read larger MIP levels.
256*c8dee2aaSAndroid Build Coastguard Worker      * This has the effect of sharpening those textures, at the cost of some aliasing, and possible
257*c8dee2aaSAndroid Build Coastguard Worker      * performance impact.
258*c8dee2aaSAndroid Build Coastguard Worker      */
259*c8dee2aaSAndroid Build Coastguard Worker     bool fSharpenMipmappedTextures = true;
260*c8dee2aaSAndroid Build Coastguard Worker 
261*c8dee2aaSAndroid Build Coastguard Worker     /**
262*c8dee2aaSAndroid Build Coastguard Worker      * Some ES3 contexts report the ES2 external image extension, but not the ES3 version.
263*c8dee2aaSAndroid Build Coastguard Worker      * If support for external images is critical, enabling this option will cause Ganesh to limit
264*c8dee2aaSAndroid Build Coastguard Worker      * shaders to the ES2 shading language in that situation.
265*c8dee2aaSAndroid Build Coastguard Worker      */
266*c8dee2aaSAndroid Build Coastguard Worker     bool fPreferExternalImagesOverES3 = false;
267*c8dee2aaSAndroid Build Coastguard Worker 
268*c8dee2aaSAndroid Build Coastguard Worker     /**
269*c8dee2aaSAndroid Build Coastguard Worker      * Disables correctness workarounds that are enabled for particular GPUs, OSes, or drivers.
270*c8dee2aaSAndroid Build Coastguard Worker      * This does not affect code path choices that are made for perfomance reasons nor does it
271*c8dee2aaSAndroid Build Coastguard Worker      * override other GrContextOption settings.
272*c8dee2aaSAndroid Build Coastguard Worker      */
273*c8dee2aaSAndroid Build Coastguard Worker     bool fDisableDriverCorrectnessWorkarounds = false;
274*c8dee2aaSAndroid Build Coastguard Worker 
275*c8dee2aaSAndroid Build Coastguard Worker     /**
276*c8dee2aaSAndroid Build Coastguard Worker      * If true, the caps will never support mipmaps.
277*c8dee2aaSAndroid Build Coastguard Worker      */
278*c8dee2aaSAndroid Build Coastguard Worker     bool fSuppressMipmapSupport = false;
279*c8dee2aaSAndroid Build Coastguard Worker 
280*c8dee2aaSAndroid Build Coastguard Worker     /**
281*c8dee2aaSAndroid Build Coastguard Worker      * If true, the TessellationPathRenderer will not be used for path rendering.
282*c8dee2aaSAndroid Build Coastguard Worker      * If false, will fallback to any driver workarounds, if set.
283*c8dee2aaSAndroid Build Coastguard Worker      */
284*c8dee2aaSAndroid Build Coastguard Worker     bool fDisableTessellationPathRenderer = false;
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker     /**
287*c8dee2aaSAndroid Build Coastguard Worker      * If true, and if supported, enables hardware tessellation in the caps.
288*c8dee2aaSAndroid Build Coastguard Worker      * DEPRECATED: This value is ignored; experimental hardware tessellation is always disabled.
289*c8dee2aaSAndroid Build Coastguard Worker      */
290*c8dee2aaSAndroid Build Coastguard Worker     bool fEnableExperimentalHardwareTessellation = false;
291*c8dee2aaSAndroid Build Coastguard Worker 
292*c8dee2aaSAndroid Build Coastguard Worker     /**
293*c8dee2aaSAndroid Build Coastguard Worker      * If true, then add 1 pixel padding to all glyph masks in the atlas to support bi-lerp
294*c8dee2aaSAndroid Build Coastguard Worker      * rendering of all glyphs. This must be set to true to use Slugs.
295*c8dee2aaSAndroid Build Coastguard Worker      */
296*c8dee2aaSAndroid Build Coastguard Worker     bool fSupportBilerpFromGlyphAtlas = false;
297*c8dee2aaSAndroid Build Coastguard Worker 
298*c8dee2aaSAndroid Build Coastguard Worker     /**
299*c8dee2aaSAndroid Build Coastguard Worker      * Uses a reduced variety of shaders. May perform less optimally in steady state but can reduce
300*c8dee2aaSAndroid Build Coastguard Worker      * jank due to shader compilations.
301*c8dee2aaSAndroid Build Coastguard Worker      */
302*c8dee2aaSAndroid Build Coastguard Worker     bool fReducedShaderVariations = false;
303*c8dee2aaSAndroid Build Coastguard Worker 
304*c8dee2aaSAndroid Build Coastguard Worker     /**
305*c8dee2aaSAndroid Build Coastguard Worker      * If true, then allow to enable MSAA on new Intel GPUs.
306*c8dee2aaSAndroid Build Coastguard Worker      */
307*c8dee2aaSAndroid Build Coastguard Worker     bool fAllowMSAAOnNewIntel = false;
308*c8dee2aaSAndroid Build Coastguard Worker 
309*c8dee2aaSAndroid Build Coastguard Worker     /**
310*c8dee2aaSAndroid Build Coastguard Worker      * Currently on ARM Android we disable the use of GL TexStorage because of memory regressions.
311*c8dee2aaSAndroid Build Coastguard Worker      * However, some clients may still want to use TexStorage. For example, TexStorage support is
312*c8dee2aaSAndroid Build Coastguard Worker      * required for creating protected textures.
313*c8dee2aaSAndroid Build Coastguard Worker      *
314*c8dee2aaSAndroid Build Coastguard Worker      * This flag has no impact on non GL backends.
315*c8dee2aaSAndroid Build Coastguard Worker      */
316*c8dee2aaSAndroid Build Coastguard Worker     bool fAlwaysUseTexStorageWhenAvailable = false;
317*c8dee2aaSAndroid Build Coastguard Worker 
318*c8dee2aaSAndroid Build Coastguard Worker     // Suppress prints for the GrContext.
319*c8dee2aaSAndroid Build Coastguard Worker     bool fSuppressPrints = false;
320*c8dee2aaSAndroid Build Coastguard Worker 
321*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
322*c8dee2aaSAndroid Build Coastguard Worker     /**
323*c8dee2aaSAndroid Build Coastguard Worker      * Private options that are only meant for testing within Skia's tools.
324*c8dee2aaSAndroid Build Coastguard Worker      */
325*c8dee2aaSAndroid Build Coastguard Worker 
326*c8dee2aaSAndroid Build Coastguard Worker     /**
327*c8dee2aaSAndroid Build Coastguard Worker      * Include or exclude specific GPU path renderers.
328*c8dee2aaSAndroid Build Coastguard Worker      */
329*c8dee2aaSAndroid Build Coastguard Worker     GpuPathRenderers fGpuPathRenderers = GpuPathRenderers::kDefault;
330*c8dee2aaSAndroid Build Coastguard Worker 
331*c8dee2aaSAndroid Build Coastguard Worker     /**
332*c8dee2aaSAndroid Build Coastguard Worker      * Specify the GPU resource cache limit. Equivalent to calling `setResourceCacheLimit` on the
333*c8dee2aaSAndroid Build Coastguard Worker      * context at construction time.
334*c8dee2aaSAndroid Build Coastguard Worker      *
335*c8dee2aaSAndroid Build Coastguard Worker      * A value of -1 means use the default limit value.
336*c8dee2aaSAndroid Build Coastguard Worker      */
337*c8dee2aaSAndroid Build Coastguard Worker     int fResourceCacheLimitOverride = -1;
338*c8dee2aaSAndroid Build Coastguard Worker 
339*c8dee2aaSAndroid Build Coastguard Worker     /**
340*c8dee2aaSAndroid Build Coastguard Worker      * Maximum width and height of internal texture atlases.
341*c8dee2aaSAndroid Build Coastguard Worker      */
342*c8dee2aaSAndroid Build Coastguard Worker     int  fMaxTextureAtlasSize = 2048;
343*c8dee2aaSAndroid Build Coastguard Worker 
344*c8dee2aaSAndroid Build Coastguard Worker     /**
345*c8dee2aaSAndroid Build Coastguard Worker      * Testing-only mode to exercise allocation failures in the flush-time callback objects.
346*c8dee2aaSAndroid Build Coastguard Worker      * For now it only simulates allocation failure during the preFlush callback.
347*c8dee2aaSAndroid Build Coastguard Worker      */
348*c8dee2aaSAndroid Build Coastguard Worker     bool fFailFlushTimeCallbacks = false;
349*c8dee2aaSAndroid Build Coastguard Worker 
350*c8dee2aaSAndroid Build Coastguard Worker     /**
351*c8dee2aaSAndroid Build Coastguard Worker      * Prevents use of dual source blending, to test that all xfer modes work correctly without it.
352*c8dee2aaSAndroid Build Coastguard Worker      */
353*c8dee2aaSAndroid Build Coastguard Worker     bool fSuppressDualSourceBlending = false;
354*c8dee2aaSAndroid Build Coastguard Worker 
355*c8dee2aaSAndroid Build Coastguard Worker     /**
356*c8dee2aaSAndroid Build Coastguard Worker      * Prevents the use of non-coefficient-based blend equations, for testing dst reads, barriers,
357*c8dee2aaSAndroid Build Coastguard Worker      * and in-shader blending.
358*c8dee2aaSAndroid Build Coastguard Worker      */
359*c8dee2aaSAndroid Build Coastguard Worker     bool fSuppressAdvancedBlendEquations = false;
360*c8dee2aaSAndroid Build Coastguard Worker 
361*c8dee2aaSAndroid Build Coastguard Worker     /**
362*c8dee2aaSAndroid Build Coastguard Worker      * Prevents the use of framebuffer fetches, for testing dst reads and texture barriers.
363*c8dee2aaSAndroid Build Coastguard Worker      */
364*c8dee2aaSAndroid Build Coastguard Worker     bool fSuppressFramebufferFetch = false;
365*c8dee2aaSAndroid Build Coastguard Worker 
366*c8dee2aaSAndroid Build Coastguard Worker     /**
367*c8dee2aaSAndroid Build Coastguard Worker      * If true, then all paths are processed as if "setIsVolatile" had been called.
368*c8dee2aaSAndroid Build Coastguard Worker      */
369*c8dee2aaSAndroid Build Coastguard Worker     bool fAllPathsVolatile = false;
370*c8dee2aaSAndroid Build Coastguard Worker 
371*c8dee2aaSAndroid Build Coastguard Worker     /**
372*c8dee2aaSAndroid Build Coastguard Worker      * Render everything in wireframe
373*c8dee2aaSAndroid Build Coastguard Worker      */
374*c8dee2aaSAndroid Build Coastguard Worker     bool fWireframeMode = false;
375*c8dee2aaSAndroid Build Coastguard Worker 
376*c8dee2aaSAndroid Build Coastguard Worker     /**
377*c8dee2aaSAndroid Build Coastguard Worker      * Enforces clearing of all textures when they're created.
378*c8dee2aaSAndroid Build Coastguard Worker      */
379*c8dee2aaSAndroid Build Coastguard Worker     bool fClearAllTextures = false;
380*c8dee2aaSAndroid Build Coastguard Worker 
381*c8dee2aaSAndroid Build Coastguard Worker     /**
382*c8dee2aaSAndroid Build Coastguard Worker      * Randomly generate a (false) GL_OUT_OF_MEMORY error
383*c8dee2aaSAndroid Build Coastguard Worker      */
384*c8dee2aaSAndroid Build Coastguard Worker     bool fRandomGLOOM = false;
385*c8dee2aaSAndroid Build Coastguard Worker 
386*c8dee2aaSAndroid Build Coastguard Worker     /**
387*c8dee2aaSAndroid Build Coastguard Worker      * Force off support for write/transfer pixels row bytes in caps.
388*c8dee2aaSAndroid Build Coastguard Worker      */
389*c8dee2aaSAndroid Build Coastguard Worker     bool fDisallowWriteAndTransferPixelRowBytes = false;
390*c8dee2aaSAndroid Build Coastguard Worker 
391*c8dee2aaSAndroid Build Coastguard Worker #endif
392*c8dee2aaSAndroid Build Coastguard Worker 
393*c8dee2aaSAndroid Build Coastguard Worker };
394*c8dee2aaSAndroid Build Coastguard Worker 
395*c8dee2aaSAndroid Build Coastguard Worker #endif
396