blob: 9ad20e53e41f3d123b3249f4832c760201109b78 [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:
jvanverthe9c0fc62015-04-29 11:18:05 -070022 SK_DECLARE_INST_COUNT(GrShaderCaps)
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000023
bsalomon17168df2014-12-09 09:00:49 -080024 /** Info about shader variable precision within a given shader stage. That is, this info
bsalomonc0bd6482014-12-09 10:04:14 -080025 is relevant to a float (or vecNf) variable declared with a GrSLPrecision
bsalomon17168df2014-12-09 09:00:49 -080026 in a given GrShaderType. The info here is hoisted from the OpenGL spec. */
27 struct PrecisionInfo {
28 PrecisionInfo() {
29 fLogRangeLow = 0;
30 fLogRangeHigh = 0;
31 fBits = 0;
32 }
33
34 /** Is this precision level allowed in the shader stage? */
35 bool supported() const { return 0 != fBits; }
36
37 bool operator==(const PrecisionInfo& that) const {
38 return fLogRangeLow == that.fLogRangeLow && fLogRangeHigh == that.fLogRangeHigh &&
39 fBits == that.fBits;
40 }
41 bool operator!=(const PrecisionInfo& that) const { return !(*this == that); }
42
43 /** floor(log2(|min_value|)) */
44 int fLogRangeLow;
45 /** floor(log2(|max_value|)) */
46 int fLogRangeHigh;
jvanverthe9c0fc62015-04-29 11:18:05 -070047 /** Number of bits of precision. As defined in OpenGL (with names modified to reflect this
bsalomon17168df2014-12-09 09:00:49 -080048 struct) :
49 """
jvanverthe9c0fc62015-04-29 11:18:05 -070050 If the smallest representable value greater than 1 is 1 + e, then fBits will
51 contain floor(log2(e)), and every value in the range [2^fLogRangeLow,
52 2^fLogRangeHigh] can be represented to at least one part in 2^fBits.
53 """
bsalomon17168df2014-12-09 09:00:49 -080054 */
55 int fBits;
56 };
57
bsalomon424cc262015-05-22 10:37:30 -070058 GrShaderCaps();
jvanverthe9c0fc62015-04-29 11:18:05 -070059
jvanverthe9c0fc62015-04-29 11:18:05 -070060 virtual SkString dump() const;
61
62 bool shaderDerivativeSupport() const { return fShaderDerivativeSupport; }
63 bool geometryShaderSupport() const { return fGeometryShaderSupport; }
64 bool pathRenderingSupport() const { return fPathRenderingSupport; }
65 bool dstReadInShaderSupport() const { return fDstReadInShaderSupport; }
66 bool dualSourceBlendingSupport() const { return fDualSourceBlendingSupport; }
cdalton0edea2c2015-05-21 08:27:44 -070067 bool mixedSamplesSupport() const { return fMixedSamplesSupport; }
jvanverthe9c0fc62015-04-29 11:18:05 -070068
69 /**
70 * Get the precision info for a variable of type kFloat_GrSLType, kVec2f_GrSLType, etc in a
71 * given shader type. If the shader type is not supported or the precision level is not
72 * supported in that shader type then the returned struct will report false when supported() is
73 * called.
74 */
75 const PrecisionInfo& getFloatShaderPrecisionInfo(GrShaderType shaderType,
76 GrSLPrecision precision) const {
77 return fFloatPrecisions[shaderType][precision];
78 };
79
80 /**
81 * Is there any difference between the float shader variable precision types? If this is true
82 * then unless the shader type is not supported, any call to getFloatShaderPrecisionInfo() would
83 * report the same info for all precisions in all shader types.
84 */
85 bool floatPrecisionVaries() const { return fShaderPrecisionVaries; }
86
87protected:
cdalton4cd67132015-06-10 19:23:46 -070088 /** Subclasses must call this after initialization in order to apply caps overrides requested by
89 the client. Note that overrides will only reduce the caps never expand them. */
bsalomon4ee6bd82015-05-27 13:23:23 -070090 void applyOptionsOverrides(const GrContextOptions& options);
91
jvanverthe9c0fc62015-04-29 11:18:05 -070092 bool fShaderDerivativeSupport : 1;
93 bool fGeometryShaderSupport : 1;
94 bool fPathRenderingSupport : 1;
95 bool fDstReadInShaderSupport : 1;
96 bool fDualSourceBlendingSupport : 1;
cdalton0edea2c2015-05-21 08:27:44 -070097 bool fMixedSamplesSupport : 1;
jvanverthe9c0fc62015-04-29 11:18:05 -070098
99 bool fShaderPrecisionVaries;
100 PrecisionInfo fFloatPrecisions[kGrShaderTypeCount][kGrSLPrecisionCount];
101
102private:
103 typedef SkRefCnt INHERITED;
104};
105
106/**
bsalomon4b91f762015-05-19 09:29:46 -0700107 * Represents the capabilities of a GrContext.
jvanverthe9c0fc62015-04-29 11:18:05 -0700108 */
bsalomon4b91f762015-05-19 09:29:46 -0700109class GrCaps : public SkRefCnt {
jvanverthe9c0fc62015-04-29 11:18:05 -0700110public:
bsalomon4b91f762015-05-19 09:29:46 -0700111 SK_DECLARE_INST_COUNT(GrCaps)
bsalomon17168df2014-12-09 09:00:49 -0800112
bsalomon682c2692015-05-22 14:01:46 -0700113 GrCaps(const GrContextOptions&);
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000114
commit-bot@chromium.org8b656c62013-11-21 15:23:15 +0000115 virtual SkString dump() const;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000116
jvanverthe9c0fc62015-04-29 11:18:05 -0700117 GrShaderCaps* shaderCaps() const { return fShaderCaps; }
118
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000119 bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
commit-bot@chromium.org47442312013-12-19 16:18:01 +0000120 /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
121 only for POT textures) */
122 bool mipMapSupport() const { return fMipMapSupport; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000123 bool twoSidedStencilSupport() const { return fTwoSidedStencilSupport; }
124 bool stencilWrapOpsSupport() const { return fStencilWrapOpsSupport; }
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000125 bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; }
egdanielbdad9c32015-03-05 12:19:17 -0800126#if GR_FORCE_GPU_TRACE_DEBUGGING
127 bool gpuTracingSupport() const { return true; }
128#else
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000129 bool gpuTracingSupport() const { return fGpuTracingSupport; }
egdanielbdad9c32015-03-05 12:19:17 -0800130#endif
krajcevski786978162014-07-30 11:25:44 -0700131 bool compressedTexSubImageSupport() const { return fCompressedTexSubImageSupport; }
bsalomond08ea5f2015-02-20 06:58:13 -0800132 bool oversizedStencilSupport() const { return fOversizedStencilSupport; }
cdaltonfd4167d2015-04-21 11:45:56 -0700133 bool textureBarrierSupport() const { return fTextureBarrierSupport; }
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000134
bsalomon63b21962014-11-05 07:05:34 -0800135 bool useDrawInsteadOfClear() const { return fUseDrawInsteadOfClear; }
joshualitt83bc2292015-06-18 14:18:02 -0700136 bool useDrawInsteadOfPartialRenderTargetWrite() const {
137 return fUseDrawInsteadOfPartialRenderTargetWrite;
138 }
bsalomon63b21962014-11-05 07:05:34 -0800139
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; }
bsalomonc59a1df2015-06-01 07:13:42 -0700192 /** 0 unless GPU has problems with small textures */
193 int minTextureSize() const { return fMinTextureSize; }
194
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000195 // Will be 0 if MSAA is not supported
196 int maxSampleCount() const { return fMaxSampleCount; }
197
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000198 bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const {
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000199 SkASSERT(kGrPixelConfigCnt > config);
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000200 return fConfigRenderSupport[config][withMSAA];
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000201 }
202
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000203 bool isConfigTexturable(GrPixelConfig config) const {
204 SkASSERT(kGrPixelConfigCnt > config);
205 return fConfigTextureSupport[config];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000206 }
207
bsalomon682c2692015-05-22 14:01:46 -0700208 bool suppressPrints() const { return fSupressPrints; }
209
210 bool drawPathMasksToCompressedTexturesSupport() const {
joshualitt7224c862015-05-29 06:46:47 -0700211 return fDrawPathMasksToCompressedTextureSupport;
212 }
213
214 size_t geometryBufferMapThreshold() const {
joshualitte5b74c62015-06-01 14:17:47 -0700215 SkASSERT(fGeometryBufferMapThreshold >= 0);
joshualitt7224c862015-05-29 06:46:47 -0700216 return fGeometryBufferMapThreshold;
217 }
bsalomon682c2692015-05-22 14:01:46 -0700218
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000219protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700220 /** Subclasses must call this at the end of their constructors in order to apply caps
221 overrides requested by the client. Note that overrides will only reduce the caps never
222 expand them. */
223 void applyOptionsOverrides(const GrContextOptions& options);
224
jvanverthe9c0fc62015-04-29 11:18:05 -0700225 SkAutoTUnref<GrShaderCaps> fShaderCaps;
226
joshualitt83bc2292015-06-18 14:18:02 -0700227 bool fNPOTTextureTileSupport : 1;
228 bool fMipMapSupport : 1;
229 bool fTwoSidedStencilSupport : 1;
230 bool fStencilWrapOpsSupport : 1;
231 bool fDiscardRenderTargetSupport : 1;
232 bool fReuseScratchTextures : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700233 bool fReuseScratchBuffers : 1;
joshualitt83bc2292015-06-18 14:18:02 -0700234 bool fGpuTracingSupport : 1;
235 bool fCompressedTexSubImageSupport : 1;
236 bool fOversizedStencilSupport : 1;
237 bool fTextureBarrierSupport : 1;
robertphillips1b8e1b52015-06-24 06:54:10 -0700238
bsalomon63b21962014-11-05 07:05:34 -0800239 // Driver workaround
joshualitt83bc2292015-06-18 14:18:02 -0700240 bool fUseDrawInsteadOfClear : 1;
241 bool fUseDrawInsteadOfPartialRenderTargetWrite : 1;
bsalomon63b21962014-11-05 07:05:34 -0800242
cdalton8917d622015-05-06 13:40:21 -0700243 BlendEquationSupport fBlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -0700244 uint32_t fAdvBlendEqBlacklist;
245 GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
246
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000247 uint32_t fMapBufferFlags;
joshualitte5b74c62015-06-01 14:17:47 -0700248 int fGeometryBufferMapThreshold;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000249
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000250 int fMaxRenderTargetSize;
251 int fMaxTextureSize;
bsalomonc59a1df2015-06-01 07:13:42 -0700252 int fMinTextureSize;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000253 int fMaxSampleCount;
254
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000255 // The first entry for each config is without msaa and the second is with.
256 bool fConfigRenderSupport[kGrPixelConfigCnt][2];
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000257 bool fConfigTextureSupport[kGrPixelConfigCnt];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000258
egdanielbc127a32014-09-19 12:07:43 -0700259private:
bsalomon682c2692015-05-22 14:01:46 -0700260 bool fSupressPrints : 1;
261 bool fDrawPathMasksToCompressedTextureSupport : 1;
262
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000263 typedef SkRefCnt INHERITED;
264};
265
266#endif