blob: 727e9fcc466fb6333a07d80ddc38399c0a7efad4 [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"
13#include "GrShaderVar.h"
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +000014#include "SkRefCnt.h"
15#include "SkString.h"
16
bsalomon682c2692015-05-22 14:01:46 -070017struct GrContextOptions;
18
jvanverthe9c0fc62015-04-29 11:18:05 -070019class GrShaderCaps : public SkRefCnt {
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000020public:
jvanverthe9c0fc62015-04-29 11:18:05 -070021 SK_DECLARE_INST_COUNT(GrShaderCaps)
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000022
bsalomon17168df2014-12-09 09:00:49 -080023 /** Info about shader variable precision within a given shader stage. That is, this info
bsalomonc0bd6482014-12-09 10:04:14 -080024 is relevant to a float (or vecNf) variable declared with a GrSLPrecision
bsalomon17168df2014-12-09 09:00:49 -080025 in a given GrShaderType. The info here is hoisted from the OpenGL spec. */
26 struct PrecisionInfo {
27 PrecisionInfo() {
28 fLogRangeLow = 0;
29 fLogRangeHigh = 0;
30 fBits = 0;
31 }
32
33 /** Is this precision level allowed in the shader stage? */
34 bool supported() const { return 0 != fBits; }
35
36 bool operator==(const PrecisionInfo& that) const {
37 return fLogRangeLow == that.fLogRangeLow && fLogRangeHigh == that.fLogRangeHigh &&
38 fBits == that.fBits;
39 }
40 bool operator!=(const PrecisionInfo& that) const { return !(*this == that); }
41
42 /** floor(log2(|min_value|)) */
43 int fLogRangeLow;
44 /** floor(log2(|max_value|)) */
45 int fLogRangeHigh;
jvanverthe9c0fc62015-04-29 11:18:05 -070046 /** Number of bits of precision. As defined in OpenGL (with names modified to reflect this
bsalomon17168df2014-12-09 09:00:49 -080047 struct) :
48 """
jvanverthe9c0fc62015-04-29 11:18:05 -070049 If the smallest representable value greater than 1 is 1 + e, then fBits will
50 contain floor(log2(e)), and every value in the range [2^fLogRangeLow,
51 2^fLogRangeHigh] can be represented to at least one part in 2^fBits.
52 """
bsalomon17168df2014-12-09 09:00:49 -080053 */
54 int fBits;
55 };
56
bsalomon424cc262015-05-22 10:37:30 -070057 GrShaderCaps();
jvanverthe9c0fc62015-04-29 11:18:05 -070058
jvanverthe9c0fc62015-04-29 11:18:05 -070059 virtual SkString dump() const;
60
61 bool shaderDerivativeSupport() const { return fShaderDerivativeSupport; }
62 bool geometryShaderSupport() const { return fGeometryShaderSupport; }
63 bool pathRenderingSupport() const { return fPathRenderingSupport; }
64 bool dstReadInShaderSupport() const { return fDstReadInShaderSupport; }
65 bool dualSourceBlendingSupport() const { return fDualSourceBlendingSupport; }
cdalton0edea2c2015-05-21 08:27:44 -070066 bool mixedSamplesSupport() const { return fMixedSamplesSupport; }
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;
jvanverthe9c0fc62015-04-29 11:18:05 -070097
98 bool fShaderPrecisionVaries;
99 PrecisionInfo fFloatPrecisions[kGrShaderTypeCount][kGrSLPrecisionCount];
100
101private:
102 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:
bsalomon4b91f762015-05-19 09:29:46 -0700110 SK_DECLARE_INST_COUNT(GrCaps)
bsalomon17168df2014-12-09 09:00:49 -0800111
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; }
135
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000136 /**
cdalton8917d622015-05-06 13:40:21 -0700137 * Indicates the capabilities of the fixed function blend unit.
138 */
139 enum BlendEquationSupport {
140 kBasic_BlendEquationSupport, //<! Support to select the operator that
141 // combines src and dst terms.
142 kAdvanced_BlendEquationSupport, //<! Additional fixed function support for specific
143 // SVG/PDF blend modes. Requires blend barriers.
144 kAdvancedCoherent_BlendEquationSupport, //<! Advanced blend equation support that does not
145 // require blend barriers, and permits overlap.
146
147 kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
148 };
149
150 BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
151
152 bool advancedBlendEquationSupport() const {
153 return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
154 }
155
156 bool advancedCoherentBlendEquationSupport() const {
157 return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
158 }
159
160 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000161 * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
162 * textures allows partial mappings or full mappings.
163 */
164 enum MapFlags {
165 kNone_MapFlags = 0x0, //<! Cannot map the resource.
166
167 kCanMap_MapFlag = 0x1, //<! The resource can be mapped. Must be set for any of
168 // the other flags to have meaning.k
169 kSubset_MapFlag = 0x2, //<! The resource can be partially mapped.
170 };
171
172 uint32_t mapBufferFlags() const { return fMapBufferFlags; }
173
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000174 // Scratch textures not being reused means that those scratch textures
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000175 // that we upload to (i.e., don't have a render target) will not be
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000176 // recycled in the texture cache. This is to prevent ghosting by drivers
177 // (in particular for deferred architectures).
commit-bot@chromium.orgb8356522013-07-18 22:26:39 +0000178 bool reuseScratchTextures() const { return fReuseScratchTextures; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000179
180 int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
181 int maxTextureSize() const { return fMaxTextureSize; }
bsalomonc59a1df2015-06-01 07:13:42 -0700182 /** 0 unless GPU has problems with small textures */
183 int minTextureSize() const { return fMinTextureSize; }
184
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000185 // Will be 0 if MSAA is not supported
186 int maxSampleCount() const { return fMaxSampleCount; }
187
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000188 bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const {
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000189 SkASSERT(kGrPixelConfigCnt > config);
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000190 return fConfigRenderSupport[config][withMSAA];
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000191 }
192
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000193 bool isConfigTexturable(GrPixelConfig config) const {
194 SkASSERT(kGrPixelConfigCnt > config);
195 return fConfigTextureSupport[config];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000196 }
197
bsalomon682c2692015-05-22 14:01:46 -0700198 bool suppressPrints() const { return fSupressPrints; }
199
200 bool drawPathMasksToCompressedTexturesSupport() const {
joshualitt7224c862015-05-29 06:46:47 -0700201 return fDrawPathMasksToCompressedTextureSupport;
202 }
203
204 size_t geometryBufferMapThreshold() const {
joshualitte5b74c62015-06-01 14:17:47 -0700205 SkASSERT(fGeometryBufferMapThreshold >= 0);
joshualitt7224c862015-05-29 06:46:47 -0700206 return fGeometryBufferMapThreshold;
207 }
bsalomon682c2692015-05-22 14:01:46 -0700208
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000209protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700210 /** Subclasses must call this at the end of their constructors in order to apply caps
211 overrides requested by the client. Note that overrides will only reduce the caps never
212 expand them. */
213 void applyOptionsOverrides(const GrContextOptions& options);
214
jvanverthe9c0fc62015-04-29 11:18:05 -0700215 SkAutoTUnref<GrShaderCaps> fShaderCaps;
216
bsalomond08ea5f2015-02-20 06:58:13 -0800217 bool fNPOTTextureTileSupport : 1;
218 bool fMipMapSupport : 1;
219 bool fTwoSidedStencilSupport : 1;
220 bool fStencilWrapOpsSupport : 1;
bsalomond08ea5f2015-02-20 06:58:13 -0800221 bool fDiscardRenderTargetSupport : 1;
222 bool fReuseScratchTextures : 1;
223 bool fGpuTracingSupport : 1;
224 bool fCompressedTexSubImageSupport : 1;
225 bool fOversizedStencilSupport : 1;
cdaltonfd4167d2015-04-21 11:45:56 -0700226 bool fTextureBarrierSupport : 1;
bsalomon63b21962014-11-05 07:05:34 -0800227 // Driver workaround
bsalomond08ea5f2015-02-20 06:58:13 -0800228 bool fUseDrawInsteadOfClear : 1;
bsalomon63b21962014-11-05 07:05:34 -0800229
cdalton8917d622015-05-06 13:40:21 -0700230 BlendEquationSupport fBlendEquationSupport;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000231 uint32_t fMapBufferFlags;
joshualitte5b74c62015-06-01 14:17:47 -0700232 int fGeometryBufferMapThreshold;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000233
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000234 int fMaxRenderTargetSize;
235 int fMaxTextureSize;
bsalomonc59a1df2015-06-01 07:13:42 -0700236 int fMinTextureSize;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000237 int fMaxSampleCount;
238
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000239 // The first entry for each config is without msaa and the second is with.
240 bool fConfigRenderSupport[kGrPixelConfigCnt][2];
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000241 bool fConfigTextureSupport[kGrPixelConfigCnt];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000242
egdanielbc127a32014-09-19 12:07:43 -0700243private:
bsalomon682c2692015-05-22 14:01:46 -0700244 bool fSupressPrints : 1;
245 bool fDrawPathMasksToCompressedTextureSupport : 1;
246
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000247 typedef SkRefCnt INHERITED;
248};
249
250#endif