1682c269a1511200322916af83053e26004c0ec40bsalomon/*
2682c269a1511200322916af83053e26004c0ec40bsalomon * Copyright 2015 Google Inc.
3682c269a1511200322916af83053e26004c0ec40bsalomon *
4682c269a1511200322916af83053e26004c0ec40bsalomon * Use of this source code is governed by a BSD-style license that can be
5682c269a1511200322916af83053e26004c0ec40bsalomon * found in the LICENSE file.
6682c269a1511200322916af83053e26004c0ec40bsalomon */
7682c269a1511200322916af83053e26004c0ec40bsalomon
8682c269a1511200322916af83053e26004c0ec40bsalomon#ifndef GrContextOptions_DEFINED
9682c269a1511200322916af83053e26004c0ec40bsalomon#define GrContextOptions_DEFINED
10682c269a1511200322916af83053e26004c0ec40bsalomon
11d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas#include "SkData.h"
12682c269a1511200322916af83053e26004c0ec40bsalomon#include "SkTypes.h"
13008b9d80ab9adbf2656eceaf54d11cd15e4dda05csmartdalton#include "GrTypes.h"
14195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman#include "../private/GrTypesPriv.h"
15682c269a1511200322916af83053e26004c0ec40bsalomon
16d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas#include <vector>
17d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas
1851279987957a64d0f1a9cf7d299a8689734a0e50Brian Osmanclass SkExecutor;
1951279987957a64d0f1a9cf7d299a8689734a0e50Brian Osman
20682c269a1511200322916af83053e26004c0ec40bsalomonstruct GrContextOptions {
2143f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon    enum class Enable {
2243f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon        /** Forces an option to be disabled. */
2343f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon        kNo,
2443f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon        /** Forces an option to be enabled. */
2543f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon        kYes,
2643f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon        /**
2743f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon         * Uses Skia's default behavior, which may use runtime properties (e.g. driver version).
2843f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon         */
2943f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon        kDefault
3043f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon    };
3143f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon
32d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas    /**
33d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas     * Abstract class which stores Skia data in a cache that persists between sessions. Currently,
34d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas     * Skia stores compiled shader binaries (only when glProgramBinary / glGetProgramBinary are
35d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas     * supported) when provided a persistent cache, but this may extend to other data in the future.
36d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas     */
37d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas    class PersistentCache {
38d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas    public:
39d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas        virtual ~PersistentCache() {}
40d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas
41d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas        /**
42d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas         * Returns the data for the key if it exists in the cache, otherwise returns null.
43d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas         */
44d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas        virtual sk_sp<SkData> load(const SkData& key) = 0;
45d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas
46d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas        virtual void store(const SkData& key, const SkData& data) = 0;
47d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas    };
48d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas
49fc6c37b981daeece7474ce61070c707c37eefa62Mike Klein    GrContextOptions() {}
50682c269a1511200322916af83053e26004c0ec40bsalomon
51682c269a1511200322916af83053e26004c0ec40bsalomon    // Suppress prints for the GrContext.
526b2552f10983d1b6d33303e3e9965ae71944c1d5bsalomon    bool fSuppressPrints = false;
534ee6bd86c500d9b464e2f8cb3565544b8c97c0a9bsalomon
544ee6bd86c500d9b464e2f8cb3565544b8c97c0a9bsalomon    /** Overrides: These options override feature detection using backend API queries. These
554ee6bd86c500d9b464e2f8cb3565544b8c97c0a9bsalomon        overrides can only reduce the feature set or limits, never increase them beyond the
564ee6bd86c500d9b464e2f8cb3565544b8c97c0a9bsalomon        detected values. */
574ee6bd86c500d9b464e2f8cb3565544b8c97c0a9bsalomon
586b2552f10983d1b6d33303e3e9965ae71944c1d5bsalomon    int  fMaxTextureSizeOverride = SK_MaxS32;
596b2552f10983d1b6d33303e3e9965ae71944c1d5bsalomon
60e5b74c68564baab3639b21a95ce5b4b92949ca27joshualitt    /** the threshold in bytes above which we will use a buffer mapping API to map vertex and index
61e5b74c68564baab3639b21a95ce5b4b92949ca27joshualitt        buffers to CPU memory in order to update them.  A value of -1 means the GrContext should
62e5b74c68564baab3639b21a95ce5b4b92949ca27joshualitt        deduce the optimal value for this platform. */
636b2552f10983d1b6d33303e3e9965ae71944c1d5bsalomon    int  fBufferMapThreshold = -1;
6483bc22970364f1ff94751b99c4b4048b3c66e1a2joshualitt
6551279987957a64d0f1a9cf7d299a8689734a0e50Brian Osman    /**
6651279987957a64d0f1a9cf7d299a8689734a0e50Brian Osman     * Executor to handle threaded work within Ganesh. If this is nullptr, then all work will be
6751279987957a64d0f1a9cf7d299a8689734a0e50Brian Osman     * done serially on the main thread. To have worker threads assist with various tasks, set this
6851279987957a64d0f1a9cf7d299a8689734a0e50Brian Osman     * to a valid SkExecutor instance. Currently, used for software path rendering, but may be used
6951279987957a64d0f1a9cf7d299a8689734a0e50Brian Osman     * for other tasks.
7051279987957a64d0f1a9cf7d299a8689734a0e50Brian Osman     */
7151279987957a64d0f1a9cf7d299a8689734a0e50Brian Osman    SkExecutor* fExecutor = nullptr;
7251279987957a64d0f1a9cf7d299a8689734a0e50Brian Osman
739a3fbf7e559ca59a7b67a62be743496da1e31724brianosman    /** Construct mipmaps manually, via repeated downsampling draw-calls. This is used when
749a3fbf7e559ca59a7b67a62be743496da1e31724brianosman        the driver's implementation (glGenerateMipmap) contains bugs. This requires mipmap
759a3fbf7e559ca59a7b67a62be743496da1e31724brianosman        level and LOD control (ie desktop or ES3). */
766b2552f10983d1b6d33303e3e9965ae71944c1d5bsalomon    bool fDoManualMipmapping = false;
77e0d362929d6569e8737d80dead791c640390e819csmartdalton
7839ef7fb885d7be648b9f0ecd027bc400d1213cecbsalomon    /**
79b350ae24d5356ac094982aee2f45c90216db35dbBrian Osman     * Disables distance field rendering for paths. Distance field computation can be expensive,
80b350ae24d5356ac094982aee2f45c90216db35dbBrian Osman     * and yields no benefit if a path is not rendered multiple times with different transforms.
81b350ae24d5356ac094982aee2f45c90216db35dbBrian Osman     */
82b350ae24d5356ac094982aee2f45c90216db35dbBrian Osman    bool fDisableDistanceFieldPaths = false;
83b350ae24d5356ac094982aee2f45c90216db35dbBrian Osman
84b350ae24d5356ac094982aee2f45c90216db35dbBrian Osman    /**
8539ef7fb885d7be648b9f0ecd027bc400d1213cecbsalomon     * If true this allows path mask textures to be cached. This is only really useful if paths
8639ef7fb885d7be648b9f0ecd027bc400d1213cecbsalomon     * are commonly rendered at the same scale and fractional translation.
8739ef7fb885d7be648b9f0ecd027bc400d1213cecbsalomon     */
8836dcd7f25d1ffee8571a7d424eb02f60cd474fa7Brian Osman    bool fAllowPathMaskCaching = true;
8939ef7fb885d7be648b9f0ecd027bc400d1213cecbsalomon
9039ef7fb885d7be648b9f0ecd027bc400d1213cecbsalomon    /**
9120471894eaa441193d5ae8f2395e8244c91c55afbrianosman     * If true, sRGB support will not be enabled unless sRGB decoding can be disabled (via an
9220471894eaa441193d5ae8f2395e8244c91c55afbrianosman     * extension). If mixed use of "legacy" mode and sRGB/color-correct mode is not required, this
9320471894eaa441193d5ae8f2395e8244c91c55afbrianosman     * can be set to false, which will significantly expand the number of devices that qualify for
9420471894eaa441193d5ae8f2395e8244c91c55afbrianosman     * sRGB support.
9520471894eaa441193d5ae8f2395e8244c91c55afbrianosman     */
9620471894eaa441193d5ae8f2395e8244c91c55afbrianosman    bool fRequireDecodeDisableForSRGB = true;
9746da1cc9f20c277f7789355038d426931195aa65Brian Osman
9846da1cc9f20c277f7789355038d426931195aa65Brian Osman    /**
9946da1cc9f20c277f7789355038d426931195aa65Brian Osman     * If true, the GPU will not be used to perform YUV -> RGB conversion when generating
10046da1cc9f20c277f7789355038d426931195aa65Brian Osman     * textures from codec-backed images.
10146da1cc9f20c277f7789355038d426931195aa65Brian Osman     */
10246da1cc9f20c277f7789355038d426931195aa65Brian Osman    bool fDisableGpuYUVConversion = false;
103008b9d80ab9adbf2656eceaf54d11cd15e4dda05csmartdalton
104008b9d80ab9adbf2656eceaf54d11cd15e4dda05csmartdalton    /**
105195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * The maximum size of cache textures used for Skia's Glyph cache.
106008b9d80ab9adbf2656eceaf54d11cd15e4dda05csmartdalton     */
107195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    float fGlyphCacheTextureMaximumBytes = 2048 * 1024 * 4;
108008b9d80ab9adbf2656eceaf54d11cd15e4dda05csmartdalton
109008b9d80ab9adbf2656eceaf54d11cd15e4dda05csmartdalton    /**
110af597481143ca4b17884360604be954a71cc34cfBrian Salomon     * Below this threshold size in device space distance field fonts won't be used. Distance field
111af597481143ca4b17884360604be954a71cc34cfBrian Salomon     * fonts don't support hinting which is more important at smaller sizes. A negative value means
112af597481143ca4b17884360604be954a71cc34cfBrian Salomon     * use the default threshold.
113af597481143ca4b17884360604be954a71cc34cfBrian Salomon     */
114af597481143ca4b17884360604be954a71cc34cfBrian Salomon    float fMinDistanceFieldFontSize = -1.f;
115af597481143ca4b17884360604be954a71cc34cfBrian Salomon
116af597481143ca4b17884360604be954a71cc34cfBrian Salomon    /**
117af597481143ca4b17884360604be954a71cc34cfBrian Salomon     * Above this threshold size in device space glyphs are drawn as individual paths. A negative
118af597481143ca4b17884360604be954a71cc34cfBrian Salomon     * value means use the default threshold.
119af597481143ca4b17884360604be954a71cc34cfBrian Salomon     */
120af597481143ca4b17884360604be954a71cc34cfBrian Salomon    float fGlyphsAsPathsFontSize = -1.f;
121af597481143ca4b17884360604be954a71cc34cfBrian Salomon
122af597481143ca4b17884360604be954a71cc34cfBrian Salomon    /**
1239f545bc18a1fdff64d40104028c6d8449e660a6eBrian Salomon     * Can the glyph atlas use multiple textures. If allowed, the each texture's size is bound by
1249f545bc18a1fdff64d40104028c6d8449e660a6eBrian Salomon     * fGlypheCacheTextureMaximumBytes.
1259f545bc18a1fdff64d40104028c6d8449e660a6eBrian Salomon     */
1269f545bc18a1fdff64d40104028c6d8449e660a6eBrian Salomon    Enable fAllowMultipleGlyphCacheTextures = Enable::kDefault;
1279f545bc18a1fdff64d40104028c6d8449e660a6eBrian Salomon
1289f545bc18a1fdff64d40104028c6d8449e660a6eBrian Salomon    /**
129195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * Bugs on certain drivers cause stencil buffers to leak. This flag causes Skia to avoid
130195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * allocating stencil buffers and use alternate rasterization paths, avoiding the leak.
131fbdc080d3cae3695544ffbc05c6ff6f5b4514c02Jim Van Verth     */
132195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    bool fAvoidStencilBuffers = false;
133fbdc080d3cae3695544ffbc05c6ff6f5b4514c02Jim Van Verth
13443f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon    /**
135f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     * When specifing new data for a vertex/index buffer that replaces old data Ganesh can give
136f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     * a hint to the driver that the previous data will not be used in future draws like this:
137f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     *  glBufferData(GL_..._BUFFER, size, NULL, usage);       //<--hint, NULL means
138f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     *  glBufferSubData(GL_..._BUFFER, 0, lessThanSize, data) //   old data can't be
139f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     *                                                        //   used again.
140f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     * However, this can be an unoptimization on some platforms, esp. Chrome.
141f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     * Chrome's cmd buffer will create a new allocation and memset the whole thing
142f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     * to zero (for security reasons).
143f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     * Defaults to the value of GR_GL_USE_BUFFER_DATA_NULL_HINT #define (which is, by default, 1).
144f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips     */
145f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips    Enable fUseGLBufferDataNullHint = Enable::kDefault;
146f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips
147f2ec024c445ed17e80a5d351c797841f93ce8a7eRobert Phillips    /**
1488a83ca4e9afc9e3c08b4e8c33a74392f9b3154d7Brian Osman     * If true, texture fetches from mip-mapped textures will be biased to read larger MIP levels.
1498a83ca4e9afc9e3c08b4e8c33a74392f9b3154d7Brian Osman     * This has the effect of sharpening those textures, at the cost of some aliasing, and possible
1508a83ca4e9afc9e3c08b4e8c33a74392f9b3154d7Brian Osman     * performance impact.
1518a83ca4e9afc9e3c08b4e8c33a74392f9b3154d7Brian Osman     */
1528a83ca4e9afc9e3c08b4e8c33a74392f9b3154d7Brian Osman    bool fSharpenMipmappedTextures = false;
1538a83ca4e9afc9e3c08b4e8c33a74392f9b3154d7Brian Osman
1548a83ca4e9afc9e3c08b4e8c33a74392f9b3154d7Brian Osman    /**
15543f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon     * Enables driver workaround to use draws instead of glClear. This only applies to
15643f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon     * kOpenGL_GrBackend.
15743f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon     */
15843f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon    Enable fUseDrawInsteadOfGLClear = Enable::kDefault;
15943f8bf0f784f4182ed0fca9053ecf570caf7ad70Brian Salomon
160d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas    /**
1614150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips     * Allow Ganesh to explicitly allocate resources at flush time rather than incrementally while
1624150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips     * drawing. This will eventually just be the way it is but, for now, it is optional.
1634150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips     */
164a3f70261ccf4c14648505fed8bdc517ceb1b925eRobert Phillips    Enable fExplicitlyAllocateGPUResources = Enable::kDefault;
1654150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips
1664150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips    /**
1674150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips     * Allow Ganesh to sort the opLists prior to allocating resources. This is an optional
1684150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips     * behavior that is only relevant when 'fExplicitlyAllocateGPUResources' is enabled.
1694150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips     * Eventually this will just be what is done and will not be optional.
1704150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips     */
171a3f70261ccf4c14648505fed8bdc517ceb1b925eRobert Phillips    Enable fSortRenderTargets = Enable::kDefault;
1724150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips
1734150eea6c49ecec882a8d3e1c61d6a25fcd1e905Robert Phillips    /**
17401b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon     * Disables correctness workarounds that are enabled for particular GPUs, OSes, or drivers.
17501b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon     * This does not affect code path choices that are made for perfomance reasons nor does it
17601b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon     * override other GrContextOption settings.
17701b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon     */
17801b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon    bool fDisableDriverCorrectnessWorkarounds = false;
17901b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon
18001b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon    /**
181d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas     * Cache in which to store compiled shader binaries between runs.
182d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas     */
183d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas    PersistentCache* fPersistentCache = nullptr;
184d1b2eec0d0f95977b52669025cb25038618c0335Ethan Nicholas
185195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman#if GR_TEST_UTILS
186fbdc080d3cae3695544ffbc05c6ff6f5b4514c02Jim Van Verth    /**
187195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * Private options that are only meant for testing within Skia's tools.
188008b9d80ab9adbf2656eceaf54d11cd15e4dda05csmartdalton     */
189008b9d80ab9adbf2656eceaf54d11cd15e4dda05csmartdalton
190195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    /**
191195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * If non-zero, overrides the maximum size of a tile for sw-backed images and bitmaps rendered
192195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * by SkGpuDevice.
193195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     */
194195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    int  fMaxTileSizeOverride = 0;
1956d342285a4546b54cb17570aae7eeb8a123c81aeEric Karl
1966d342285a4546b54cb17570aae7eeb8a123c81aeEric Karl    /**
197195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * Prevents use of dual source blending, to test that all xfer modes work correctly without it.
1986d342285a4546b54cb17570aae7eeb8a123c81aeEric Karl     */
199195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    bool fSuppressDualSourceBlending = false;
2005c77975e4c00e18e644c72b56f369858acd11b15Eric Karl
2015c77975e4c00e18e644c72b56f369858acd11b15Eric Karl    /**
202195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * If true, the caps will never report driver support for path rendering.
2035c77975e4c00e18e644c72b56f369858acd11b15Eric Karl     */
204195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    bool fSuppressPathRendering = false;
205682c269a1511200322916af83053e26004c0ec40bsalomon
206195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    /**
207040238bded7b932b916c84912cbaec1207aa29c0Chris Dalton     * If true, the caps will never support geometry shaders.
208040238bded7b932b916c84912cbaec1207aa29c0Chris Dalton     */
209040238bded7b932b916c84912cbaec1207aa29c0Chris Dalton    bool fSuppressGeometryShaders = false;
210040238bded7b932b916c84912cbaec1207aa29c0Chris Dalton
211040238bded7b932b916c84912cbaec1207aa29c0Chris Dalton    /**
212195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * Render everything in wireframe
213195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     */
214195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    bool fWireframeMode = false;
215195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman
216195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    /**
217195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     * Include or exclude specific GPU path renderers.
218195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman     */
219195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman    GpuPathRenderers fGpuPathRenderers = GpuPathRenderers::kDefault;
2200b4d8aa108f2fd14f1ee4de1affacab166d7a357Brian Salomon
2210b4d8aa108f2fd14f1ee4de1affacab166d7a357Brian Salomon    /**
2220b4d8aa108f2fd14f1ee4de1affacab166d7a357Brian Salomon     * Disables using multiple texture units to batch multiple images into a single draw on
2230b4d8aa108f2fd14f1ee4de1affacab166d7a357Brian Salomon     * supported GPUs.
2240b4d8aa108f2fd14f1ee4de1affacab166d7a357Brian Salomon     */
2250b4d8aa108f2fd14f1ee4de1affacab166d7a357Brian Salomon    bool fDisableImageMultitexturing = false;
226195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman#endif
227b5086961f335d6757a88ce7507c445485aaba2e6Brian Salomon
228b5086961f335d6757a88ce7507c445485aaba2e6Brian Salomon#if SK_SUPPORT_ATLAS_TEXT
229b5086961f335d6757a88ce7507c445485aaba2e6Brian Salomon    /**
230b5086961f335d6757a88ce7507c445485aaba2e6Brian Salomon     * Controls whether distance field glyph vertices always have 3 components even when the view
231b5086961f335d6757a88ce7507c445485aaba2e6Brian Salomon     * matrix does not have perspective.
232b5086961f335d6757a88ce7507c445485aaba2e6Brian Salomon     */
233b5086961f335d6757a88ce7507c445485aaba2e6Brian Salomon    Enable fDistanceFieldGlyphVerticesAlwaysHaveW = Enable::kDefault;
234b5086961f335d6757a88ce7507c445485aaba2e6Brian Salomon#endif
235195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman};
236008b9d80ab9adbf2656eceaf54d11cd15e4dda05csmartdalton
237682c269a1511200322916af83053e26004c0ec40bsalomon#endif
238