blob: 05da8d7cadf40d5af5eafa185b03ad761c8b7029 [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; }
214 // We require the sample count to be less than maxColorSampleCount and maxStencilSampleCount.
215 // If we are using mixed samples, we only care about stencil.
216 int maxSampleCount() const {
217 if (this->usesMixedSamples()) {
218 return this->maxStencilSampleCount();
219 } else {
220 return SkTMin(this->maxColorSampleCount(), this->maxStencilSampleCount());
221 }
222 }
223
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000224
bsalomon41e4384e2016-01-08 09:12:44 -0800225 virtual bool isConfigTexturable(GrPixelConfig config) const = 0;
226 virtual bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const = 0;
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000227
robertphillipscaef3452015-11-11 13:18:11 -0800228 bool suppressPrints() const { return fSuppressPrints; }
229
230 bool immediateFlush() const { return fImmediateFlush; }
bsalomon682c2692015-05-22 14:01:46 -0700231
232 bool drawPathMasksToCompressedTexturesSupport() const {
joshualitt7224c862015-05-29 06:46:47 -0700233 return fDrawPathMasksToCompressedTextureSupport;
234 }
235
236 size_t geometryBufferMapThreshold() const {
joshualitte5b74c62015-06-01 14:17:47 -0700237 SkASSERT(fGeometryBufferMapThreshold >= 0);
joshualitt7224c862015-05-29 06:46:47 -0700238 return fGeometryBufferMapThreshold;
239 }
bsalomon682c2692015-05-22 14:01:46 -0700240
joshualitt58001552015-06-26 12:46:36 -0700241 bool supportsInstancedDraws() const {
242 return fSupportsInstancedDraws;
243 }
244
egdaniel51c8d402015-08-06 10:54:13 -0700245 bool fullClearIsFree() const { return fFullClearIsFree; }
246
bsalomon7dea7b72015-08-19 08:26:51 -0700247 /** True in environments that will issue errors if memory uploaded to buffers
248 is not initialized (even if not read by draw calls). */
249 bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; }
250
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000251protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700252 /** Subclasses must call this at the end of their constructors in order to apply caps
253 overrides requested by the client. Note that overrides will only reduce the caps never
254 expand them. */
255 void applyOptionsOverrides(const GrContextOptions& options);
256
jvanverthe9c0fc62015-04-29 11:18:05 -0700257 SkAutoTUnref<GrShaderCaps> fShaderCaps;
258
joshualitt83bc2292015-06-18 14:18:02 -0700259 bool fNPOTTextureTileSupport : 1;
260 bool fMipMapSupport : 1;
261 bool fTwoSidedStencilSupport : 1;
262 bool fStencilWrapOpsSupport : 1;
263 bool fDiscardRenderTargetSupport : 1;
264 bool fReuseScratchTextures : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700265 bool fReuseScratchBuffers : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700266 bool fGpuTracingSupport : 1;
267 bool fCompressedTexSubImageSupport : 1;
268 bool fOversizedStencilSupport : 1;
269 bool fTextureBarrierSupport : 1;
egdanieleed519e2016-01-15 11:36:18 -0800270 bool fUsesMixedSamples : 1;
joshualitt58001552015-06-26 12:46:36 -0700271 bool fSupportsInstancedDraws : 1;
egdaniel51c8d402015-08-06 10:54:13 -0700272 bool fFullClearIsFree : 1;
bsalomon7dea7b72015-08-19 08:26:51 -0700273 bool fMustClearUploadedBufferData : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700274
bsalomon63b21962014-11-05 07:05:34 -0800275 // Driver workaround
joshualitt83bc2292015-06-18 14:18:02 -0700276 bool fUseDrawInsteadOfClear : 1;
277 bool fUseDrawInsteadOfPartialRenderTargetWrite : 1;
bsalomon63b21962014-11-05 07:05:34 -0800278
robertphillips63926682015-08-20 09:39:02 -0700279 // ANGLE workaround
280 bool fPreferVRAMUseOverFlushes : 1;
281
cdalton8917d622015-05-06 13:40:21 -0700282 BlendEquationSupport fBlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -0700283 uint32_t fAdvBlendEqBlacklist;
284 GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
285
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000286 uint32_t fMapBufferFlags;
joshualitte5b74c62015-06-01 14:17:47 -0700287 int fGeometryBufferMapThreshold;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000288
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000289 int fMaxRenderTargetSize;
290 int fMaxTextureSize;
bsalomon8c07b7a2015-11-02 11:36:52 -0800291 int fMaxTileSize;
egdanieleed519e2016-01-15 11:36:18 -0800292 int fMaxColorSampleCount;
293 int fMaxStencilSampleCount;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000294
egdanielbc127a32014-09-19 12:07:43 -0700295private:
egdanielb7e7d572015-11-04 04:23:53 -0800296 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
297
robertphillipscaef3452015-11-11 13:18:11 -0800298 bool fSuppressPrints : 1;
299 bool fImmediateFlush: 1;
bsalomon682c2692015-05-22 14:01:46 -0700300 bool fDrawPathMasksToCompressedTextureSupport : 1;
301
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000302 typedef SkRefCnt INHERITED;
303};
304
305#endif