blob: f2e88b01c47d754c89e894fcf62b4580048eae16 [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;
18 fMixedSamplesSupport = false;
19 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" };
49 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]);
54 r.appendf("Mixed Samples Support : %s\n", gNY[fMixedSamplesSupport]);
55
56 r.appendf("Shader Float Precisions (varies: %s):\n", gNY[fShaderPrecisionVaries]);
57
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;
bsalomon4ee6bd82015-05-27 13:23:23 -070078}
79
bsalomondc47ff72015-05-26 12:16:59 -070080///////////////////////////////////////////////////////////////////////////////
81
82GrCaps::GrCaps(const GrContextOptions& options) {
83 fMipMapSupport = false;
84 fNPOTTextureTileSupport = false;
85 fTwoSidedStencilSupport = false;
86 fStencilWrapOpsSupport = false;
87 fDiscardRenderTargetSupport = false;
88 fReuseScratchTextures = true;
89 fGpuTracingSupport = false;
90 fCompressedTexSubImageSupport = false;
91 fOversizedStencilSupport = false;
92 fTextureBarrierSupport = false;
93
94 fUseDrawInsteadOfClear = false;
95
96 fBlendEquationSupport = kBasic_BlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -070097 fAdvBlendEqBlacklist = 0;
98
bsalomondc47ff72015-05-26 12:16:59 -070099 fMapBufferFlags = kNone_MapFlags;
100
101 fMaxRenderTargetSize = 0;
102 fMaxTextureSize = 0;
bsalomonc59a1df2015-06-01 07:13:42 -0700103 fMinTextureSize = 0;
bsalomondc47ff72015-05-26 12:16:59 -0700104 fMaxSampleCount = 0;
105
106 memset(fConfigRenderSupport, 0, sizeof(fConfigRenderSupport));
107 memset(fConfigTextureSupport, 0, sizeof(fConfigTextureSupport));
108
109 fSupressPrints = options.fSuppressPrints;
110 fDrawPathMasksToCompressedTextureSupport = options.fDrawPathToCompressedTexture;
joshualitt7224c862015-05-29 06:46:47 -0700111 fGeometryBufferMapThreshold = options.fGeometryBufferMapThreshold;
joshualitt83bc2292015-06-18 14:18:02 -0700112 fUseDrawInsteadOfPartialRenderTargetWrite = options.fUseDrawInsteadOfPartialRenderTargetWrite;
bsalomondc47ff72015-05-26 12:16:59 -0700113}
114
bsalomon4ee6bd82015-05-27 13:23:23 -0700115void GrCaps::applyOptionsOverrides(const GrContextOptions& options) {
116 fMaxTextureSize = SkTMin(fMaxTextureSize, options.fMaxTextureSizeOverride);
bsalomonc59a1df2015-06-01 07:13:42 -0700117 fMinTextureSize = SkTMax(fMinTextureSize, options.fMinTextureSizeOverride);
bsalomon4ee6bd82015-05-27 13:23:23 -0700118}
119
bsalomondc47ff72015-05-26 12:16:59 -0700120static SkString map_flags_to_string(uint32_t flags) {
121 SkString str;
122 if (GrCaps::kNone_MapFlags == flags) {
123 str = "none";
124 } else {
125 SkASSERT(GrCaps::kCanMap_MapFlag & flags);
126 SkDEBUGCODE(flags &= ~GrCaps::kCanMap_MapFlag);
127 str = "can_map";
128
129 if (GrCaps::kSubset_MapFlag & flags) {
130 str.append(" partial");
131 } else {
132 str.append(" full");
133 }
134 SkDEBUGCODE(flags &= ~GrCaps::kSubset_MapFlag);
135 }
136 SkASSERT(0 == flags); // Make sure we handled all the flags.
137 return str;
138}
139
140SkString GrCaps::dump() const {
141 SkString r;
142 static const char* gNY[] = {"NO", "YES"};
143 r.appendf("MIP Map Support : %s\n", gNY[fMipMapSupport]);
144 r.appendf("NPOT Texture Tile Support : %s\n", gNY[fNPOTTextureTileSupport]);
145 r.appendf("Two Sided Stencil Support : %s\n", gNY[fTwoSidedStencilSupport]);
146 r.appendf("Stencil Wrap Ops Support : %s\n", gNY[fStencilWrapOpsSupport]);
147 r.appendf("Discard Render Target Support : %s\n", gNY[fDiscardRenderTargetSupport]);
148 r.appendf("Reuse Scratch Textures : %s\n", gNY[fReuseScratchTextures]);
149 r.appendf("Gpu Tracing Support : %s\n", gNY[fGpuTracingSupport]);
150 r.appendf("Compressed Update Support : %s\n", gNY[fCompressedTexSubImageSupport]);
151 r.appendf("Oversized Stencil Support : %s\n", gNY[fOversizedStencilSupport]);
152 r.appendf("Texture Barrier Support : %s\n", gNY[fTextureBarrierSupport]);
153 r.appendf("Draw Instead of Clear [workaround] : %s\n", gNY[fUseDrawInsteadOfClear]);
joshualitt83bc2292015-06-18 14:18:02 -0700154 r.appendf("Draw Instead of TexSubImage [workaround] : %s\n",
155 gNY[fUseDrawInsteadOfPartialRenderTargetWrite]);
cdalton1dd05422015-06-12 09:01:18 -0700156 if (this->advancedBlendEquationSupport()) {
157 r.appendf("Advanced Blend Equation Blacklist : 0x%x\n", fAdvBlendEqBlacklist);
158 }
bsalomondc47ff72015-05-26 12:16:59 -0700159
160 r.appendf("Max Texture Size : %d\n", fMaxTextureSize);
bsalomonc59a1df2015-06-01 07:13:42 -0700161 r.appendf("Min Texture Size : %d\n", fMinTextureSize);
bsalomondc47ff72015-05-26 12:16:59 -0700162 r.appendf("Max Render Target Size : %d\n", fMaxRenderTargetSize);
163 r.appendf("Max Sample Count : %d\n", fMaxSampleCount);
164
165 static const char* kBlendEquationSupportNames[] = {
166 "Basic",
167 "Advanced",
168 "Advanced Coherent",
169 };
170 GR_STATIC_ASSERT(0 == kBasic_BlendEquationSupport);
171 GR_STATIC_ASSERT(1 == kAdvanced_BlendEquationSupport);
172 GR_STATIC_ASSERT(2 == kAdvancedCoherent_BlendEquationSupport);
173 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kBlendEquationSupportNames) == kLast_BlendEquationSupport + 1);
174
175 r.appendf("Blend Equation Support : %s\n",
176 kBlendEquationSupportNames[fBlendEquationSupport]);
177 r.appendf("Map Buffer Support : %s\n",
178 map_flags_to_string(fMapBufferFlags).c_str());
179
180 static const char* kConfigNames[] = {
181 "Unknown", // kUnknown_GrPixelConfig
182 "Alpha8", // kAlpha_8_GrPixelConfig,
183 "Index8", // kIndex_8_GrPixelConfig,
184 "RGB565", // kRGB_565_GrPixelConfig,
185 "RGBA444", // kRGBA_4444_GrPixelConfig,
186 "RGBA8888", // kRGBA_8888_GrPixelConfig,
187 "BGRA8888", // kBGRA_8888_GrPixelConfig,
188 "SRGBA8888",// kSRGBA_8888_GrPixelConfig,
189 "ETC1", // kETC1_GrPixelConfig,
190 "LATC", // kLATC_GrPixelConfig,
191 "R11EAC", // kR11_EAC_GrPixelConfig,
192 "ASTC12x12",// kASTC_12x12_GrPixelConfig,
193 "RGBAFloat",// kRGBA_float_GrPixelConfig
194 "AlphaHalf",// kAlpha_half_GrPixelConfig
195 "RGBAHalf", // kRGBA_half_GrPixelConfig
196 };
197 GR_STATIC_ASSERT(0 == kUnknown_GrPixelConfig);
198 GR_STATIC_ASSERT(1 == kAlpha_8_GrPixelConfig);
199 GR_STATIC_ASSERT(2 == kIndex_8_GrPixelConfig);
200 GR_STATIC_ASSERT(3 == kRGB_565_GrPixelConfig);
201 GR_STATIC_ASSERT(4 == kRGBA_4444_GrPixelConfig);
202 GR_STATIC_ASSERT(5 == kRGBA_8888_GrPixelConfig);
203 GR_STATIC_ASSERT(6 == kBGRA_8888_GrPixelConfig);
204 GR_STATIC_ASSERT(7 == kSRGBA_8888_GrPixelConfig);
205 GR_STATIC_ASSERT(8 == kETC1_GrPixelConfig);
206 GR_STATIC_ASSERT(9 == kLATC_GrPixelConfig);
207 GR_STATIC_ASSERT(10 == kR11_EAC_GrPixelConfig);
208 GR_STATIC_ASSERT(11 == kASTC_12x12_GrPixelConfig);
209 GR_STATIC_ASSERT(12 == kRGBA_float_GrPixelConfig);
210 GR_STATIC_ASSERT(13 == kAlpha_half_GrPixelConfig);
211 GR_STATIC_ASSERT(14 == kRGBA_half_GrPixelConfig);
212 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kConfigNames) == kGrPixelConfigCnt);
213
214 SkASSERT(!fConfigRenderSupport[kUnknown_GrPixelConfig][0]);
215 SkASSERT(!fConfigRenderSupport[kUnknown_GrPixelConfig][1]);
216
217 for (size_t i = 1; i < SK_ARRAY_COUNT(kConfigNames); ++i) {
218 r.appendf("%s is renderable: %s, with MSAA: %s\n",
219 kConfigNames[i],
220 gNY[fConfigRenderSupport[i][0]],
221 gNY[fConfigRenderSupport[i][1]]);
222 }
223
224 SkASSERT(!fConfigTextureSupport[kUnknown_GrPixelConfig]);
225
226 for (size_t i = 1; i < SK_ARRAY_COUNT(kConfigNames); ++i) {
227 r.appendf("%s is uploadable to a texture: %s\n",
228 kConfigNames[i],
229 gNY[fConfigTextureSupport[i]]);
230 }
231
232 return r;
233}