blob: 60d0c705437f01690a77294fd217191522550edf [file] [log] [blame]
bsalomon@google.comc26d94f2013-03-25 18:19:00 +00001
2/*
3 * Copyright 2013 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
bsalomon4b91f762015-05-19 09:29:46 -07008#ifndef GrCaps_DEFINED
9#define GrCaps_DEFINED
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000010
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +000011#include "GrTypes.h"
bsalomon17168df2014-12-09 09:00:49 -080012#include "GrTypesPriv.h"
cdalton1dd05422015-06-12 09:01:18 -070013#include "GrBlend.h"
bsalomon17168df2014-12-09 09:00:49 -080014#include "GrShaderVar.h"
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +000015#include "SkRefCnt.h"
16#include "SkString.h"
17
bsalomon682c2692015-05-22 14:01:46 -070018struct GrContextOptions;
19
jvanverthe9c0fc62015-04-29 11:18:05 -070020class GrShaderCaps : public SkRefCnt {
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000021public:
bsalomon17168df2014-12-09 09:00:49 -080022 /** Info about shader variable precision within a given shader stage. That is, this info
bsalomonc0bd6482014-12-09 10:04:14 -080023 is relevant to a float (or vecNf) variable declared with a GrSLPrecision
bsalomon17168df2014-12-09 09:00:49 -080024 in a given GrShaderType. The info here is hoisted from the OpenGL spec. */
25 struct PrecisionInfo {
26 PrecisionInfo() {
27 fLogRangeLow = 0;
28 fLogRangeHigh = 0;
29 fBits = 0;
30 }
31
32 /** Is this precision level allowed in the shader stage? */
33 bool supported() const { return 0 != fBits; }
34
35 bool operator==(const PrecisionInfo& that) const {
36 return fLogRangeLow == that.fLogRangeLow && fLogRangeHigh == that.fLogRangeHigh &&
37 fBits == that.fBits;
38 }
39 bool operator!=(const PrecisionInfo& that) const { return !(*this == that); }
40
41 /** floor(log2(|min_value|)) */
42 int fLogRangeLow;
43 /** floor(log2(|max_value|)) */
44 int fLogRangeHigh;
jvanverthe9c0fc62015-04-29 11:18:05 -070045 /** Number of bits of precision. As defined in OpenGL (with names modified to reflect this
bsalomon17168df2014-12-09 09:00:49 -080046 struct) :
47 """
jvanverthe9c0fc62015-04-29 11:18:05 -070048 If the smallest representable value greater than 1 is 1 + e, then fBits will
49 contain floor(log2(e)), and every value in the range [2^fLogRangeLow,
50 2^fLogRangeHigh] can be represented to at least one part in 2^fBits.
51 """
bsalomon17168df2014-12-09 09:00:49 -080052 */
53 int fBits;
54 };
55
bsalomon424cc262015-05-22 10:37:30 -070056 GrShaderCaps();
jvanverthe9c0fc62015-04-29 11:18:05 -070057
jvanverthe9c0fc62015-04-29 11:18:05 -070058 virtual SkString dump() const;
59
60 bool shaderDerivativeSupport() const { return fShaderDerivativeSupport; }
61 bool geometryShaderSupport() const { return fGeometryShaderSupport; }
62 bool pathRenderingSupport() const { return fPathRenderingSupport; }
63 bool dstReadInShaderSupport() const { return fDstReadInShaderSupport; }
64 bool dualSourceBlendingSupport() const { return fDualSourceBlendingSupport; }
cdalton793dc262016-02-08 10:11:47 -080065 bool integerSupport() const { return fIntegerSupport; }
cdaltonf8a6ce82016-04-11 13:02:05 -070066 bool texelBufferSupport() const { return fTexelBufferSupport; }
Brian Salomonf26f7a02016-11-15 14:05:01 -050067 int imageLoadStoreSupport() const { return fImageLoadStoreSupport; }
jvanverthe9c0fc62015-04-29 11:18:05 -070068
69 /**
70 * Get the precision info for a variable of type kFloat_GrSLType, kVec2f_GrSLType, etc in a
71 * given shader type. If the shader type is not supported or the precision level is not
72 * supported in that shader type then the returned struct will report false when supported() is
73 * called.
74 */
75 const PrecisionInfo& getFloatShaderPrecisionInfo(GrShaderType shaderType,
robertphillips2eb10092015-12-11 04:59:36 -080076 GrSLPrecision precision) const {
jvanverthe9c0fc62015-04-29 11:18:05 -070077 return fFloatPrecisions[shaderType][precision];
Mike Kleinfc6c37b2016-09-27 09:34:10 -040078 }
jvanverthe9c0fc62015-04-29 11:18:05 -070079
80 /**
81 * Is there any difference between the float shader variable precision types? If this is true
82 * then unless the shader type is not supported, any call to getFloatShaderPrecisionInfo() would
83 * report the same info for all precisions in all shader types.
84 */
85 bool floatPrecisionVaries() const { return fShaderPrecisionVaries; }
86
ethannicholas22793252016-01-30 09:59:10 -080087 /**
Mike Kleinfc6c37b2016-09-27 09:34:10 -040088 * PLS storage size in bytes (0 when not supported). The PLS spec defines a minimum size of 16
ethannicholas22793252016-01-30 09:59:10 -080089 * bytes whenever PLS is supported.
90 */
91 int pixelLocalStorageSize() const { return fPixelLocalStorageSize; }
92
93 /**
94 * True if this context supports the necessary extensions and features to enable the PLS path
95 * renderer.
96 */
Mike Kleinfc6c37b2016-09-27 09:34:10 -040097 bool plsPathRenderingSupport() const {
ethannicholas22793252016-01-30 09:59:10 -080098#if GR_ENABLE_PLS_PATH_RENDERING
99 return fPLSPathRenderingSupport;
100#else
101 return false;
102#endif
103 }
104
jvanverthe9c0fc62015-04-29 11:18:05 -0700105protected:
cdalton4cd67132015-06-10 19:23:46 -0700106 /** Subclasses must call this after initialization in order to apply caps overrides requested by
107 the client. Note that overrides will only reduce the caps never expand them. */
bsalomon4ee6bd82015-05-27 13:23:23 -0700108 void applyOptionsOverrides(const GrContextOptions& options);
109
Brian Salomonf26f7a02016-11-15 14:05:01 -0500110 bool fShaderDerivativeSupport : 1;
111 bool fGeometryShaderSupport : 1;
112 bool fPathRenderingSupport : 1;
113 bool fDstReadInShaderSupport : 1;
jvanverthe9c0fc62015-04-29 11:18:05 -0700114 bool fDualSourceBlendingSupport : 1;
Brian Salomonf26f7a02016-11-15 14:05:01 -0500115 bool fIntegerSupport : 1;
116 bool fTexelBufferSupport : 1;
117 bool fImageLoadStoreSupport : 1;
118 bool fPLSPathRenderingSupport : 1;
119 bool fShaderPrecisionVaries : 1;
jvanverthe9c0fc62015-04-29 11:18:05 -0700120 PrecisionInfo fFloatPrecisions[kGrShaderTypeCount][kGrSLPrecisionCount];
ethannicholas22793252016-01-30 09:59:10 -0800121 int fPixelLocalStorageSize;
jvanverthe9c0fc62015-04-29 11:18:05 -0700122
123private:
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400124 virtual void onApplyOptionsOverrides(const GrContextOptions&) {}
jvanverthe9c0fc62015-04-29 11:18:05 -0700125 typedef SkRefCnt INHERITED;
126};
127
128/**
bsalomon4b91f762015-05-19 09:29:46 -0700129 * Represents the capabilities of a GrContext.
jvanverthe9c0fc62015-04-29 11:18:05 -0700130 */
bsalomon4b91f762015-05-19 09:29:46 -0700131class GrCaps : public SkRefCnt {
jvanverthe9c0fc62015-04-29 11:18:05 -0700132public:
bsalomon682c2692015-05-22 14:01:46 -0700133 GrCaps(const GrContextOptions&);
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000134
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +0000135 virtual SkString dump() const;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000136
bungeman6bd52842016-10-27 09:30:08 -0700137 GrShaderCaps* shaderCaps() const { return fShaderCaps.get(); }
jvanverthe9c0fc62015-04-29 11:18:05 -0700138
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000139 bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
commit-bot@chromium.org47442312013-12-19 16:18:01 +0000140 /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
141 only for POT textures) */
142 bool mipMapSupport() const { return fMipMapSupport; }
brianosman64d094d2016-03-25 06:01:59 -0700143
144 /**
145 * Skia convention is that a device only has sRGB support if it supports sRGB formats for both
146 * textures and framebuffers. In addition:
147 * Decoding to linear of an sRGB texture can be disabled.
brianosman64d094d2016-03-25 06:01:59 -0700148 */
brianosmana6359362016-03-21 06:55:37 -0700149 bool srgbSupport() const { return fSRGBSupport; }
brianosman35b784d2016-05-05 11:52:53 -0700150 /**
151 * Is there support for enabling/disabling sRGB writes for sRGB-capable color buffers?
152 */
153 bool srgbWriteControl() const { return fSRGBWriteControl; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000154 bool twoSidedStencilSupport() const { return fTwoSidedStencilSupport; }
155 bool stencilWrapOpsSupport() const { return fStencilWrapOpsSupport; }
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000156 bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; }
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000157 bool gpuTracingSupport() const { return fGpuTracingSupport; }
krajcevski786978162014-07-30 11:25:44 -0700158 bool compressedTexSubImageSupport() const { return fCompressedTexSubImageSupport; }
bsalomond08ea5f2015-02-20 06:58:13 -0800159 bool oversizedStencilSupport() const { return fOversizedStencilSupport; }
cdaltonfd4167d2015-04-21 11:45:56 -0700160 bool textureBarrierSupport() const { return fTextureBarrierSupport; }
cdaltoneb79eea2016-02-26 10:39:34 -0800161 bool sampleLocationsSupport() const { return fSampleLocationsSupport; }
csmartdalton2b5f2cb2016-06-10 14:06:32 -0700162 bool multisampleDisableSupport() const { return fMultisampleDisableSupport; }
egdanieleed519e2016-01-15 11:36:18 -0800163 bool usesMixedSamples() const { return fUsesMixedSamples; }
csmartdalton485a1202016-07-13 10:16:32 -0700164 bool preferClientSideDynamicBuffers() const { return fPreferClientSideDynamicBuffers; }
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000165
bsalomon63b21962014-11-05 07:05:34 -0800166 bool useDrawInsteadOfClear() const { return fUseDrawInsteadOfClear; }
joshualitt83bc2292015-06-18 14:18:02 -0700167 bool useDrawInsteadOfPartialRenderTargetWrite() const {
168 return fUseDrawInsteadOfPartialRenderTargetWrite;
169 }
bsalomon63b21962014-11-05 07:05:34 -0800170
bsalomonbabafcc2016-02-16 11:36:47 -0800171 bool useDrawInsteadOfAllRenderTargetWrites() const {
172 return fUseDrawInsteadOfAllRenderTargetWrites;
173 }
174
robertphillips63926682015-08-20 09:39:02 -0700175 bool preferVRAMUseOverFlushes() const { return fPreferVRAMUseOverFlushes; }
176
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000177 /**
csmartdaltone0d36292016-07-29 08:14:20 -0700178 * Indicates the level of support for gr_instanced::* functionality. A higher level includes
179 * all functionality from the levels below it.
180 */
181 enum class InstancedSupport {
182 kNone,
183 kBasic,
184 kMultisampled,
185 kMixedSampled
186 };
187
188 InstancedSupport instancedSupport() const { return fInstancedSupport; }
189
190 bool avoidInstancedDrawsToFPTargets() const { return fAvoidInstancedDrawsToFPTargets; }
191
192 /**
cdalton8917d622015-05-06 13:40:21 -0700193 * Indicates the capabilities of the fixed function blend unit.
194 */
195 enum BlendEquationSupport {
196 kBasic_BlendEquationSupport, //<! Support to select the operator that
197 // combines src and dst terms.
198 kAdvanced_BlendEquationSupport, //<! Additional fixed function support for specific
199 // SVG/PDF blend modes. Requires blend barriers.
200 kAdvancedCoherent_BlendEquationSupport, //<! Advanced blend equation support that does not
201 // require blend barriers, and permits overlap.
202
203 kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
204 };
205
206 BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
207
208 bool advancedBlendEquationSupport() const {
209 return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
210 }
211
212 bool advancedCoherentBlendEquationSupport() const {
213 return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
214 }
215
cdalton1dd05422015-06-12 09:01:18 -0700216 bool canUseAdvancedBlendEquation(GrBlendEquation equation) const {
217 SkASSERT(GrBlendEquationIsAdvanced(equation));
218 return SkToBool(fAdvBlendEqBlacklist & (1 << equation));
219 }
220
cdalton8917d622015-05-06 13:40:21 -0700221 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000222 * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
223 * textures allows partial mappings or full mappings.
224 */
225 enum MapFlags {
226 kNone_MapFlags = 0x0, //<! Cannot map the resource.
227
228 kCanMap_MapFlag = 0x1, //<! The resource can be mapped. Must be set for any of
229 // the other flags to have meaning.k
230 kSubset_MapFlag = 0x2, //<! The resource can be partially mapped.
231 };
232
233 uint32_t mapBufferFlags() const { return fMapBufferFlags; }
234
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000235 // Scratch textures not being reused means that those scratch textures
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000236 // that we upload to (i.e., don't have a render target) will not be
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000237 // recycled in the texture cache. This is to prevent ghosting by drivers
238 // (in particular for deferred architectures).
commit-bot@chromium.orgb8356522013-07-18 22:26:39 +0000239 bool reuseScratchTextures() const { return fReuseScratchTextures; }
robertphillips1b8e1b52015-06-24 06:54:10 -0700240 bool reuseScratchBuffers() const { return fReuseScratchBuffers; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000241
bsalomon7dbd45d2016-03-23 10:40:53 -0700242 /// maximum number of attribute values per vertex
243 int maxVertexAttributes() const { return fMaxVertexAttributes; }
244
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000245 int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
246 int maxTextureSize() const { return fMaxTextureSize; }
bsalomon8c07b7a2015-11-02 11:36:52 -0800247 /** This is the maximum tile size to use by GPU devices for rendering sw-backed images/bitmaps.
248 It is usually the max texture size, unless we're overriding it for testing. */
249 int maxTileSize() const { SkASSERT(fMaxTileSize <= fMaxTextureSize); return fMaxTileSize; }
bsalomonc59a1df2015-06-01 07:13:42 -0700250
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000251 // Will be 0 if MSAA is not supported
egdanieleed519e2016-01-15 11:36:18 -0800252 int maxColorSampleCount() const { return fMaxColorSampleCount; }
253 // Will be 0 if MSAA is not supported
254 int maxStencilSampleCount() const { return fMaxStencilSampleCount; }
cdaltonaf8bc7d2016-02-05 09:35:20 -0800255 // Will be 0 if raster multisample is not supported. Raster multisample is a special HW mode
256 // where the rasterizer runs with more samples than are in the target framebuffer.
257 int maxRasterSamples() const { return fMaxRasterSamples; }
egdanieleed519e2016-01-15 11:36:18 -0800258 // We require the sample count to be less than maxColorSampleCount and maxStencilSampleCount.
259 // If we are using mixed samples, we only care about stencil.
260 int maxSampleCount() const {
261 if (this->usesMixedSamples()) {
262 return this->maxStencilSampleCount();
263 } else {
264 return SkTMin(this->maxColorSampleCount(), this->maxStencilSampleCount());
265 }
266 }
267
csmartdalton9bc11872016-08-09 12:42:47 -0700268 int maxWindowRectangles() const { return fMaxWindowRectangles; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000269
bsalomon41e4384e2016-01-08 09:12:44 -0800270 virtual bool isConfigTexturable(GrPixelConfig config) const = 0;
271 virtual bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const = 0;
Brian Salomonf9f45122016-11-29 11:59:17 -0500272 virtual bool canConfigBeImageStorage(GrPixelConfig config) const = 0;
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000273
robertphillipscaef3452015-11-11 13:18:11 -0800274 bool suppressPrints() const { return fSuppressPrints; }
275
276 bool immediateFlush() const { return fImmediateFlush; }
bsalomon682c2692015-05-22 14:01:46 -0700277
cdalton397536c2016-03-25 12:15:03 -0700278 size_t bufferMapThreshold() const {
279 SkASSERT(fBufferMapThreshold >= 0);
280 return fBufferMapThreshold;
joshualitt7224c862015-05-29 06:46:47 -0700281 }
bsalomon682c2692015-05-22 14:01:46 -0700282
egdaniel51c8d402015-08-06 10:54:13 -0700283 bool fullClearIsFree() const { return fFullClearIsFree; }
284
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400285 /** True in environments that will issue errors if memory uploaded to buffers
bsalomon7dea7b72015-08-19 08:26:51 -0700286 is not initialized (even if not read by draw calls). */
287 bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; }
288
ethannicholas28ef4452016-03-25 09:26:03 -0700289 bool sampleShadingSupport() const { return fSampleShadingSupport; }
290
jvanverth84741b32016-09-30 08:39:02 -0700291 bool fenceSyncSupport() const { return fFenceSyncSupport; }
292
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000293protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700294 /** Subclasses must call this at the end of their constructors in order to apply caps
295 overrides requested by the client. Note that overrides will only reduce the caps never
296 expand them. */
297 void applyOptionsOverrides(const GrContextOptions& options);
298
bungeman6bd52842016-10-27 09:30:08 -0700299 sk_sp<GrShaderCaps> fShaderCaps;
jvanverthe9c0fc62015-04-29 11:18:05 -0700300
joshualitt83bc2292015-06-18 14:18:02 -0700301 bool fNPOTTextureTileSupport : 1;
302 bool fMipMapSupport : 1;
brianosmana6359362016-03-21 06:55:37 -0700303 bool fSRGBSupport : 1;
brianosman35b784d2016-05-05 11:52:53 -0700304 bool fSRGBWriteControl : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700305 bool fTwoSidedStencilSupport : 1;
306 bool fStencilWrapOpsSupport : 1;
307 bool fDiscardRenderTargetSupport : 1;
308 bool fReuseScratchTextures : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700309 bool fReuseScratchBuffers : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700310 bool fGpuTracingSupport : 1;
311 bool fCompressedTexSubImageSupport : 1;
312 bool fOversizedStencilSupport : 1;
313 bool fTextureBarrierSupport : 1;
cdaltoneb79eea2016-02-26 10:39:34 -0800314 bool fSampleLocationsSupport : 1;
csmartdalton2b5f2cb2016-06-10 14:06:32 -0700315 bool fMultisampleDisableSupport : 1;
egdanieleed519e2016-01-15 11:36:18 -0800316 bool fUsesMixedSamples : 1;
csmartdalton485a1202016-07-13 10:16:32 -0700317 bool fPreferClientSideDynamicBuffers : 1;
egdaniel51c8d402015-08-06 10:54:13 -0700318 bool fFullClearIsFree : 1;
bsalomon7dea7b72015-08-19 08:26:51 -0700319 bool fMustClearUploadedBufferData : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700320
bsalomon63b21962014-11-05 07:05:34 -0800321 // Driver workaround
joshualitt83bc2292015-06-18 14:18:02 -0700322 bool fUseDrawInsteadOfClear : 1;
323 bool fUseDrawInsteadOfPartialRenderTargetWrite : 1;
bsalomonbabafcc2016-02-16 11:36:47 -0800324 bool fUseDrawInsteadOfAllRenderTargetWrites : 1;
csmartdaltone0d36292016-07-29 08:14:20 -0700325 bool fAvoidInstancedDrawsToFPTargets : 1;
bsalomon63b21962014-11-05 07:05:34 -0800326
robertphillips63926682015-08-20 09:39:02 -0700327 // ANGLE workaround
328 bool fPreferVRAMUseOverFlushes : 1;
329
ethannicholas28ef4452016-03-25 09:26:03 -0700330 bool fSampleShadingSupport : 1;
jvanverth84741b32016-09-30 08:39:02 -0700331 // TODO: this may need to be an enum to support different fence types
332 bool fFenceSyncSupport : 1;
ethannicholas28ef4452016-03-25 09:26:03 -0700333
csmartdaltone0d36292016-07-29 08:14:20 -0700334 InstancedSupport fInstancedSupport;
335
cdalton8917d622015-05-06 13:40:21 -0700336 BlendEquationSupport fBlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -0700337 uint32_t fAdvBlendEqBlacklist;
338 GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
339
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000340 uint32_t fMapBufferFlags;
cdalton397536c2016-03-25 12:15:03 -0700341 int fBufferMapThreshold;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000342
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000343 int fMaxRenderTargetSize;
bsalomon7dbd45d2016-03-23 10:40:53 -0700344 int fMaxVertexAttributes;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000345 int fMaxTextureSize;
bsalomon8c07b7a2015-11-02 11:36:52 -0800346 int fMaxTileSize;
egdanieleed519e2016-01-15 11:36:18 -0800347 int fMaxColorSampleCount;
348 int fMaxStencilSampleCount;
cdaltonaf8bc7d2016-02-05 09:35:20 -0800349 int fMaxRasterSamples;
csmartdalton9bc11872016-08-09 12:42:47 -0700350 int fMaxWindowRectangles;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000351
egdanielbc127a32014-09-19 12:07:43 -0700352private:
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400353 virtual void onApplyOptionsOverrides(const GrContextOptions&) {}
egdanielb7e7d572015-11-04 04:23:53 -0800354
robertphillipscaef3452015-11-11 13:18:11 -0800355 bool fSuppressPrints : 1;
356 bool fImmediateFlush: 1;
bsalomon682c2692015-05-22 14:01:46 -0700357
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000358 typedef SkRefCnt INHERITED;
359};
360
361#endif