blob: d698a4142c2b5f783d1753e8678f18b96615b7de [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; }
jvanverthe9c0fc62015-04-29 11:18:05 -070066
67 /**
68 * Get the precision info for a variable of type kFloat_GrSLType, kVec2f_GrSLType, etc in a
69 * given shader type. If the shader type is not supported or the precision level is not
70 * supported in that shader type then the returned struct will report false when supported() is
71 * called.
72 */
73 const PrecisionInfo& getFloatShaderPrecisionInfo(GrShaderType shaderType,
robertphillips2eb10092015-12-11 04:59:36 -080074 GrSLPrecision precision) const {
jvanverthe9c0fc62015-04-29 11:18:05 -070075 return fFloatPrecisions[shaderType][precision];
76 };
77
78 /**
79 * Is there any difference between the float shader variable precision types? If this is true
80 * then unless the shader type is not supported, any call to getFloatShaderPrecisionInfo() would
81 * report the same info for all precisions in all shader types.
82 */
83 bool floatPrecisionVaries() const { return fShaderPrecisionVaries; }
84
ethannicholas22793252016-01-30 09:59:10 -080085 /**
86 * PLS storage size in bytes (0 when not supported). The PLS spec defines a minimum size of 16
87 * bytes whenever PLS is supported.
88 */
89 int pixelLocalStorageSize() const { return fPixelLocalStorageSize; }
90
91 /**
92 * True if this context supports the necessary extensions and features to enable the PLS path
93 * renderer.
94 */
95 bool plsPathRenderingSupport() const {
96#if GR_ENABLE_PLS_PATH_RENDERING
97 return fPLSPathRenderingSupport;
98#else
99 return false;
100#endif
101 }
102
jvanverthe9c0fc62015-04-29 11:18:05 -0700103protected:
cdalton4cd67132015-06-10 19:23:46 -0700104 /** Subclasses must call this after initialization in order to apply caps overrides requested by
105 the client. Note that overrides will only reduce the caps never expand them. */
bsalomon4ee6bd82015-05-27 13:23:23 -0700106 void applyOptionsOverrides(const GrContextOptions& options);
107
jvanverthe9c0fc62015-04-29 11:18:05 -0700108 bool fShaderDerivativeSupport : 1;
109 bool fGeometryShaderSupport : 1;
110 bool fPathRenderingSupport : 1;
111 bool fDstReadInShaderSupport : 1;
112 bool fDualSourceBlendingSupport : 1;
cdalton793dc262016-02-08 10:11:47 -0800113 bool fIntegerSupport : 1;
jvanverthe9c0fc62015-04-29 11:18:05 -0700114
115 bool fShaderPrecisionVaries;
116 PrecisionInfo fFloatPrecisions[kGrShaderTypeCount][kGrSLPrecisionCount];
ethannicholas22793252016-01-30 09:59:10 -0800117 int fPixelLocalStorageSize;
118 bool fPLSPathRenderingSupport;
jvanverthe9c0fc62015-04-29 11:18:05 -0700119
120private:
egdanielb7e7d572015-11-04 04:23:53 -0800121 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
jvanverthe9c0fc62015-04-29 11:18:05 -0700122 typedef SkRefCnt INHERITED;
123};
124
125/**
bsalomon4b91f762015-05-19 09:29:46 -0700126 * Represents the capabilities of a GrContext.
jvanverthe9c0fc62015-04-29 11:18:05 -0700127 */
bsalomon4b91f762015-05-19 09:29:46 -0700128class GrCaps : public SkRefCnt {
jvanverthe9c0fc62015-04-29 11:18:05 -0700129public:
bsalomon682c2692015-05-22 14:01:46 -0700130 GrCaps(const GrContextOptions&);
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000131
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +0000132 virtual SkString dump() const;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000133
jvanverthe9c0fc62015-04-29 11:18:05 -0700134 GrShaderCaps* shaderCaps() const { return fShaderCaps; }
135
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000136 bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
commit-bot@chromium.org47442312013-12-19 16:18:01 +0000137 /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
138 only for POT textures) */
139 bool mipMapSupport() const { return fMipMapSupport; }
brianosman64d094d2016-03-25 06:01:59 -0700140
141 /**
142 * Skia convention is that a device only has sRGB support if it supports sRGB formats for both
143 * textures and framebuffers. In addition:
144 * Decoding to linear of an sRGB texture can be disabled.
145 * Encoding and gamma-correct blending to an sRGB framebuffer can be disabled.
146 */
brianosmana6359362016-03-21 06:55:37 -0700147 bool srgbSupport() const { return fSRGBSupport; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000148 bool twoSidedStencilSupport() const { return fTwoSidedStencilSupport; }
149 bool stencilWrapOpsSupport() const { return fStencilWrapOpsSupport; }
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000150 bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; }
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000151 bool gpuTracingSupport() const { return fGpuTracingSupport; }
krajcevski786978162014-07-30 11:25:44 -0700152 bool compressedTexSubImageSupport() const { return fCompressedTexSubImageSupport; }
bsalomond08ea5f2015-02-20 06:58:13 -0800153 bool oversizedStencilSupport() const { return fOversizedStencilSupport; }
cdaltonfd4167d2015-04-21 11:45:56 -0700154 bool textureBarrierSupport() const { return fTextureBarrierSupport; }
cdaltoneb79eea2016-02-26 10:39:34 -0800155 bool sampleLocationsSupport() const { return fSampleLocationsSupport; }
egdanieleed519e2016-01-15 11:36:18 -0800156 bool usesMixedSamples() const { return fUsesMixedSamples; }
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000157
bsalomon63b21962014-11-05 07:05:34 -0800158 bool useDrawInsteadOfClear() const { return fUseDrawInsteadOfClear; }
joshualitt83bc2292015-06-18 14:18:02 -0700159 bool useDrawInsteadOfPartialRenderTargetWrite() const {
160 return fUseDrawInsteadOfPartialRenderTargetWrite;
161 }
bsalomon63b21962014-11-05 07:05:34 -0800162
bsalomonbabafcc2016-02-16 11:36:47 -0800163 bool useDrawInsteadOfAllRenderTargetWrites() const {
164 return fUseDrawInsteadOfAllRenderTargetWrites;
165 }
166
robertphillips63926682015-08-20 09:39:02 -0700167 bool preferVRAMUseOverFlushes() const { return fPreferVRAMUseOverFlushes; }
168
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000169 /**
cdalton8917d622015-05-06 13:40:21 -0700170 * Indicates the capabilities of the fixed function blend unit.
171 */
172 enum BlendEquationSupport {
173 kBasic_BlendEquationSupport, //<! Support to select the operator that
174 // combines src and dst terms.
175 kAdvanced_BlendEquationSupport, //<! Additional fixed function support for specific
176 // SVG/PDF blend modes. Requires blend barriers.
177 kAdvancedCoherent_BlendEquationSupport, //<! Advanced blend equation support that does not
178 // require blend barriers, and permits overlap.
179
180 kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
181 };
182
183 BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
184
185 bool advancedBlendEquationSupport() const {
186 return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
187 }
188
189 bool advancedCoherentBlendEquationSupport() const {
190 return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
191 }
192
cdalton1dd05422015-06-12 09:01:18 -0700193 bool canUseAdvancedBlendEquation(GrBlendEquation equation) const {
194 SkASSERT(GrBlendEquationIsAdvanced(equation));
195 return SkToBool(fAdvBlendEqBlacklist & (1 << equation));
196 }
197
cdalton8917d622015-05-06 13:40:21 -0700198 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000199 * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
200 * textures allows partial mappings or full mappings.
201 */
202 enum MapFlags {
203 kNone_MapFlags = 0x0, //<! Cannot map the resource.
204
205 kCanMap_MapFlag = 0x1, //<! The resource can be mapped. Must be set for any of
206 // the other flags to have meaning.k
207 kSubset_MapFlag = 0x2, //<! The resource can be partially mapped.
208 };
209
210 uint32_t mapBufferFlags() const { return fMapBufferFlags; }
211
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000212 // Scratch textures not being reused means that those scratch textures
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000213 // that we upload to (i.e., don't have a render target) will not be
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000214 // recycled in the texture cache. This is to prevent ghosting by drivers
215 // (in particular for deferred architectures).
commit-bot@chromium.orgb8356522013-07-18 22:26:39 +0000216 bool reuseScratchTextures() const { return fReuseScratchTextures; }
robertphillips1b8e1b52015-06-24 06:54:10 -0700217 bool reuseScratchBuffers() const { return fReuseScratchBuffers; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000218
bsalomon7dbd45d2016-03-23 10:40:53 -0700219 /// maximum number of attribute values per vertex
220 int maxVertexAttributes() const { return fMaxVertexAttributes; }
221
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000222 int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
223 int maxTextureSize() const { return fMaxTextureSize; }
bsalomon8c07b7a2015-11-02 11:36:52 -0800224 /** This is the maximum tile size to use by GPU devices for rendering sw-backed images/bitmaps.
225 It is usually the max texture size, unless we're overriding it for testing. */
226 int maxTileSize() const { SkASSERT(fMaxTileSize <= fMaxTextureSize); return fMaxTileSize; }
bsalomonc59a1df2015-06-01 07:13:42 -0700227
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000228 // Will be 0 if MSAA is not supported
egdanieleed519e2016-01-15 11:36:18 -0800229 int maxColorSampleCount() const { return fMaxColorSampleCount; }
230 // Will be 0 if MSAA is not supported
231 int maxStencilSampleCount() const { return fMaxStencilSampleCount; }
cdaltonaf8bc7d2016-02-05 09:35:20 -0800232 // Will be 0 if raster multisample is not supported. Raster multisample is a special HW mode
233 // where the rasterizer runs with more samples than are in the target framebuffer.
234 int maxRasterSamples() const { return fMaxRasterSamples; }
egdanieleed519e2016-01-15 11:36:18 -0800235 // We require the sample count to be less than maxColorSampleCount and maxStencilSampleCount.
236 // If we are using mixed samples, we only care about stencil.
237 int maxSampleCount() const {
238 if (this->usesMixedSamples()) {
239 return this->maxStencilSampleCount();
240 } else {
241 return SkTMin(this->maxColorSampleCount(), this->maxStencilSampleCount());
242 }
243 }
244
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000245
bsalomon41e4384e2016-01-08 09:12:44 -0800246 virtual bool isConfigTexturable(GrPixelConfig config) const = 0;
247 virtual bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const = 0;
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000248
robertphillipscaef3452015-11-11 13:18:11 -0800249 bool suppressPrints() const { return fSuppressPrints; }
250
251 bool immediateFlush() const { return fImmediateFlush; }
bsalomon682c2692015-05-22 14:01:46 -0700252
253 bool drawPathMasksToCompressedTexturesSupport() const {
joshualitt7224c862015-05-29 06:46:47 -0700254 return fDrawPathMasksToCompressedTextureSupport;
255 }
256
cdalton397536c2016-03-25 12:15:03 -0700257 size_t bufferMapThreshold() const {
258 SkASSERT(fBufferMapThreshold >= 0);
259 return fBufferMapThreshold;
joshualitt7224c862015-05-29 06:46:47 -0700260 }
bsalomon682c2692015-05-22 14:01:46 -0700261
joshualitt58001552015-06-26 12:46:36 -0700262 bool supportsInstancedDraws() const {
263 return fSupportsInstancedDraws;
264 }
265
egdaniel51c8d402015-08-06 10:54:13 -0700266 bool fullClearIsFree() const { return fFullClearIsFree; }
267
bsalomon7dea7b72015-08-19 08:26:51 -0700268 /** True in environments that will issue errors if memory uploaded to buffers
269 is not initialized (even if not read by draw calls). */
270 bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; }
271
ethannicholas28ef4452016-03-25 09:26:03 -0700272 bool sampleShadingSupport() const { return fSampleShadingSupport; }
273
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000274protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700275 /** Subclasses must call this at the end of their constructors in order to apply caps
276 overrides requested by the client. Note that overrides will only reduce the caps never
277 expand them. */
278 void applyOptionsOverrides(const GrContextOptions& options);
279
jvanverthe9c0fc62015-04-29 11:18:05 -0700280 SkAutoTUnref<GrShaderCaps> fShaderCaps;
281
joshualitt83bc2292015-06-18 14:18:02 -0700282 bool fNPOTTextureTileSupport : 1;
283 bool fMipMapSupport : 1;
brianosmana6359362016-03-21 06:55:37 -0700284 bool fSRGBSupport : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700285 bool fTwoSidedStencilSupport : 1;
286 bool fStencilWrapOpsSupport : 1;
287 bool fDiscardRenderTargetSupport : 1;
288 bool fReuseScratchTextures : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700289 bool fReuseScratchBuffers : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700290 bool fGpuTracingSupport : 1;
291 bool fCompressedTexSubImageSupport : 1;
292 bool fOversizedStencilSupport : 1;
293 bool fTextureBarrierSupport : 1;
cdaltoneb79eea2016-02-26 10:39:34 -0800294 bool fSampleLocationsSupport : 1;
egdanieleed519e2016-01-15 11:36:18 -0800295 bool fUsesMixedSamples : 1;
joshualitt58001552015-06-26 12:46:36 -0700296 bool fSupportsInstancedDraws : 1;
egdaniel51c8d402015-08-06 10:54:13 -0700297 bool fFullClearIsFree : 1;
bsalomon7dea7b72015-08-19 08:26:51 -0700298 bool fMustClearUploadedBufferData : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700299
bsalomon63b21962014-11-05 07:05:34 -0800300 // Driver workaround
joshualitt83bc2292015-06-18 14:18:02 -0700301 bool fUseDrawInsteadOfClear : 1;
302 bool fUseDrawInsteadOfPartialRenderTargetWrite : 1;
bsalomonbabafcc2016-02-16 11:36:47 -0800303 bool fUseDrawInsteadOfAllRenderTargetWrites : 1;
bsalomon63b21962014-11-05 07:05:34 -0800304
robertphillips63926682015-08-20 09:39:02 -0700305 // ANGLE workaround
306 bool fPreferVRAMUseOverFlushes : 1;
307
ethannicholas28ef4452016-03-25 09:26:03 -0700308 bool fSampleShadingSupport : 1;
309
cdalton8917d622015-05-06 13:40:21 -0700310 BlendEquationSupport fBlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -0700311 uint32_t fAdvBlendEqBlacklist;
312 GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
313
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000314 uint32_t fMapBufferFlags;
cdalton397536c2016-03-25 12:15:03 -0700315 int fBufferMapThreshold;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000316
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000317 int fMaxRenderTargetSize;
bsalomon7dbd45d2016-03-23 10:40:53 -0700318 int fMaxVertexAttributes;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000319 int fMaxTextureSize;
bsalomon8c07b7a2015-11-02 11:36:52 -0800320 int fMaxTileSize;
egdanieleed519e2016-01-15 11:36:18 -0800321 int fMaxColorSampleCount;
322 int fMaxStencilSampleCount;
cdaltonaf8bc7d2016-02-05 09:35:20 -0800323 int fMaxRasterSamples;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000324
egdanielbc127a32014-09-19 12:07:43 -0700325private:
egdanielb7e7d572015-11-04 04:23:53 -0800326 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
327
robertphillipscaef3452015-11-11 13:18:11 -0800328 bool fSuppressPrints : 1;
329 bool fImmediateFlush: 1;
bsalomon682c2692015-05-22 14:01:46 -0700330 bool fDrawPathMasksToCompressedTextureSupport : 1;
331
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000332 typedef SkRefCnt INHERITED;
333};
334
335#endif