blob: 217a446264af6458e8a6247836b1fdce454c78e9 [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
84protected:
cdalton4cd67132015-06-10 19:23:46 -070085 /** Subclasses must call this after initialization in order to apply caps overrides requested by
86 the client. Note that overrides will only reduce the caps never expand them. */
bsalomon4ee6bd82015-05-27 13:23:23 -070087 void applyOptionsOverrides(const GrContextOptions& options);
88
jvanverthe9c0fc62015-04-29 11:18:05 -070089 bool fShaderDerivativeSupport : 1;
90 bool fGeometryShaderSupport : 1;
91 bool fPathRenderingSupport : 1;
92 bool fDstReadInShaderSupport : 1;
93 bool fDualSourceBlendingSupport : 1;
94
95 bool fShaderPrecisionVaries;
96 PrecisionInfo fFloatPrecisions[kGrShaderTypeCount][kGrSLPrecisionCount];
97
98private:
egdanielb7e7d572015-11-04 04:23:53 -080099 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
jvanverthe9c0fc62015-04-29 11:18:05 -0700100 typedef SkRefCnt INHERITED;
101};
102
103/**
bsalomon4b91f762015-05-19 09:29:46 -0700104 * Represents the capabilities of a GrContext.
jvanverthe9c0fc62015-04-29 11:18:05 -0700105 */
bsalomon4b91f762015-05-19 09:29:46 -0700106class GrCaps : public SkRefCnt {
jvanverthe9c0fc62015-04-29 11:18:05 -0700107public:
bsalomon682c2692015-05-22 14:01:46 -0700108 GrCaps(const GrContextOptions&);
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000109
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +0000110 virtual SkString dump() const;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000111
jvanverthe9c0fc62015-04-29 11:18:05 -0700112 GrShaderCaps* shaderCaps() const { return fShaderCaps; }
113
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000114 bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
commit-bot@chromium.org47442312013-12-19 16:18:01 +0000115 /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
116 only for POT textures) */
117 bool mipMapSupport() const { return fMipMapSupport; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000118 bool twoSidedStencilSupport() const { return fTwoSidedStencilSupport; }
119 bool stencilWrapOpsSupport() const { return fStencilWrapOpsSupport; }
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000120 bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; }
egdanielbdad9c32015-03-05 12:19:17 -0800121#if GR_FORCE_GPU_TRACE_DEBUGGING
122 bool gpuTracingSupport() const { return true; }
123#else
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000124 bool gpuTracingSupport() const { return fGpuTracingSupport; }
egdanielbdad9c32015-03-05 12:19:17 -0800125#endif
krajcevski786978162014-07-30 11:25:44 -0700126 bool compressedTexSubImageSupport() const { return fCompressedTexSubImageSupport; }
bsalomond08ea5f2015-02-20 06:58:13 -0800127 bool oversizedStencilSupport() const { return fOversizedStencilSupport; }
cdaltonfd4167d2015-04-21 11:45:56 -0700128 bool textureBarrierSupport() const { return fTextureBarrierSupport; }
cdalton63f6c1f2015-11-06 07:09:43 -0800129 bool mixedSamplesSupport() const { return fMixedSamplesSupport; }
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000130
bsalomon63b21962014-11-05 07:05:34 -0800131 bool useDrawInsteadOfClear() const { return fUseDrawInsteadOfClear; }
joshualitt83bc2292015-06-18 14:18:02 -0700132 bool useDrawInsteadOfPartialRenderTargetWrite() const {
133 return fUseDrawInsteadOfPartialRenderTargetWrite;
134 }
bsalomon63b21962014-11-05 07:05:34 -0800135
robertphillips63926682015-08-20 09:39:02 -0700136 bool preferVRAMUseOverFlushes() const { return fPreferVRAMUseOverFlushes; }
137
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000138 /**
cdalton8917d622015-05-06 13:40:21 -0700139 * Indicates the capabilities of the fixed function blend unit.
140 */
141 enum BlendEquationSupport {
142 kBasic_BlendEquationSupport, //<! Support to select the operator that
143 // combines src and dst terms.
144 kAdvanced_BlendEquationSupport, //<! Additional fixed function support for specific
145 // SVG/PDF blend modes. Requires blend barriers.
146 kAdvancedCoherent_BlendEquationSupport, //<! Advanced blend equation support that does not
147 // require blend barriers, and permits overlap.
148
149 kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
150 };
151
152 BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
153
154 bool advancedBlendEquationSupport() const {
155 return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
156 }
157
158 bool advancedCoherentBlendEquationSupport() const {
159 return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
160 }
161
cdalton1dd05422015-06-12 09:01:18 -0700162 bool canUseAdvancedBlendEquation(GrBlendEquation equation) const {
163 SkASSERT(GrBlendEquationIsAdvanced(equation));
164 return SkToBool(fAdvBlendEqBlacklist & (1 << equation));
165 }
166
cdalton8917d622015-05-06 13:40:21 -0700167 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000168 * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
169 * textures allows partial mappings or full mappings.
170 */
171 enum MapFlags {
172 kNone_MapFlags = 0x0, //<! Cannot map the resource.
173
174 kCanMap_MapFlag = 0x1, //<! The resource can be mapped. Must be set for any of
175 // the other flags to have meaning.k
176 kSubset_MapFlag = 0x2, //<! The resource can be partially mapped.
177 };
178
179 uint32_t mapBufferFlags() const { return fMapBufferFlags; }
180
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000181 // Scratch textures not being reused means that those scratch textures
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000182 // that we upload to (i.e., don't have a render target) will not be
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000183 // recycled in the texture cache. This is to prevent ghosting by drivers
184 // (in particular for deferred architectures).
commit-bot@chromium.orgb8356522013-07-18 22:26:39 +0000185 bool reuseScratchTextures() const { return fReuseScratchTextures; }
robertphillips1b8e1b52015-06-24 06:54:10 -0700186 bool reuseScratchBuffers() const { return fReuseScratchBuffers; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000187
188 int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
189 int maxTextureSize() const { return fMaxTextureSize; }
bsalomon8c07b7a2015-11-02 11:36:52 -0800190 /** This is the maximum tile size to use by GPU devices for rendering sw-backed images/bitmaps.
191 It is usually the max texture size, unless we're overriding it for testing. */
192 int maxTileSize() const { SkASSERT(fMaxTileSize <= fMaxTextureSize); return fMaxTileSize; }
bsalomonc59a1df2015-06-01 07:13:42 -0700193
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000194 // Will be 0 if MSAA is not supported
195 int maxSampleCount() const { return fMaxSampleCount; }
196
bsalomon41e4384e2016-01-08 09:12:44 -0800197 virtual bool isConfigTexturable(GrPixelConfig config) const = 0;
198 virtual bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const = 0;
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000199
robertphillipscaef3452015-11-11 13:18:11 -0800200 bool suppressPrints() const { return fSuppressPrints; }
201
202 bool immediateFlush() const { return fImmediateFlush; }
bsalomon682c2692015-05-22 14:01:46 -0700203
204 bool drawPathMasksToCompressedTexturesSupport() const {
joshualitt7224c862015-05-29 06:46:47 -0700205 return fDrawPathMasksToCompressedTextureSupport;
206 }
207
208 size_t geometryBufferMapThreshold() const {
joshualitte5b74c62015-06-01 14:17:47 -0700209 SkASSERT(fGeometryBufferMapThreshold >= 0);
joshualitt7224c862015-05-29 06:46:47 -0700210 return fGeometryBufferMapThreshold;
211 }
bsalomon682c2692015-05-22 14:01:46 -0700212
joshualitt58001552015-06-26 12:46:36 -0700213 bool supportsInstancedDraws() const {
214 return fSupportsInstancedDraws;
215 }
216
egdaniel51c8d402015-08-06 10:54:13 -0700217 bool fullClearIsFree() const { return fFullClearIsFree; }
218
bsalomon7dea7b72015-08-19 08:26:51 -0700219 /** True in environments that will issue errors if memory uploaded to buffers
220 is not initialized (even if not read by draw calls). */
221 bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; }
222
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000223protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700224 /** Subclasses must call this at the end of their constructors in order to apply caps
225 overrides requested by the client. Note that overrides will only reduce the caps never
226 expand them. */
227 void applyOptionsOverrides(const GrContextOptions& options);
228
jvanverthe9c0fc62015-04-29 11:18:05 -0700229 SkAutoTUnref<GrShaderCaps> fShaderCaps;
230
joshualitt83bc2292015-06-18 14:18:02 -0700231 bool fNPOTTextureTileSupport : 1;
232 bool fMipMapSupport : 1;
233 bool fTwoSidedStencilSupport : 1;
234 bool fStencilWrapOpsSupport : 1;
235 bool fDiscardRenderTargetSupport : 1;
236 bool fReuseScratchTextures : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700237 bool fReuseScratchBuffers : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700238 bool fGpuTracingSupport : 1;
239 bool fCompressedTexSubImageSupport : 1;
240 bool fOversizedStencilSupport : 1;
241 bool fTextureBarrierSupport : 1;
cdalton63f6c1f2015-11-06 07:09:43 -0800242 bool fMixedSamplesSupport : 1;
joshualitt58001552015-06-26 12:46:36 -0700243 bool fSupportsInstancedDraws : 1;
egdaniel51c8d402015-08-06 10:54:13 -0700244 bool fFullClearIsFree : 1;
bsalomon7dea7b72015-08-19 08:26:51 -0700245 bool fMustClearUploadedBufferData : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700246
bsalomon63b21962014-11-05 07:05:34 -0800247 // Driver workaround
joshualitt83bc2292015-06-18 14:18:02 -0700248 bool fUseDrawInsteadOfClear : 1;
249 bool fUseDrawInsteadOfPartialRenderTargetWrite : 1;
bsalomon63b21962014-11-05 07:05:34 -0800250
robertphillips63926682015-08-20 09:39:02 -0700251 // ANGLE workaround
252 bool fPreferVRAMUseOverFlushes : 1;
253
cdalton8917d622015-05-06 13:40:21 -0700254 BlendEquationSupport fBlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -0700255 uint32_t fAdvBlendEqBlacklist;
256 GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
257
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000258 uint32_t fMapBufferFlags;
joshualitte5b74c62015-06-01 14:17:47 -0700259 int fGeometryBufferMapThreshold;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000260
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000261 int fMaxRenderTargetSize;
262 int fMaxTextureSize;
bsalomon8c07b7a2015-11-02 11:36:52 -0800263 int fMaxTileSize;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000264 int fMaxSampleCount;
265
egdanielbc127a32014-09-19 12:07:43 -0700266private:
egdanielb7e7d572015-11-04 04:23:53 -0800267 virtual void onApplyOptionsOverrides(const GrContextOptions&) {};
268
robertphillipscaef3452015-11-11 13:18:11 -0800269 bool fSuppressPrints : 1;
270 bool fImmediateFlush: 1;
bsalomon682c2692015-05-22 14:01:46 -0700271 bool fDrawPathMasksToCompressedTextureSupport : 1;
272
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000273 typedef SkRefCnt INHERITED;
274};
275
276#endif