1 /* 2 * Copyright 2015 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 GrContextOptions_DEFINED 9 #define GrContextOptions_DEFINED 10 11 #include "SkData.h" 12 #include "SkTypes.h" 13 #include "GrTypes.h" 14 #include "../private/GrTypesPriv.h" 15 16 #include <vector> 17 18 class SkExecutor; 19 20 struct GrContextOptions { 21 enum class Enable { 22 /** Forces an option to be disabled. */ 23 kNo, 24 /** Forces an option to be enabled. */ 25 kYes, 26 /** 27 * Uses Skia's default behavior, which may use runtime properties (e.g. driver version). 28 */ 29 kDefault 30 }; 31 32 /** 33 * Abstract class which stores Skia data in a cache that persists between sessions. Currently, 34 * Skia stores compiled shader binaries (only when glProgramBinary / glGetProgramBinary are 35 * supported) when provided a persistent cache, but this may extend to other data in the future. 36 */ 37 class PersistentCache { 38 public: ~PersistentCacheGrContextOptions39 virtual ~PersistentCache() {} 40 41 /** 42 * Returns the data for the key if it exists in the cache, otherwise returns null. 43 */ 44 virtual sk_sp<SkData> load(const SkData& key) = 0; 45 46 virtual void store(const SkData& key, const SkData& data) = 0; 47 }; 48 GrContextOptionsGrContextOptions49 GrContextOptions() {} 50 51 // Suppress prints for the GrContext. 52 bool fSuppressPrints = false; 53 54 /** Overrides: These options override feature detection using backend API queries. These 55 overrides can only reduce the feature set or limits, never increase them beyond the 56 detected values. */ 57 58 int fMaxTextureSizeOverride = SK_MaxS32; 59 60 /** the threshold in bytes above which we will use a buffer mapping API to map vertex and index 61 buffers to CPU memory in order to update them. A value of -1 means the GrContext should 62 deduce the optimal value for this platform. */ 63 int fBufferMapThreshold = -1; 64 65 /** 66 * Executor to handle threaded work within Ganesh. If this is nullptr, then all work will be 67 * done serially on the main thread. To have worker threads assist with various tasks, set this 68 * to a valid SkExecutor instance. Currently, used for software path rendering, but may be used 69 * for other tasks. 70 */ 71 SkExecutor* fExecutor = nullptr; 72 73 /** Construct mipmaps manually, via repeated downsampling draw-calls. This is used when 74 the driver's implementation (glGenerateMipmap) contains bugs. This requires mipmap 75 level and LOD control (ie desktop or ES3). */ 76 bool fDoManualMipmapping = false; 77 78 /** 79 * Disables distance field rendering for paths. Distance field computation can be expensive, 80 * and yields no benefit if a path is not rendered multiple times with different transforms. 81 */ 82 bool fDisableDistanceFieldPaths = false; 83 84 /** 85 * If true this allows path mask textures to be cached. This is only really useful if paths 86 * are commonly rendered at the same scale and fractional translation. 87 */ 88 bool fAllowPathMaskCaching = true; 89 90 /** 91 * If true, sRGB support will not be enabled unless sRGB decoding can be disabled (via an 92 * extension). If mixed use of "legacy" mode and sRGB/color-correct mode is not required, this 93 * can be set to false, which will significantly expand the number of devices that qualify for 94 * sRGB support. 95 */ 96 bool fRequireDecodeDisableForSRGB = true; 97 98 /** 99 * If true, the GPU will not be used to perform YUV -> RGB conversion when generating 100 * textures from codec-backed images. 101 */ 102 bool fDisableGpuYUVConversion = false; 103 104 /** 105 * The maximum size of cache textures used for Skia's Glyph cache. 106 */ 107 float fGlyphCacheTextureMaximumBytes = 2048 * 1024 * 4; 108 109 /** 110 * Below this threshold size in device space distance field fonts won't be used. Distance field 111 * fonts don't support hinting which is more important at smaller sizes. A negative value means 112 * use the default threshold. 113 */ 114 float fMinDistanceFieldFontSize = -1.f; 115 116 /** 117 * Above this threshold size in device space glyphs are drawn as individual paths. A negative 118 * value means use the default threshold. 119 */ 120 float fGlyphsAsPathsFontSize = -1.f; 121 122 /** 123 * Can the glyph atlas use multiple textures. If allowed, the each texture's size is bound by 124 * fGlypheCacheTextureMaximumBytes. 125 */ 126 Enable fAllowMultipleGlyphCacheTextures = Enable::kDefault; 127 128 /** 129 * Bugs on certain drivers cause stencil buffers to leak. This flag causes Skia to avoid 130 * allocating stencil buffers and use alternate rasterization paths, avoiding the leak. 131 */ 132 bool fAvoidStencilBuffers = false; 133 134 /** 135 * When specifing new data for a vertex/index buffer that replaces old data Ganesh can give 136 * a hint to the driver that the previous data will not be used in future draws like this: 137 * glBufferData(GL_..._BUFFER, size, NULL, usage); //<--hint, NULL means 138 * glBufferSubData(GL_..._BUFFER, 0, lessThanSize, data) // old data can't be 139 * // used again. 140 * However, this can be an unoptimization on some platforms, esp. Chrome. 141 * Chrome's cmd buffer will create a new allocation and memset the whole thing 142 * to zero (for security reasons). 143 * Defaults to the value of GR_GL_USE_BUFFER_DATA_NULL_HINT #define (which is, by default, 1). 144 */ 145 Enable fUseGLBufferDataNullHint = Enable::kDefault; 146 147 /** 148 * If true, texture fetches from mip-mapped textures will be biased to read larger MIP levels. 149 * This has the effect of sharpening those textures, at the cost of some aliasing, and possible 150 * performance impact. 151 */ 152 bool fSharpenMipmappedTextures = false; 153 154 /** 155 * Enables driver workaround to use draws instead of glClear. This only applies to 156 * kOpenGL_GrBackend. 157 */ 158 Enable fUseDrawInsteadOfGLClear = Enable::kDefault; 159 160 /** 161 * Allow Ganesh to explicitly allocate resources at flush time rather than incrementally while 162 * drawing. This will eventually just be the way it is but, for now, it is optional. 163 */ 164 Enable fExplicitlyAllocateGPUResources = Enable::kDefault; 165 166 /** 167 * Allow Ganesh to sort the opLists prior to allocating resources. This is an optional 168 * behavior that is only relevant when 'fExplicitlyAllocateGPUResources' is enabled. 169 * Eventually this will just be what is done and will not be optional. 170 */ 171 Enable fSortRenderTargets = Enable::kDefault; 172 173 /** 174 * Disables correctness workarounds that are enabled for particular GPUs, OSes, or drivers. 175 * This does not affect code path choices that are made for perfomance reasons nor does it 176 * override other GrContextOption settings. 177 */ 178 bool fDisableDriverCorrectnessWorkarounds = false; 179 180 /** 181 * Cache in which to store compiled shader binaries between runs. 182 */ 183 PersistentCache* fPersistentCache = nullptr; 184 185 #if GR_TEST_UTILS 186 /** 187 * Private options that are only meant for testing within Skia's tools. 188 */ 189 190 /** 191 * If non-zero, overrides the maximum size of a tile for sw-backed images and bitmaps rendered 192 * by SkGpuDevice. 193 */ 194 int fMaxTileSizeOverride = 0; 195 196 /** 197 * Prevents use of dual source blending, to test that all xfer modes work correctly without it. 198 */ 199 bool fSuppressDualSourceBlending = false; 200 201 /** 202 * If true, the caps will never report driver support for path rendering. 203 */ 204 bool fSuppressPathRendering = false; 205 206 /** 207 * If true, the caps will never support geometry shaders. 208 */ 209 bool fSuppressGeometryShaders = false; 210 211 /** 212 * Render everything in wireframe 213 */ 214 bool fWireframeMode = false; 215 216 /** 217 * Include or exclude specific GPU path renderers. 218 */ 219 GpuPathRenderers fGpuPathRenderers = GpuPathRenderers::kDefault; 220 221 /** 222 * Disables using multiple texture units to batch multiple images into a single draw on 223 * supported GPUs. 224 */ 225 bool fDisableImageMultitexturing = false; 226 #endif 227 228 #if SK_SUPPORT_ATLAS_TEXT 229 /** 230 * Controls whether distance field glyph vertices always have 3 components even when the view 231 * matrix does not have perspective. 232 */ 233 Enable fDistanceFieldGlyphVerticesAlwaysHaveW = Enable::kDefault; 234 #endif 235 }; 236 237 #endif 238