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