blob: 9287556f009494ea8fbb642506962c81ef0de4ee [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; }
cdalton0edea2c2015-05-21 08:27:44 -070065 bool mixedSamplesSupport() const { return fMixedSamplesSupport; }
vbuzinov3e77ba92015-09-30 23:02:06 -070066 bool programmableSampleLocationsSupport() const { return fProgrammableSampleLocationsSupport; }
jvanverthe9c0fc62015-04-29 11:18:05 -070067
68 /**
69 * Get the precision info for a variable of type kFloat_GrSLType, kVec2f_GrSLType, etc in a
70 * given shader type. If the shader type is not supported or the precision level is not
71 * supported in that shader type then the returned struct will report false when supported() is
72 * called.
73 */
74 const PrecisionInfo& getFloatShaderPrecisionInfo(GrShaderType shaderType,
75 GrSLPrecision precision) const {
76 return fFloatPrecisions[shaderType][precision];
77 };
78
79 /**
80 * Is there any difference between the float shader variable precision types? If this is true
81 * then unless the shader type is not supported, any call to getFloatShaderPrecisionInfo() would
82 * report the same info for all precisions in all shader types.
83 */
84 bool floatPrecisionVaries() const { return fShaderPrecisionVaries; }
85
86protected:
cdalton4cd67132015-06-10 19:23:46 -070087 /** Subclasses must call this after initialization in order to apply caps overrides requested by
88 the client. Note that overrides will only reduce the caps never expand them. */
bsalomon4ee6bd82015-05-27 13:23:23 -070089 void applyOptionsOverrides(const GrContextOptions& options);
90
jvanverthe9c0fc62015-04-29 11:18:05 -070091 bool fShaderDerivativeSupport : 1;
92 bool fGeometryShaderSupport : 1;
93 bool fPathRenderingSupport : 1;
94 bool fDstReadInShaderSupport : 1;
95 bool fDualSourceBlendingSupport : 1;
cdalton0edea2c2015-05-21 08:27:44 -070096 bool fMixedSamplesSupport : 1;
vbuzinov3e77ba92015-09-30 23:02:06 -070097 bool fProgrammableSampleLocationsSupport : 1;
jvanverthe9c0fc62015-04-29 11:18:05 -070098
99 bool fShaderPrecisionVaries;
100 PrecisionInfo fFloatPrecisions[kGrShaderTypeCount][kGrSLPrecisionCount];
101
102private:
egdanielb7e7d572015-11-04 04:23:53 -0800103 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
jvanverthe9c0fc62015-04-29 11:18:05 -0700104 typedef SkRefCnt INHERITED;
105};
106
107/**
bsalomon4b91f762015-05-19 09:29:46 -0700108 * Represents the capabilities of a GrContext.
jvanverthe9c0fc62015-04-29 11:18:05 -0700109 */
bsalomon4b91f762015-05-19 09:29:46 -0700110class GrCaps : public SkRefCnt {
jvanverthe9c0fc62015-04-29 11:18:05 -0700111public:
bsalomon682c2692015-05-22 14:01:46 -0700112 GrCaps(const GrContextOptions&);
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000113
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +0000114 virtual SkString dump() const;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000115
jvanverthe9c0fc62015-04-29 11:18:05 -0700116 GrShaderCaps* shaderCaps() const { return fShaderCaps; }
117
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000118 bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
commit-bot@chromium.org47442312013-12-19 16:18:01 +0000119 /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
120 only for POT textures) */
121 bool mipMapSupport() const { return fMipMapSupport; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000122 bool twoSidedStencilSupport() const { return fTwoSidedStencilSupport; }
123 bool stencilWrapOpsSupport() const { return fStencilWrapOpsSupport; }
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000124 bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; }
egdanielbdad9c32015-03-05 12:19:17 -0800125#if GR_FORCE_GPU_TRACE_DEBUGGING
126 bool gpuTracingSupport() const { return true; }
127#else
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000128 bool gpuTracingSupport() const { return fGpuTracingSupport; }
egdanielbdad9c32015-03-05 12:19:17 -0800129#endif
krajcevski786978162014-07-30 11:25:44 -0700130 bool compressedTexSubImageSupport() const { return fCompressedTexSubImageSupport; }
bsalomond08ea5f2015-02-20 06:58:13 -0800131 bool oversizedStencilSupport() const { return fOversizedStencilSupport; }
cdaltonfd4167d2015-04-21 11:45:56 -0700132 bool textureBarrierSupport() const { return fTextureBarrierSupport; }
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000133
bsalomon63b21962014-11-05 07:05:34 -0800134 bool useDrawInsteadOfClear() const { return fUseDrawInsteadOfClear; }
joshualitt83bc2292015-06-18 14:18:02 -0700135 bool useDrawInsteadOfPartialRenderTargetWrite() const {
136 return fUseDrawInsteadOfPartialRenderTargetWrite;
137 }
bsalomon63b21962014-11-05 07:05:34 -0800138
robertphillips63926682015-08-20 09:39:02 -0700139 bool preferVRAMUseOverFlushes() const { return fPreferVRAMUseOverFlushes; }
140
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000141 /**
cdalton8917d622015-05-06 13:40:21 -0700142 * Indicates the capabilities of the fixed function blend unit.
143 */
144 enum BlendEquationSupport {
145 kBasic_BlendEquationSupport, //<! Support to select the operator that
146 // combines src and dst terms.
147 kAdvanced_BlendEquationSupport, //<! Additional fixed function support for specific
148 // SVG/PDF blend modes. Requires blend barriers.
149 kAdvancedCoherent_BlendEquationSupport, //<! Advanced blend equation support that does not
150 // require blend barriers, and permits overlap.
151
152 kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
153 };
154
155 BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
156
157 bool advancedBlendEquationSupport() const {
158 return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
159 }
160
161 bool advancedCoherentBlendEquationSupport() const {
162 return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
163 }
164
cdalton1dd05422015-06-12 09:01:18 -0700165 bool canUseAdvancedBlendEquation(GrBlendEquation equation) const {
166 SkASSERT(GrBlendEquationIsAdvanced(equation));
167 return SkToBool(fAdvBlendEqBlacklist & (1 << equation));
168 }
169
cdalton8917d622015-05-06 13:40:21 -0700170 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000171 * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
172 * textures allows partial mappings or full mappings.
173 */
174 enum MapFlags {
175 kNone_MapFlags = 0x0, //<! Cannot map the resource.
176
177 kCanMap_MapFlag = 0x1, //<! The resource can be mapped. Must be set for any of
178 // the other flags to have meaning.k
179 kSubset_MapFlag = 0x2, //<! The resource can be partially mapped.
180 };
181
182 uint32_t mapBufferFlags() const { return fMapBufferFlags; }
183
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000184 // Scratch textures not being reused means that those scratch textures
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000185 // that we upload to (i.e., don't have a render target) will not be
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000186 // recycled in the texture cache. This is to prevent ghosting by drivers
187 // (in particular for deferred architectures).
commit-bot@chromium.orgb8356522013-07-18 22:26:39 +0000188 bool reuseScratchTextures() const { return fReuseScratchTextures; }
robertphillips1b8e1b52015-06-24 06:54:10 -0700189 bool reuseScratchBuffers() const { return fReuseScratchBuffers; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000190
191 int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
192 int maxTextureSize() const { return fMaxTextureSize; }
bsalomon8c07b7a2015-11-02 11:36:52 -0800193 /** This is the maximum tile size to use by GPU devices for rendering sw-backed images/bitmaps.
194 It is usually the max texture size, unless we're overriding it for testing. */
195 int maxTileSize() const { SkASSERT(fMaxTileSize <= fMaxTextureSize); return fMaxTileSize; }
bsalomonc59a1df2015-06-01 07:13:42 -0700196
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000197 // Will be 0 if MSAA is not supported
198 int maxSampleCount() const { return fMaxSampleCount; }
199
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000200 bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const {
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000201 SkASSERT(kGrPixelConfigCnt > config);
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000202 return fConfigRenderSupport[config][withMSAA];
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000203 }
204
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000205 bool isConfigTexturable(GrPixelConfig config) const {
206 SkASSERT(kGrPixelConfigCnt > config);
207 return fConfigTextureSupport[config];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000208 }
209
bsalomon682c2692015-05-22 14:01:46 -0700210 bool suppressPrints() const { return fSupressPrints; }
211
212 bool drawPathMasksToCompressedTexturesSupport() const {
joshualitt7224c862015-05-29 06:46:47 -0700213 return fDrawPathMasksToCompressedTextureSupport;
214 }
215
216 size_t geometryBufferMapThreshold() const {
joshualitte5b74c62015-06-01 14:17:47 -0700217 SkASSERT(fGeometryBufferMapThreshold >= 0);
joshualitt7224c862015-05-29 06:46:47 -0700218 return fGeometryBufferMapThreshold;
219 }
bsalomon682c2692015-05-22 14:01:46 -0700220
joshualitt58001552015-06-26 12:46:36 -0700221 bool supportsInstancedDraws() const {
222 return fSupportsInstancedDraws;
223 }
224
egdaniel51c8d402015-08-06 10:54:13 -0700225 bool fullClearIsFree() const { return fFullClearIsFree; }
226
bsalomon7dea7b72015-08-19 08:26:51 -0700227 /** True in environments that will issue errors if memory uploaded to buffers
228 is not initialized (even if not read by draw calls). */
229 bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; }
230
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000231protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700232 /** Subclasses must call this at the end of their constructors in order to apply caps
233 overrides requested by the client. Note that overrides will only reduce the caps never
234 expand them. */
235 void applyOptionsOverrides(const GrContextOptions& options);
236
jvanverthe9c0fc62015-04-29 11:18:05 -0700237 SkAutoTUnref<GrShaderCaps> fShaderCaps;
238
joshualitt83bc2292015-06-18 14:18:02 -0700239 bool fNPOTTextureTileSupport : 1;
240 bool fMipMapSupport : 1;
241 bool fTwoSidedStencilSupport : 1;
242 bool fStencilWrapOpsSupport : 1;
243 bool fDiscardRenderTargetSupport : 1;
244 bool fReuseScratchTextures : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700245 bool fReuseScratchBuffers : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700246 bool fGpuTracingSupport : 1;
247 bool fCompressedTexSubImageSupport : 1;
248 bool fOversizedStencilSupport : 1;
249 bool fTextureBarrierSupport : 1;
joshualitt58001552015-06-26 12:46:36 -0700250 bool fSupportsInstancedDraws : 1;
egdaniel51c8d402015-08-06 10:54:13 -0700251 bool fFullClearIsFree : 1;
bsalomon7dea7b72015-08-19 08:26:51 -0700252 bool fMustClearUploadedBufferData : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700253
bsalomon63b21962014-11-05 07:05:34 -0800254 // Driver workaround
joshualitt83bc2292015-06-18 14:18:02 -0700255 bool fUseDrawInsteadOfClear : 1;
256 bool fUseDrawInsteadOfPartialRenderTargetWrite : 1;
bsalomon63b21962014-11-05 07:05:34 -0800257
robertphillips63926682015-08-20 09:39:02 -0700258 // ANGLE workaround
259 bool fPreferVRAMUseOverFlushes : 1;
260
cdalton8917d622015-05-06 13:40:21 -0700261 BlendEquationSupport fBlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -0700262 uint32_t fAdvBlendEqBlacklist;
263 GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
264
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000265 uint32_t fMapBufferFlags;
joshualitte5b74c62015-06-01 14:17:47 -0700266 int fGeometryBufferMapThreshold;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000267
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000268 int fMaxRenderTargetSize;
269 int fMaxTextureSize;
bsalomon8c07b7a2015-11-02 11:36:52 -0800270 int fMaxTileSize;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000271 int fMaxSampleCount;
272
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000273 // The first entry for each config is without msaa and the second is with.
274 bool fConfigRenderSupport[kGrPixelConfigCnt][2];
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000275 bool fConfigTextureSupport[kGrPixelConfigCnt];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000276
egdanielbc127a32014-09-19 12:07:43 -0700277private:
egdanielb7e7d572015-11-04 04:23:53 -0800278 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
279
bsalomon682c2692015-05-22 14:01:46 -0700280 bool fSupressPrints : 1;
281 bool fDrawPathMasksToCompressedTextureSupport : 1;
282
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000283 typedef SkRefCnt INHERITED;
284};
285
286#endif