blob: 25f3caadeda59e89d8317f089578d3038e1c5084 [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:
bsalomon4ee6bd82015-05-27 13:23:23 -070087 /** Subclasses must call this at the end of their constructors in order to apply caps
88 overrides requested by the client. Note that overrides will only reduce the caps never
89 expand them. */
90 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; }
136
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000137 /**
cdalton8917d622015-05-06 13:40:21 -0700138 * Indicates the capabilities of the fixed function blend unit.
139 */
140 enum BlendEquationSupport {
141 kBasic_BlendEquationSupport, //<! Support to select the operator that
142 // combines src and dst terms.
143 kAdvanced_BlendEquationSupport, //<! Additional fixed function support for specific
144 // SVG/PDF blend modes. Requires blend barriers.
145 kAdvancedCoherent_BlendEquationSupport, //<! Advanced blend equation support that does not
146 // require blend barriers, and permits overlap.
147
148 kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
149 };
150
151 BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
152
153 bool advancedBlendEquationSupport() const {
154 return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
155 }
156
157 bool advancedCoherentBlendEquationSupport() const {
158 return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
159 }
160
161 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000162 * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
163 * textures allows partial mappings or full mappings.
164 */
165 enum MapFlags {
166 kNone_MapFlags = 0x0, //<! Cannot map the resource.
167
168 kCanMap_MapFlag = 0x1, //<! The resource can be mapped. Must be set for any of
169 // the other flags to have meaning.k
170 kSubset_MapFlag = 0x2, //<! The resource can be partially mapped.
171 };
172
173 uint32_t mapBufferFlags() const { return fMapBufferFlags; }
174
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000175 // Scratch textures not being reused means that those scratch textures
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000176 // that we upload to (i.e., don't have a render target) will not be
robertphillips@google.com2d2e5c42013-10-30 21:30:43 +0000177 // recycled in the texture cache. This is to prevent ghosting by drivers
178 // (in particular for deferred architectures).
commit-bot@chromium.orgb8356522013-07-18 22:26:39 +0000179 bool reuseScratchTextures() const { return fReuseScratchTextures; }
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000180
181 int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
182 int maxTextureSize() const { return fMaxTextureSize; }
183 // Will be 0 if MSAA is not supported
184 int maxSampleCount() const { return fMaxSampleCount; }
185
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000186 bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const {
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000187 SkASSERT(kGrPixelConfigCnt > config);
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000188 return fConfigRenderSupport[config][withMSAA];
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000189 }
190
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000191 bool isConfigTexturable(GrPixelConfig config) const {
192 SkASSERT(kGrPixelConfigCnt > config);
193 return fConfigTextureSupport[config];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000194 }
195
bsalomon682c2692015-05-22 14:01:46 -0700196 bool suppressPrints() const { return fSupressPrints; }
197
198 bool drawPathMasksToCompressedTexturesSupport() const {
joshualitt7224c862015-05-29 06:46:47 -0700199 return fDrawPathMasksToCompressedTextureSupport;
200 }
201
202 size_t geometryBufferMapThreshold() const {
203 return fGeometryBufferMapThreshold;
204 }
bsalomon682c2692015-05-22 14:01:46 -0700205
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000206protected:
bsalomon4ee6bd82015-05-27 13:23:23 -0700207 /** Subclasses must call this at the end of their constructors in order to apply caps
208 overrides requested by the client. Note that overrides will only reduce the caps never
209 expand them. */
210 void applyOptionsOverrides(const GrContextOptions& options);
211
jvanverthe9c0fc62015-04-29 11:18:05 -0700212 SkAutoTUnref<GrShaderCaps> fShaderCaps;
213
bsalomond08ea5f2015-02-20 06:58:13 -0800214 bool fNPOTTextureTileSupport : 1;
215 bool fMipMapSupport : 1;
216 bool fTwoSidedStencilSupport : 1;
217 bool fStencilWrapOpsSupport : 1;
bsalomond08ea5f2015-02-20 06:58:13 -0800218 bool fDiscardRenderTargetSupport : 1;
219 bool fReuseScratchTextures : 1;
220 bool fGpuTracingSupport : 1;
221 bool fCompressedTexSubImageSupport : 1;
222 bool fOversizedStencilSupport : 1;
cdaltonfd4167d2015-04-21 11:45:56 -0700223 bool fTextureBarrierSupport : 1;
bsalomon63b21962014-11-05 07:05:34 -0800224 // Driver workaround
bsalomond08ea5f2015-02-20 06:58:13 -0800225 bool fUseDrawInsteadOfClear : 1;
bsalomon63b21962014-11-05 07:05:34 -0800226
cdalton8917d622015-05-06 13:40:21 -0700227 BlendEquationSupport fBlendEquationSupport;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000228 uint32_t fMapBufferFlags;
229
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000230 int fMaxRenderTargetSize;
231 int fMaxTextureSize;
232 int fMaxSampleCount;
233
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000234 // The first entry for each config is without msaa and the second is with.
235 bool fConfigRenderSupport[kGrPixelConfigCnt][2];
commit-bot@chromium.org6e7ddaa2014-05-30 13:55:58 +0000236 bool fConfigTextureSupport[kGrPixelConfigCnt];
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000237
egdanielbc127a32014-09-19 12:07:43 -0700238private:
bsalomon682c2692015-05-22 14:01:46 -0700239 bool fSupressPrints : 1;
240 bool fDrawPathMasksToCompressedTextureSupport : 1;
joshualitt7224c862015-05-29 06:46:47 -0700241 size_t fGeometryBufferMapThreshold;
bsalomon682c2692015-05-22 14:01:46 -0700242
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000243 typedef SkRefCnt INHERITED;
244};
245
246#endif