blob: 2ee7a370813dc1df92deab2c9eb4cf85a2b1dcab [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; }
cdaltond4727922015-11-10 12:49:06 -080065 bool programmableSampleLocationsSupport() const { return fProgrammableSampleLocationsSupport; }
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,
74 GrSLPrecision precision) const {
75 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
85protected:
cdalton4cd67132015-06-10 19:23:46 -070086 /** Subclasses must call this after initialization in order to apply caps overrides requested by
87 the client. Note that overrides will only reduce the caps never expand them. */
bsalomon4ee6bd82015-05-27 13:23:23 -070088 void applyOptionsOverrides(const GrContextOptions& options);
89
jvanverthe9c0fc62015-04-29 11:18:05 -070090 bool fShaderDerivativeSupport : 1;
91 bool fGeometryShaderSupport : 1;
92 bool fPathRenderingSupport : 1;
93 bool fDstReadInShaderSupport : 1;
94 bool fDualSourceBlendingSupport : 1;
cdaltond4727922015-11-10 12:49:06 -080095 bool fProgrammableSampleLocationsSupport : 1;
jvanverthe9c0fc62015-04-29 11:18:05 -070096
97 bool fShaderPrecisionVaries;
98 PrecisionInfo fFloatPrecisions[kGrShaderTypeCount][kGrSLPrecisionCount];
99
100private:
egdanielb7e7d572015-11-04 04:23:53 -0800101 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
jvanverthe9c0fc62015-04-29 11:18:05 -0700102 typedef SkRefCnt INHERITED;
103};
104
105/**
bsalomon4b91f762015-05-19 09:29:46 -0700106 * Represents the capabilities of a GrContext.
jvanverthe9c0fc62015-04-29 11:18:05 -0700107 */
bsalomon4b91f762015-05-19 09:29:46 -0700108class GrCaps : public SkRefCnt {
jvanverthe9c0fc62015-04-29 11:18:05 -0700109public:
bsalomon682c2692015-05-22 14:01:46 -0700110 GrCaps(const GrContextOptions&);
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000111
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +0000112 virtual SkString dump() const;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000113
jvanverthe9c0fc62015-04-29 11:18:05 -0700114 GrShaderCaps* shaderCaps() const { return fShaderCaps; }
115
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000116 bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
commit-bot@chromium.org47442312013-12-19 16:18:01 +0000117 /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
118 only for POT textures) */
119 bool mipMapSupport() const { return fMipMapSupport; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000120 bool twoSidedStencilSupport() const { return fTwoSidedStencilSupport; }
121 bool stencilWrapOpsSupport() const { return fStencilWrapOpsSupport; }
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000122 bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; }
egdanielbdad9c32015-03-05 12:19:17 -0800123#if GR_FORCE_GPU_TRACE_DEBUGGING
124 bool gpuTracingSupport() const { return true; }
125#else
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000126 bool gpuTracingSupport() const { return fGpuTracingSupport; }
egdanielbdad9c32015-03-05 12:19:17 -0800127#endif
krajcevski786978162014-07-30 11:25:44 -0700128 bool compressedTexSubImageSupport() const { return fCompressedTexSubImageSupport; }
bsalomond08ea5f2015-02-20 06:58:13 -0800129 bool oversizedStencilSupport() const { return fOversizedStencilSupport; }
cdaltonfd4167d2015-04-21 11:45:56 -0700130 bool textureBarrierSupport() const { return fTextureBarrierSupport; }
cdalton63f6c1f2015-11-06 07:09:43 -0800131 bool mixedSamplesSupport() const { return fMixedSamplesSupport; }
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000132
bsalomon63b21962014-11-05 07:05:34 -0800133 bool useDrawInsteadOfClear() const { return fUseDrawInsteadOfClear; }
joshualitt83bc2292015-06-18 14:18:02 -0700134 bool useDrawInsteadOfPartialRenderTargetWrite() const {
135 return fUseDrawInsteadOfPartialRenderTargetWrite;
136 }
bsalomon63b21962014-11-05 07:05:34 -0800137
robertphillips63926682015-08-20 09:39:02 -0700138 bool preferVRAMUseOverFlushes() const { return fPreferVRAMUseOverFlushes; }
139
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000140 /**
cdalton8917d622015-05-06 13:40:21 -0700141 * Indicates the capabilities of the fixed function blend unit.
142 */
143 enum BlendEquationSupport {
144 kBasic_BlendEquationSupport, //<! Support to select the operator that
145 // combines src and dst terms.
146 kAdvanced_BlendEquationSupport, //<! Additional fixed function support for specific
147 // SVG/PDF blend modes. Requires blend barriers.
148 kAdvancedCoherent_BlendEquationSupport, //<! Advanced blend equation support that does not
149 // require blend barriers, and permits overlap.
150
151 kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
152 };
153
154 BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
155
156 bool advancedBlendEquationSupport() const {
157 return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
158 }
159
160 bool advancedCoherentBlendEquationSupport() const {
161 return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
162 }
163
cdalton1dd05422015-06-12 09:01:18 -0700164 bool canUseAdvancedBlendEquation(GrBlendEquation equation) const {
165 SkASSERT(GrBlendEquationIsAdvanced(equation));
166 return SkToBool(fAdvBlendEqBlacklist & (1 << equation));
167 }
168
cdalton8917d622015-05-06 13:40:21 -0700169 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000170 * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
171 * textures allows partial mappings or full mappings.
172 */
173 enum MapFlags {
174 kNone_MapFlags = 0x0, //<! Cannot map the resource.
175
176 kCanMap_MapFlag = 0x1, //<! The resource can be mapped. Must be set for any of
177 // the other flags to have meaning.k
178 kSubset_MapFlag = 0x2, //<! The resource can be partially mapped.
179 };
180
181 uint32_t mapBufferFlags() const { return fMapBufferFlags; }
182
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000183 // Scratch textures not being reused means that those scratch textures
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000184 // that we upload to (i.e., don't have a render target) will not be
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000185 // recycled in the texture cache. This is to prevent ghosting by drivers
186 // (in particular for deferred architectures).
commit-bot@chromium.orgb8356522013-07-18 22:26:39 +0000187 bool reuseScratchTextures() const { return fReuseScratchTextures; }
robertphillips1b8e1b52015-06-24 06:54:10 -0700188 bool reuseScratchBuffers() const { return fReuseScratchBuffers; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000189
190 int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
191 int maxTextureSize() const { return fMaxTextureSize; }
bsalomon8c07b7a2015-11-02 11:36:52 -0800192 /** This is the maximum tile size to use by GPU devices for rendering sw-backed images/bitmaps.
193 It is usually the max texture size, unless we're overriding it for testing. */
194 int maxTileSize() const { SkASSERT(fMaxTileSize <= fMaxTextureSize); return fMaxTileSize; }
bsalomonc59a1df2015-06-01 07:13:42 -0700195
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000196 // Will be 0 if MSAA is not supported
197 int maxSampleCount() const { return fMaxSampleCount; }
198
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000199 bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const {
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000200 SkASSERT(kGrPixelConfigCnt > config);
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000201 return fConfigRenderSupport[config][withMSAA];
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000202 }
203
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000204 bool isConfigTexturable(GrPixelConfig config) const {
205 SkASSERT(kGrPixelConfigCnt > config);
206 return fConfigTextureSupport[config];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000207 }
208
robertphillipscaef3452015-11-11 13:18:11 -0800209 bool suppressPrints() const { return fSuppressPrints; }
210
211 bool immediateFlush() const { return fImmediateFlush; }
bsalomon682c2692015-05-22 14:01:46 -0700212
213 bool drawPathMasksToCompressedTexturesSupport() const {
joshualitt7224c862015-05-29 06:46:47 -0700214 return fDrawPathMasksToCompressedTextureSupport;
215 }
216
217 size_t geometryBufferMapThreshold() const {
joshualitte5b74c62015-06-01 14:17:47 -0700218 SkASSERT(fGeometryBufferMapThreshold >= 0);
joshualitt7224c862015-05-29 06:46:47 -0700219 return fGeometryBufferMapThreshold;
220 }
bsalomon682c2692015-05-22 14:01:46 -0700221
joshualitt58001552015-06-26 12:46:36 -0700222 bool supportsInstancedDraws() const {
223 return fSupportsInstancedDraws;
224 }
225
egdaniel51c8d402015-08-06 10:54:13 -0700226 bool fullClearIsFree() const { return fFullClearIsFree; }
227
bsalomon7dea7b72015-08-19 08:26:51 -0700228 /** True in environments that will issue errors if memory uploaded to buffers
229 is not initialized (even if not read by draw calls). */
230 bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; }
231
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000232protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700233 /** Subclasses must call this at the end of their constructors in order to apply caps
234 overrides requested by the client. Note that overrides will only reduce the caps never
235 expand them. */
236 void applyOptionsOverrides(const GrContextOptions& options);
237
jvanverthe9c0fc62015-04-29 11:18:05 -0700238 SkAutoTUnref<GrShaderCaps> fShaderCaps;
239
joshualitt83bc2292015-06-18 14:18:02 -0700240 bool fNPOTTextureTileSupport : 1;
241 bool fMipMapSupport : 1;
242 bool fTwoSidedStencilSupport : 1;
243 bool fStencilWrapOpsSupport : 1;
244 bool fDiscardRenderTargetSupport : 1;
245 bool fReuseScratchTextures : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700246 bool fReuseScratchBuffers : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700247 bool fGpuTracingSupport : 1;
248 bool fCompressedTexSubImageSupport : 1;
249 bool fOversizedStencilSupport : 1;
250 bool fTextureBarrierSupport : 1;
cdalton63f6c1f2015-11-06 07:09:43 -0800251 bool fMixedSamplesSupport : 1;
joshualitt58001552015-06-26 12:46:36 -0700252 bool fSupportsInstancedDraws : 1;
egdaniel51c8d402015-08-06 10:54:13 -0700253 bool fFullClearIsFree : 1;
bsalomon7dea7b72015-08-19 08:26:51 -0700254 bool fMustClearUploadedBufferData : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700255
bsalomon63b21962014-11-05 07:05:34 -0800256 // Driver workaround
joshualitt83bc2292015-06-18 14:18:02 -0700257 bool fUseDrawInsteadOfClear : 1;
258 bool fUseDrawInsteadOfPartialRenderTargetWrite : 1;
bsalomon63b21962014-11-05 07:05:34 -0800259
robertphillips63926682015-08-20 09:39:02 -0700260 // ANGLE workaround
261 bool fPreferVRAMUseOverFlushes : 1;
262
cdalton8917d622015-05-06 13:40:21 -0700263 BlendEquationSupport fBlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -0700264 uint32_t fAdvBlendEqBlacklist;
265 GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
266
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000267 uint32_t fMapBufferFlags;
joshualitte5b74c62015-06-01 14:17:47 -0700268 int fGeometryBufferMapThreshold;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000269
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000270 int fMaxRenderTargetSize;
271 int fMaxTextureSize;
bsalomon8c07b7a2015-11-02 11:36:52 -0800272 int fMaxTileSize;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000273 int fMaxSampleCount;
274
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000275 // The first entry for each config is without msaa and the second is with.
276 bool fConfigRenderSupport[kGrPixelConfigCnt][2];
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000277 bool fConfigTextureSupport[kGrPixelConfigCnt];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000278
egdanielbc127a32014-09-19 12:07:43 -0700279private:
egdanielb7e7d572015-11-04 04:23:53 -0800280 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
281
robertphillipscaef3452015-11-11 13:18:11 -0800282 bool fSuppressPrints : 1;
283 bool fImmediateFlush: 1;
bsalomon682c2692015-05-22 14:01:46 -0700284 bool fDrawPathMasksToCompressedTextureSupport : 1;
285
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000286 typedef SkRefCnt INHERITED;
287};
288
289#endif