• 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 #ifndef skgpu_graphite_ContextOptions_DEFINED
9 #define skgpu_graphite_ContextOptions_DEFINED
10 
11 #include "include/private/base/SkAPI.h"
12 #include "include/private/base/SkMath.h"
13 
14 namespace skgpu { class ShaderErrorHandler; }
15 
16 namespace skgpu::graphite {
17 
18 struct ContextOptionsPriv;
19 
20 struct SK_API ContextOptions {
ContextOptionsContextOptions21     ContextOptions() {}
22 
23     /**
24      * Disables correctness workarounds that are enabled for particular GPUs, OSes, or drivers.
25      * This does not affect code path choices that are made for perfomance reasons nor does it
26      * override other ContextOption settings.
27      */
28     bool fDisableDriverCorrectnessWorkarounds = false;
29 
30     /**
31      * If present, use this object to report shader compilation failures. If not, report failures
32      * via SkDebugf and assert.
33      */
34     skgpu::ShaderErrorHandler* fShaderErrorHandler = nullptr;
35 
36     /**
37      * Specifies the number of samples Graphite should use when performing internal draws with MSAA
38      * (hardware capabilities permitting).
39      *
40      * If <= 1, Graphite will disable internal code paths that use multisampling.
41      */
42     int fInternalMultisampleCount = 4;
43 
44     /**
45      * Will the client make sure to only ever be executing one thread that uses the Context and all
46      * derived classes (e.g. Recorders, Recordings, etc.) at a time. If so we can possibly make some
47      * objects (e.g. VulkanMemoryAllocator) not thread safe to improve single thread performance.
48      */
49     bool fClientWillExternallySynchronizeAllThreads = false;
50 
51     /**
52      * The maximum size of cache textures used for Skia's Glyph cache.
53      */
54     size_t fGlyphCacheTextureMaximumBytes = 2048 * 1024 * 4;
55 
56     /**
57      * Below this threshold size in device space distance field fonts won't be used. Distance field
58      * fonts don't support hinting which is more important at smaller sizes.
59      */
60     float fMinDistanceFieldFontSize = 18;
61 
62     /**
63      * Above this threshold size in device space glyphs are drawn as individual paths.
64      */
65 #if defined(SK_BUILD_FOR_ANDROID)
66     float fGlyphsAsPathsFontSize = 384;
67 #elif defined(SK_BUILD_FOR_MAC)
68     float fGlyphsAsPathsFontSize = 256;
69 #else
70     float fGlyphsAsPathsFontSize = 324;
71 #endif
72 
73     /**
74      * The maximum size of textures used for Skia's PathAtlas caches.
75      */
76     int fMaxPathAtlasTextureSize = 8192;  // oversized, PathAtlas will likely be smaller
77 
78     /**
79      * Can the glyph and path atlases use multiple textures. If allowed, each texture's size is
80      * bound by fGlyphCacheTextureMaximumBytes and fMaxPathAtlasTextureSize, respectively.
81      */
82     bool fAllowMultipleAtlasTextures = true;
83     bool fSupportBilerpFromGlyphAtlas = false;
84 
85     /**
86      * Disable caching of glyph uploads at the start of each Recording. These can add additional
87      * overhead and are only necessary if Recordings are replayed or played out of order.
88      *
89      * Deprecated, now only used to set requireOrderedRecordings Caps.
90      */
91     bool fDisableCachedGlyphUploads = false;
92 
93     static constexpr size_t kDefaultContextBudget = 256 * (1 << 20);
94     /**
95      * What is the budget for GPU resources allocated and held by the Context.
96      */
97     size_t fGpuBudgetInBytes = kDefaultContextBudget;
98 
99     /**
100      * Whether labels will be set on backend resources.
101      */
102 #if defined(SK_DEBUG)
103     bool fSetBackendLabels = true;
104 #else
105     bool fSetBackendLabels = false;
106 #endif
107 
108     /**
109      * Private options that are only meant for testing within Skia's tools.
110      */
111     ContextOptionsPriv* fOptionsPriv = nullptr;
112 };
113 
114 }  // namespace skgpu::graphite
115 
116 #endif  // skgpu_graphite_ContextOptions
117