blob: 944fb1481c1e9a4dd0391d5fad104666570eb34c [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; }
65
66 /**
67 * Get the precision info for a variable of type kFloat_GrSLType, kVec2f_GrSLType, etc in a
68 * given shader type. If the shader type is not supported or the precision level is not
69 * supported in that shader type then the returned struct will report false when supported() is
70 * called.
71 */
72 const PrecisionInfo& getFloatShaderPrecisionInfo(GrShaderType shaderType,
robertphillips2eb10092015-12-11 04:59:36 -080073 GrSLPrecision precision) const {
jvanverthe9c0fc62015-04-29 11:18:05 -070074 return fFloatPrecisions[shaderType][precision];
75 };
76
77 /**
78 * Is there any difference between the float shader variable precision types? If this is true
79 * then unless the shader type is not supported, any call to getFloatShaderPrecisionInfo() would
80 * report the same info for all precisions in all shader types.
81 */
82 bool floatPrecisionVaries() const { return fShaderPrecisionVaries; }
83
ethannicholas22793252016-01-30 09:59:10 -080084 /**
85 * PLS storage size in bytes (0 when not supported). The PLS spec defines a minimum size of 16
86 * bytes whenever PLS is supported.
87 */
88 int pixelLocalStorageSize() const { return fPixelLocalStorageSize; }
89
90 /**
91 * True if this context supports the necessary extensions and features to enable the PLS path
92 * renderer.
93 */
94 bool plsPathRenderingSupport() const {
95#if GR_ENABLE_PLS_PATH_RENDERING
96 return fPLSPathRenderingSupport;
97#else
98 return false;
99#endif
100 }
101
jvanverthe9c0fc62015-04-29 11:18:05 -0700102protected:
cdalton4cd67132015-06-10 19:23:46 -0700103 /** Subclasses must call this after initialization in order to apply caps overrides requested by
104 the client. Note that overrides will only reduce the caps never expand them. */
bsalomon4ee6bd82015-05-27 13:23:23 -0700105 void applyOptionsOverrides(const GrContextOptions& options);
106
jvanverthe9c0fc62015-04-29 11:18:05 -0700107 bool fShaderDerivativeSupport : 1;
108 bool fGeometryShaderSupport : 1;
109 bool fPathRenderingSupport : 1;
110 bool fDstReadInShaderSupport : 1;
111 bool fDualSourceBlendingSupport : 1;
112
113 bool fShaderPrecisionVaries;
114 PrecisionInfo fFloatPrecisions[kGrShaderTypeCount][kGrSLPrecisionCount];
ethannicholas22793252016-01-30 09:59:10 -0800115 int fPixelLocalStorageSize;
116 bool fPLSPathRenderingSupport;
jvanverthe9c0fc62015-04-29 11:18:05 -0700117
118private:
egdanielb7e7d572015-11-04 04:23:53 -0800119 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
jvanverthe9c0fc62015-04-29 11:18:05 -0700120 typedef SkRefCnt INHERITED;
121};
122
123/**
bsalomon4b91f762015-05-19 09:29:46 -0700124 * Represents the capabilities of a GrContext.
jvanverthe9c0fc62015-04-29 11:18:05 -0700125 */
bsalomon4b91f762015-05-19 09:29:46 -0700126class GrCaps : public SkRefCnt {
jvanverthe9c0fc62015-04-29 11:18:05 -0700127public:
bsalomon682c2692015-05-22 14:01:46 -0700128 GrCaps(const GrContextOptions&);
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000129
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +0000130 virtual SkString dump() const;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000131
jvanverthe9c0fc62015-04-29 11:18:05 -0700132 GrShaderCaps* shaderCaps() const { return fShaderCaps; }
133
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000134 bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
commit-bot@chromium.org47442312013-12-19 16:18:01 +0000135 /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
136 only for POT textures) */
137 bool mipMapSupport() const { return fMipMapSupport; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000138 bool twoSidedStencilSupport() const { return fTwoSidedStencilSupport; }
139 bool stencilWrapOpsSupport() const { return fStencilWrapOpsSupport; }
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000140 bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; }
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000141 bool gpuTracingSupport() const { return fGpuTracingSupport; }
krajcevski786978162014-07-30 11:25:44 -0700142 bool compressedTexSubImageSupport() const { return fCompressedTexSubImageSupport; }
bsalomond08ea5f2015-02-20 06:58:13 -0800143 bool oversizedStencilSupport() const { return fOversizedStencilSupport; }
cdaltonfd4167d2015-04-21 11:45:56 -0700144 bool textureBarrierSupport() const { return fTextureBarrierSupport; }
egdanieleed519e2016-01-15 11:36:18 -0800145 bool usesMixedSamples() const { return fUsesMixedSamples; }
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000146
bsalomon63b21962014-11-05 07:05:34 -0800147 bool useDrawInsteadOfClear() const { return fUseDrawInsteadOfClear; }
joshualitt83bc2292015-06-18 14:18:02 -0700148 bool useDrawInsteadOfPartialRenderTargetWrite() const {
149 return fUseDrawInsteadOfPartialRenderTargetWrite;
150 }
bsalomon63b21962014-11-05 07:05:34 -0800151
robertphillips63926682015-08-20 09:39:02 -0700152 bool preferVRAMUseOverFlushes() const { return fPreferVRAMUseOverFlushes; }
153
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000154 /**
cdalton8917d622015-05-06 13:40:21 -0700155 * Indicates the capabilities of the fixed function blend unit.
156 */
157 enum BlendEquationSupport {
158 kBasic_BlendEquationSupport, //<! Support to select the operator that
159 // combines src and dst terms.
160 kAdvanced_BlendEquationSupport, //<! Additional fixed function support for specific
161 // SVG/PDF blend modes. Requires blend barriers.
162 kAdvancedCoherent_BlendEquationSupport, //<! Advanced blend equation support that does not
163 // require blend barriers, and permits overlap.
164
165 kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
166 };
167
168 BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
169
170 bool advancedBlendEquationSupport() const {
171 return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
172 }
173
174 bool advancedCoherentBlendEquationSupport() const {
175 return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
176 }
177
cdalton1dd05422015-06-12 09:01:18 -0700178 bool canUseAdvancedBlendEquation(GrBlendEquation equation) const {
179 SkASSERT(GrBlendEquationIsAdvanced(equation));
180 return SkToBool(fAdvBlendEqBlacklist & (1 << equation));
181 }
182
cdalton8917d622015-05-06 13:40:21 -0700183 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000184 * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
185 * textures allows partial mappings or full mappings.
186 */
187 enum MapFlags {
188 kNone_MapFlags = 0x0, //<! Cannot map the resource.
189
190 kCanMap_MapFlag = 0x1, //<! The resource can be mapped. Must be set for any of
191 // the other flags to have meaning.k
192 kSubset_MapFlag = 0x2, //<! The resource can be partially mapped.
193 };
194
195 uint32_t mapBufferFlags() const { return fMapBufferFlags; }
196
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000197 // Scratch textures not being reused means that those scratch textures
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000198 // that we upload to (i.e., don't have a render target) will not be
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000199 // recycled in the texture cache. This is to prevent ghosting by drivers
200 // (in particular for deferred architectures).
commit-bot@chromium.orgb8356522013-07-18 22:26:39 +0000201 bool reuseScratchTextures() const { return fReuseScratchTextures; }
robertphillips1b8e1b52015-06-24 06:54:10 -0700202 bool reuseScratchBuffers() const { return fReuseScratchBuffers; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000203
204 int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
205 int maxTextureSize() const { return fMaxTextureSize; }
bsalomon8c07b7a2015-11-02 11:36:52 -0800206 /** This is the maximum tile size to use by GPU devices for rendering sw-backed images/bitmaps.
207 It is usually the max texture size, unless we're overriding it for testing. */
208 int maxTileSize() const { SkASSERT(fMaxTileSize <= fMaxTextureSize); return fMaxTileSize; }
bsalomonc59a1df2015-06-01 07:13:42 -0700209
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000210 // Will be 0 if MSAA is not supported
egdanieleed519e2016-01-15 11:36:18 -0800211 int maxColorSampleCount() const { return fMaxColorSampleCount; }
212 // Will be 0 if MSAA is not supported
213 int maxStencilSampleCount() const { return fMaxStencilSampleCount; }
cdaltonaf8bc7d2016-02-05 09:35:20 -0800214 // Will be 0 if raster multisample is not supported. Raster multisample is a special HW mode
215 // where the rasterizer runs with more samples than are in the target framebuffer.
216 int maxRasterSamples() const { return fMaxRasterSamples; }
egdanieleed519e2016-01-15 11:36:18 -0800217 // We require the sample count to be less than maxColorSampleCount and maxStencilSampleCount.
218 // If we are using mixed samples, we only care about stencil.
219 int maxSampleCount() const {
220 if (this->usesMixedSamples()) {
221 return this->maxStencilSampleCount();
222 } else {
223 return SkTMin(this->maxColorSampleCount(), this->maxStencilSampleCount());
224 }
225 }
226
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000227
bsalomon41e4384e2016-01-08 09:12:44 -0800228 virtual bool isConfigTexturable(GrPixelConfig config) const = 0;
229 virtual bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const = 0;
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000230
robertphillipscaef3452015-11-11 13:18:11 -0800231 bool suppressPrints() const { return fSuppressPrints; }
232
233 bool immediateFlush() const { return fImmediateFlush; }
bsalomon682c2692015-05-22 14:01:46 -0700234
235 bool drawPathMasksToCompressedTexturesSupport() const {
joshualitt7224c862015-05-29 06:46:47 -0700236 return fDrawPathMasksToCompressedTextureSupport;
237 }
238
239 size_t geometryBufferMapThreshold() const {
joshualitte5b74c62015-06-01 14:17:47 -0700240 SkASSERT(fGeometryBufferMapThreshold >= 0);
joshualitt7224c862015-05-29 06:46:47 -0700241 return fGeometryBufferMapThreshold;
242 }
bsalomon682c2692015-05-22 14:01:46 -0700243
joshualitt58001552015-06-26 12:46:36 -0700244 bool supportsInstancedDraws() const {
245 return fSupportsInstancedDraws;
246 }
247
egdaniel51c8d402015-08-06 10:54:13 -0700248 bool fullClearIsFree() const { return fFullClearIsFree; }
249
bsalomon7dea7b72015-08-19 08:26:51 -0700250 /** True in environments that will issue errors if memory uploaded to buffers
251 is not initialized (even if not read by draw calls). */
252 bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; }
253
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000254protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700255 /** Subclasses must call this at the end of their constructors in order to apply caps
256 overrides requested by the client. Note that overrides will only reduce the caps never
257 expand them. */
258 void applyOptionsOverrides(const GrContextOptions& options);
259
jvanverthe9c0fc62015-04-29 11:18:05 -0700260 SkAutoTUnref<GrShaderCaps> fShaderCaps;
261
joshualitt83bc2292015-06-18 14:18:02 -0700262 bool fNPOTTextureTileSupport : 1;
263 bool fMipMapSupport : 1;
264 bool fTwoSidedStencilSupport : 1;
265 bool fStencilWrapOpsSupport : 1;
266 bool fDiscardRenderTargetSupport : 1;
267 bool fReuseScratchTextures : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700268 bool fReuseScratchBuffers : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700269 bool fGpuTracingSupport : 1;
270 bool fCompressedTexSubImageSupport : 1;
271 bool fOversizedStencilSupport : 1;
272 bool fTextureBarrierSupport : 1;
egdanieleed519e2016-01-15 11:36:18 -0800273 bool fUsesMixedSamples : 1;
joshualitt58001552015-06-26 12:46:36 -0700274 bool fSupportsInstancedDraws : 1;
egdaniel51c8d402015-08-06 10:54:13 -0700275 bool fFullClearIsFree : 1;
bsalomon7dea7b72015-08-19 08:26:51 -0700276 bool fMustClearUploadedBufferData : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700277
bsalomon63b21962014-11-05 07:05:34 -0800278 // Driver workaround
joshualitt83bc2292015-06-18 14:18:02 -0700279 bool fUseDrawInsteadOfClear : 1;
280 bool fUseDrawInsteadOfPartialRenderTargetWrite : 1;
bsalomon63b21962014-11-05 07:05:34 -0800281
robertphillips63926682015-08-20 09:39:02 -0700282 // ANGLE workaround
283 bool fPreferVRAMUseOverFlushes : 1;
284
cdalton8917d622015-05-06 13:40:21 -0700285 BlendEquationSupport fBlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -0700286 uint32_t fAdvBlendEqBlacklist;
287 GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
288
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000289 uint32_t fMapBufferFlags;
joshualitte5b74c62015-06-01 14:17:47 -0700290 int fGeometryBufferMapThreshold;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000291
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000292 int fMaxRenderTargetSize;
293 int fMaxTextureSize;
bsalomon8c07b7a2015-11-02 11:36:52 -0800294 int fMaxTileSize;
egdanieleed519e2016-01-15 11:36:18 -0800295 int fMaxColorSampleCount;
296 int fMaxStencilSampleCount;
cdaltonaf8bc7d2016-02-05 09:35:20 -0800297 int fMaxRasterSamples;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000298
egdanielbc127a32014-09-19 12:07:43 -0700299private:
egdanielb7e7d572015-11-04 04:23:53 -0800300 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
301
robertphillipscaef3452015-11-11 13:18:11 -0800302 bool fSuppressPrints : 1;
303 bool fImmediateFlush: 1;
bsalomon682c2692015-05-22 14:01:46 -0700304 bool fDrawPathMasksToCompressedTextureSupport : 1;
305
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000306 typedef SkRefCnt INHERITED;
307};
308
309#endif