blob: 784e401328ec852ea2c28e279730aad6c4a0872f [file] [log] [blame]
bsalomondc47ff72015-05-26 12:16:59 -07001
2/*
3 * Copyright 2015 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 */
8
9#include "GrCaps.h"
10#include "GrContextOptions.h"
11
12GrShaderCaps::GrShaderCaps() {
13 fShaderDerivativeSupport = false;
14 fGeometryShaderSupport = false;
15 fPathRenderingSupport = false;
16 fDstReadInShaderSupport = false;
17 fDualSourceBlendingSupport = false;
cdalton793dc262016-02-08 10:11:47 -080018 fIntegerSupport = false;
bsalomondc47ff72015-05-26 12:16:59 -070019 fShaderPrecisionVaries = false;
20}
21
22static const char* shader_type_to_string(GrShaderType type) {
23 switch (type) {
24 case kVertex_GrShaderType:
25 return "vertex";
26 case kGeometry_GrShaderType:
27 return "geometry";
28 case kFragment_GrShaderType:
29 return "fragment";
30 }
31 return "";
32}
33
34static const char* precision_to_string(GrSLPrecision p) {
35 switch (p) {
36 case kLow_GrSLPrecision:
37 return "low";
38 case kMedium_GrSLPrecision:
39 return "medium";
40 case kHigh_GrSLPrecision:
41 return "high";
42 }
43 return "";
44}
45
46SkString GrShaderCaps::dump() const {
47 SkString r;
48 static const char* gNY[] = { "NO", "YES" };
cdalton7e806f32015-11-11 15:16:07 -080049 r.appendf("Shader Derivative Support : %s\n", gNY[fShaderDerivativeSupport]);
50 r.appendf("Geometry Shader Support : %s\n", gNY[fGeometryShaderSupport]);
51 r.appendf("Path Rendering Support : %s\n", gNY[fPathRenderingSupport]);
52 r.appendf("Dst Read In Shader Support : %s\n", gNY[fDstReadInShaderSupport]);
53 r.appendf("Dual Source Blending Support : %s\n", gNY[fDualSourceBlendingSupport]);
cdalton793dc262016-02-08 10:11:47 -080054 r.appendf("Integer Support : %s\n", gNY[fIntegerSupport]);
bsalomondc47ff72015-05-26 12:16:59 -070055
cdalton7e806f32015-11-11 15:16:07 -080056 r.appendf("Shader Float Precisions (varies: %s):\n", gNY[fShaderPrecisionVaries]);
bsalomondc47ff72015-05-26 12:16:59 -070057
58 for (int s = 0; s < kGrShaderTypeCount; ++s) {
59 GrShaderType shaderType = static_cast<GrShaderType>(s);
60 r.appendf("\t%s:\n", shader_type_to_string(shaderType));
61 for (int p = 0; p < kGrSLPrecisionCount; ++p) {
62 if (fFloatPrecisions[s][p].supported()) {
63 GrSLPrecision precision = static_cast<GrSLPrecision>(p);
64 r.appendf("\t\t%s: log_low: %d log_high: %d bits: %d\n",
65 precision_to_string(precision),
66 fFloatPrecisions[s][p].fLogRangeLow,
67 fFloatPrecisions[s][p].fLogRangeHigh,
68 fFloatPrecisions[s][p].fBits);
69 }
70 }
71 }
72
73 return r;
74}
75
cdalton6fd158e2015-05-27 15:08:33 -070076void GrShaderCaps::applyOptionsOverrides(const GrContextOptions& options) {
77 fDualSourceBlendingSupport = fDualSourceBlendingSupport && !options.fSuppressDualSourceBlending;
egdanielb7e7d572015-11-04 04:23:53 -080078 this->onApplyOptionsOverrides(options);
bsalomon4ee6bd82015-05-27 13:23:23 -070079}
80
bsalomondc47ff72015-05-26 12:16:59 -070081///////////////////////////////////////////////////////////////////////////////
82
83GrCaps::GrCaps(const GrContextOptions& options) {
84 fMipMapSupport = false;
85 fNPOTTextureTileSupport = false;
brianosmana6359362016-03-21 06:55:37 -070086 fSRGBSupport = false;
bsalomondc47ff72015-05-26 12:16:59 -070087 fTwoSidedStencilSupport = false;
88 fStencilWrapOpsSupport = false;
89 fDiscardRenderTargetSupport = false;
90 fReuseScratchTextures = true;
robertphillips1b8e1b52015-06-24 06:54:10 -070091 fReuseScratchBuffers = true;
bsalomondc47ff72015-05-26 12:16:59 -070092 fGpuTracingSupport = false;
93 fCompressedTexSubImageSupport = false;
94 fOversizedStencilSupport = false;
95 fTextureBarrierSupport = false;
cdaltoneb79eea2016-02-26 10:39:34 -080096 fSampleLocationsSupport = false;
egdanieleed519e2016-01-15 11:36:18 -080097 fUsesMixedSamples = false;
joshualitt58001552015-06-26 12:46:36 -070098 fSupportsInstancedDraws = false;
egdaniel51c8d402015-08-06 10:54:13 -070099 fFullClearIsFree = false;
bsalomon7dea7b72015-08-19 08:26:51 -0700100 fMustClearUploadedBufferData = false;
bsalomondc47ff72015-05-26 12:16:59 -0700101
102 fUseDrawInsteadOfClear = false;
103
104 fBlendEquationSupport = kBasic_BlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -0700105 fAdvBlendEqBlacklist = 0;
106
bsalomondc47ff72015-05-26 12:16:59 -0700107 fMapBufferFlags = kNone_MapFlags;
108
bsalomon7dbd45d2016-03-23 10:40:53 -0700109 fMaxVertexAttributes = 0;
egdanielff1d5472015-09-10 08:37:20 -0700110 fMaxRenderTargetSize = 1;
111 fMaxTextureSize = 1;
egdanieleed519e2016-01-15 11:36:18 -0800112 fMaxColorSampleCount = 0;
113 fMaxStencilSampleCount = 0;
cdaltonaf8bc7d2016-02-05 09:35:20 -0800114 fMaxRasterSamples = 0;
bsalomondc47ff72015-05-26 12:16:59 -0700115
robertphillipscaef3452015-11-11 13:18:11 -0800116 fSuppressPrints = options.fSuppressPrints;
117 fImmediateFlush = options.fImmediateMode;
bsalomondc47ff72015-05-26 12:16:59 -0700118 fDrawPathMasksToCompressedTextureSupport = options.fDrawPathToCompressedTexture;
robertphillipsf8c3ba42016-03-25 04:55:58 -0700119 fGeometryBufferMapThreshold = options.fGeometryBufferMapThreshold;
joshualitt83bc2292015-06-18 14:18:02 -0700120 fUseDrawInsteadOfPartialRenderTargetWrite = options.fUseDrawInsteadOfPartialRenderTargetWrite;
bsalomonbabafcc2016-02-16 11:36:47 -0800121 fUseDrawInsteadOfAllRenderTargetWrites = false;
robertphillips63926682015-08-20 09:39:02 -0700122
123 fPreferVRAMUseOverFlushes = true;
bsalomondc47ff72015-05-26 12:16:59 -0700124}
125
bsalomon4ee6bd82015-05-27 13:23:23 -0700126void GrCaps::applyOptionsOverrides(const GrContextOptions& options) {
127 fMaxTextureSize = SkTMin(fMaxTextureSize, options.fMaxTextureSizeOverride);
bsalomon8c07b7a2015-11-02 11:36:52 -0800128 // If the max tile override is zero, it means we should use the max texture size.
129 if (!options.fMaxTileSizeOverride || options.fMaxTileSizeOverride > fMaxTextureSize) {
130 fMaxTileSize = fMaxTextureSize;
131 } else {
132 fMaxTileSize = options.fMaxTileSizeOverride;
133 }
egdanielb7e7d572015-11-04 04:23:53 -0800134 this->onApplyOptionsOverrides(options);
bsalomon4ee6bd82015-05-27 13:23:23 -0700135}
136
bsalomondc47ff72015-05-26 12:16:59 -0700137static SkString map_flags_to_string(uint32_t flags) {
138 SkString str;
139 if (GrCaps::kNone_MapFlags == flags) {
140 str = "none";
141 } else {
142 SkASSERT(GrCaps::kCanMap_MapFlag & flags);
143 SkDEBUGCODE(flags &= ~GrCaps::kCanMap_MapFlag);
144 str = "can_map";
145
146 if (GrCaps::kSubset_MapFlag & flags) {
147 str.append(" partial");
148 } else {
149 str.append(" full");
150 }
151 SkDEBUGCODE(flags &= ~GrCaps::kSubset_MapFlag);
152 }
153 SkASSERT(0 == flags); // Make sure we handled all the flags.
154 return str;
155}
156
157SkString GrCaps::dump() const {
158 SkString r;
159 static const char* gNY[] = {"NO", "YES"};
160 r.appendf("MIP Map Support : %s\n", gNY[fMipMapSupport]);
161 r.appendf("NPOT Texture Tile Support : %s\n", gNY[fNPOTTextureTileSupport]);
brianosmana6359362016-03-21 06:55:37 -0700162 r.appendf("sRGB Support : %s\n", gNY[fSRGBSupport]);
bsalomondc47ff72015-05-26 12:16:59 -0700163 r.appendf("Two Sided Stencil Support : %s\n", gNY[fTwoSidedStencilSupport]);
164 r.appendf("Stencil Wrap Ops Support : %s\n", gNY[fStencilWrapOpsSupport]);
165 r.appendf("Discard Render Target Support : %s\n", gNY[fDiscardRenderTargetSupport]);
166 r.appendf("Reuse Scratch Textures : %s\n", gNY[fReuseScratchTextures]);
robertphillips1b8e1b52015-06-24 06:54:10 -0700167 r.appendf("Reuse Scratch Buffers : %s\n", gNY[fReuseScratchBuffers]);
bsalomondc47ff72015-05-26 12:16:59 -0700168 r.appendf("Gpu Tracing Support : %s\n", gNY[fGpuTracingSupport]);
169 r.appendf("Compressed Update Support : %s\n", gNY[fCompressedTexSubImageSupport]);
170 r.appendf("Oversized Stencil Support : %s\n", gNY[fOversizedStencilSupport]);
171 r.appendf("Texture Barrier Support : %s\n", gNY[fTextureBarrierSupport]);
cdaltoneb79eea2016-02-26 10:39:34 -0800172 r.appendf("Sample Locations Support : %s\n", gNY[fSampleLocationsSupport]);
egdanieleed519e2016-01-15 11:36:18 -0800173 r.appendf("Uses Mixed Samples : %s\n", gNY[fUsesMixedSamples]);
joshualitt58001552015-06-26 12:46:36 -0700174 r.appendf("Supports instanced draws : %s\n", gNY[fSupportsInstancedDraws]);
egdaniel51c8d402015-08-06 10:54:13 -0700175 r.appendf("Full screen clear is free : %s\n", gNY[fFullClearIsFree]);
bsalomon7dea7b72015-08-19 08:26:51 -0700176 r.appendf("Must clear buffer memory : %s\n", gNY[fMustClearUploadedBufferData]);
bsalomondc47ff72015-05-26 12:16:59 -0700177 r.appendf("Draw Instead of Clear [workaround] : %s\n", gNY[fUseDrawInsteadOfClear]);
joshualitt83bc2292015-06-18 14:18:02 -0700178 r.appendf("Draw Instead of TexSubImage [workaround] : %s\n",
179 gNY[fUseDrawInsteadOfPartialRenderTargetWrite]);
robertphillips63926682015-08-20 09:39:02 -0700180 r.appendf("Prefer VRAM Use over flushes [workaround] : %s\n", gNY[fPreferVRAMUseOverFlushes]);
181
cdalton1dd05422015-06-12 09:01:18 -0700182 if (this->advancedBlendEquationSupport()) {
183 r.appendf("Advanced Blend Equation Blacklist : 0x%x\n", fAdvBlendEqBlacklist);
184 }
bsalomondc47ff72015-05-26 12:16:59 -0700185
bsalomon7dbd45d2016-03-23 10:40:53 -0700186 r.appendf("Max Vertex Attributes : %d\n", fMaxVertexAttributes);
bsalomondc47ff72015-05-26 12:16:59 -0700187 r.appendf("Max Texture Size : %d\n", fMaxTextureSize);
bsalomondc47ff72015-05-26 12:16:59 -0700188 r.appendf("Max Render Target Size : %d\n", fMaxRenderTargetSize);
egdanieleed519e2016-01-15 11:36:18 -0800189 r.appendf("Max Color Sample Count : %d\n", fMaxColorSampleCount);
190 r.appendf("Max Stencil Sample Count : %d\n", fMaxStencilSampleCount);
cdaltonaf8bc7d2016-02-05 09:35:20 -0800191 r.appendf("Max Raster Samples : %d\n", fMaxRasterSamples);
bsalomondc47ff72015-05-26 12:16:59 -0700192
193 static const char* kBlendEquationSupportNames[] = {
194 "Basic",
195 "Advanced",
196 "Advanced Coherent",
197 };
198 GR_STATIC_ASSERT(0 == kBasic_BlendEquationSupport);
199 GR_STATIC_ASSERT(1 == kAdvanced_BlendEquationSupport);
200 GR_STATIC_ASSERT(2 == kAdvancedCoherent_BlendEquationSupport);
201 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kBlendEquationSupportNames) == kLast_BlendEquationSupport + 1);
202
203 r.appendf("Blend Equation Support : %s\n",
204 kBlendEquationSupportNames[fBlendEquationSupport]);
205 r.appendf("Map Buffer Support : %s\n",
206 map_flags_to_string(fMapBufferFlags).c_str());
207
208 static const char* kConfigNames[] = {
209 "Unknown", // kUnknown_GrPixelConfig
210 "Alpha8", // kAlpha_8_GrPixelConfig,
211 "Index8", // kIndex_8_GrPixelConfig,
212 "RGB565", // kRGB_565_GrPixelConfig,
213 "RGBA444", // kRGBA_4444_GrPixelConfig,
214 "RGBA8888", // kRGBA_8888_GrPixelConfig,
215 "BGRA8888", // kBGRA_8888_GrPixelConfig,
216 "SRGBA8888",// kSRGBA_8888_GrPixelConfig,
brianosmana6359362016-03-21 06:55:37 -0700217 "SBGRA8888",// kSBGRA_8888_GrPixelConfig,
bsalomondc47ff72015-05-26 12:16:59 -0700218 "ETC1", // kETC1_GrPixelConfig,
219 "LATC", // kLATC_GrPixelConfig,
220 "R11EAC", // kR11_EAC_GrPixelConfig,
221 "ASTC12x12",// kASTC_12x12_GrPixelConfig,
222 "RGBAFloat",// kRGBA_float_GrPixelConfig
223 "AlphaHalf",// kAlpha_half_GrPixelConfig
224 "RGBAHalf", // kRGBA_half_GrPixelConfig
225 };
226 GR_STATIC_ASSERT(0 == kUnknown_GrPixelConfig);
227 GR_STATIC_ASSERT(1 == kAlpha_8_GrPixelConfig);
228 GR_STATIC_ASSERT(2 == kIndex_8_GrPixelConfig);
229 GR_STATIC_ASSERT(3 == kRGB_565_GrPixelConfig);
230 GR_STATIC_ASSERT(4 == kRGBA_4444_GrPixelConfig);
231 GR_STATIC_ASSERT(5 == kRGBA_8888_GrPixelConfig);
232 GR_STATIC_ASSERT(6 == kBGRA_8888_GrPixelConfig);
233 GR_STATIC_ASSERT(7 == kSRGBA_8888_GrPixelConfig);
brianosmana6359362016-03-21 06:55:37 -0700234 GR_STATIC_ASSERT(8 == kSBGRA_8888_GrPixelConfig);
235 GR_STATIC_ASSERT(9 == kETC1_GrPixelConfig);
236 GR_STATIC_ASSERT(10 == kLATC_GrPixelConfig);
237 GR_STATIC_ASSERT(11 == kR11_EAC_GrPixelConfig);
238 GR_STATIC_ASSERT(12 == kASTC_12x12_GrPixelConfig);
239 GR_STATIC_ASSERT(13 == kRGBA_float_GrPixelConfig);
240 GR_STATIC_ASSERT(14 == kAlpha_half_GrPixelConfig);
241 GR_STATIC_ASSERT(15 == kRGBA_half_GrPixelConfig);
bsalomondc47ff72015-05-26 12:16:59 -0700242 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kConfigNames) == kGrPixelConfigCnt);
243
bsalomon41e4384e2016-01-08 09:12:44 -0800244 SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, false));
245 SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, true));
bsalomondc47ff72015-05-26 12:16:59 -0700246
247 for (size_t i = 1; i < SK_ARRAY_COUNT(kConfigNames); ++i) {
bsalomon41e4384e2016-01-08 09:12:44 -0800248 GrPixelConfig config = static_cast<GrPixelConfig>(i);
bsalomondc47ff72015-05-26 12:16:59 -0700249 r.appendf("%s is renderable: %s, with MSAA: %s\n",
250 kConfigNames[i],
bsalomon41e4384e2016-01-08 09:12:44 -0800251 gNY[this->isConfigRenderable(config, false)],
252 gNY[this->isConfigRenderable(config, true)]);
bsalomondc47ff72015-05-26 12:16:59 -0700253 }
254
bsalomon41e4384e2016-01-08 09:12:44 -0800255 SkASSERT(!this->isConfigTexturable(kUnknown_GrPixelConfig));
bsalomondc47ff72015-05-26 12:16:59 -0700256
257 for (size_t i = 1; i < SK_ARRAY_COUNT(kConfigNames); ++i) {
bsalomon41e4384e2016-01-08 09:12:44 -0800258 GrPixelConfig config = static_cast<GrPixelConfig>(i);
bsalomondc47ff72015-05-26 12:16:59 -0700259 r.appendf("%s is uploadable to a texture: %s\n",
260 kConfigNames[i],
bsalomon41e4384e2016-01-08 09:12:44 -0800261 gNY[this->isConfigTexturable(config)]);
bsalomondc47ff72015-05-26 12:16:59 -0700262 }
263
264 return r;
265}