blob: 2e25845876fa7671f643cab511c6e49713eeecc3 [file] [log] [blame]
bsalomondc47ff72015-05-26 12:16:59 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrCaps.h"
9#include "GrContextOptions.h"
csmartdalton28341fa2016-08-17 10:00:21 -070010#include "GrWindowRectangles.h"
Brian Osman71a18892017-08-10 10:23:25 -040011#include "SkJSONWriter.h"
bsalomondc47ff72015-05-26 12:16:59 -070012
csmartdalton6aa0e112017-02-08 16:14:11 -050013static const char* pixel_config_name(GrPixelConfig config) {
14 switch (config) {
15 case kUnknown_GrPixelConfig: return "Unknown";
16 case kAlpha_8_GrPixelConfig: return "Alpha8";
17 case kGray_8_GrPixelConfig: return "Gray8";
18 case kRGB_565_GrPixelConfig: return "RGB565";
19 case kRGBA_4444_GrPixelConfig: return "RGBA444";
20 case kRGBA_8888_GrPixelConfig: return "RGBA8888";
21 case kBGRA_8888_GrPixelConfig: return "BGRA8888";
22 case kSRGBA_8888_GrPixelConfig: return "SRGBA8888";
23 case kSBGRA_8888_GrPixelConfig: return "SBGRA8888";
24 case kRGBA_8888_sint_GrPixelConfig: return "RGBA8888_sint";
csmartdalton6aa0e112017-02-08 16:14:11 -050025 case kRGBA_float_GrPixelConfig: return "RGBAFloat";
26 case kRG_float_GrPixelConfig: return "RGFloat";
27 case kAlpha_half_GrPixelConfig: return "AlphaHalf";
28 case kRGBA_half_GrPixelConfig: return "RGBAHalf";
29 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040030 SK_ABORT("Invalid pixel config");
csmartdalton6aa0e112017-02-08 16:14:11 -050031 return "<invalid>";
32}
33
bsalomondc47ff72015-05-26 12:16:59 -070034GrCaps::GrCaps(const GrContextOptions& options) {
35 fMipMapSupport = false;
36 fNPOTTextureTileSupport = false;
brianosmana6359362016-03-21 06:55:37 -070037 fSRGBSupport = false;
brianosman35b784d2016-05-05 11:52:53 -070038 fSRGBWriteControl = false;
Brian Osman57bc3ea2017-07-27 09:58:11 -040039 fSRGBDecodeDisableSupport = false;
bsalomondc47ff72015-05-26 12:16:59 -070040 fDiscardRenderTargetSupport = false;
41 fReuseScratchTextures = true;
robertphillips1b8e1b52015-06-24 06:54:10 -070042 fReuseScratchBuffers = true;
bsalomondc47ff72015-05-26 12:16:59 -070043 fGpuTracingSupport = false;
bsalomondc47ff72015-05-26 12:16:59 -070044 fOversizedStencilSupport = false;
45 fTextureBarrierSupport = false;
cdaltoneb79eea2016-02-26 10:39:34 -080046 fSampleLocationsSupport = false;
csmartdalton2b5f2cb2016-06-10 14:06:32 -070047 fMultisampleDisableSupport = false;
Chris Dalton1d616352017-05-31 12:51:23 -060048 fInstanceAttribSupport = false;
egdanieleed519e2016-01-15 11:36:18 -080049 fUsesMixedSamples = false;
csmartdalton485a1202016-07-13 10:16:32 -070050 fPreferClientSideDynamicBuffers = false;
egdaniel51c8d402015-08-06 10:54:13 -070051 fFullClearIsFree = false;
bsalomon7dea7b72015-08-19 08:26:51 -070052 fMustClearUploadedBufferData = false;
ethannicholas28ef4452016-03-25 09:26:03 -070053 fSampleShadingSupport = false;
jvanverth84741b32016-09-30 08:39:02 -070054 fFenceSyncSupport = false;
Brian Osman2c2bc112017-02-28 10:02:49 -050055 fCrossContextTextureSupport = false;
bsalomondc47ff72015-05-26 12:16:59 -070056
csmartdaltone0d36292016-07-29 08:14:20 -070057 fInstancedSupport = InstancedSupport::kNone;
58
bsalomondc47ff72015-05-26 12:16:59 -070059 fBlendEquationSupport = kBasic_BlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -070060 fAdvBlendEqBlacklist = 0;
61
bsalomondc47ff72015-05-26 12:16:59 -070062 fMapBufferFlags = kNone_MapFlags;
63
bsalomon7dbd45d2016-03-23 10:40:53 -070064 fMaxVertexAttributes = 0;
egdanielff1d5472015-09-10 08:37:20 -070065 fMaxRenderTargetSize = 1;
66 fMaxTextureSize = 1;
egdanieleed519e2016-01-15 11:36:18 -080067 fMaxColorSampleCount = 0;
68 fMaxStencilSampleCount = 0;
cdaltonaf8bc7d2016-02-05 09:35:20 -080069 fMaxRasterSamples = 0;
csmartdalton9bc11872016-08-09 12:42:47 -070070 fMaxWindowRectangles = 0;
bsalomondc47ff72015-05-26 12:16:59 -070071
robertphillipscaef3452015-11-11 13:18:11 -080072 fSuppressPrints = options.fSuppressPrints;
Brian Osman195c05b2017-08-30 15:14:04 -040073#if GR_TEST_UTILS
Jim Van Verthfbdc0802017-05-02 16:15:53 -040074 fWireframeMode = options.fWireframeMode;
Brian Osman195c05b2017-08-30 15:14:04 -040075#else
76 fWireframeMode = false;
77#endif
cdalton397536c2016-03-25 12:15:03 -070078 fBufferMapThreshold = options.fBufferMapThreshold;
csmartdaltone0d36292016-07-29 08:14:20 -070079 fAvoidInstancedDrawsToFPTargets = false;
Chris Daltone4679fa2017-09-29 13:58:26 -060080 fBlacklistCoverageCounting = false;
Eric Karl5c779752017-05-08 12:02:07 -070081 fAvoidStencilBuffers = false;
robertphillips63926682015-08-20 09:39:02 -070082
83 fPreferVRAMUseOverFlushes = true;
bsalomondc47ff72015-05-26 12:16:59 -070084}
85
bsalomon4ee6bd82015-05-27 13:23:23 -070086void GrCaps::applyOptionsOverrides(const GrContextOptions& options) {
csmartdalton28341fa2016-08-17 10:00:21 -070087 this->onApplyOptionsOverrides(options);
bsalomon4ee6bd82015-05-27 13:23:23 -070088 fMaxTextureSize = SkTMin(fMaxTextureSize, options.fMaxTextureSizeOverride);
Brian Osman195c05b2017-08-30 15:14:04 -040089 fMaxTileSize = fMaxTextureSize;
90#if GR_TEST_UTILS
bsalomon8c07b7a2015-11-02 11:36:52 -080091 // If the max tile override is zero, it means we should use the max texture size.
Brian Osman195c05b2017-08-30 15:14:04 -040092 if (options.fMaxTileSizeOverride && options.fMaxTileSizeOverride < fMaxTextureSize) {
bsalomon8c07b7a2015-11-02 11:36:52 -080093 fMaxTileSize = options.fMaxTileSizeOverride;
94 }
Brian Osman195c05b2017-08-30 15:14:04 -040095#endif
csmartdalton28341fa2016-08-17 10:00:21 -070096 if (fMaxWindowRectangles > GrWindowRectangles::kMaxWindows) {
csmartdalton7535f412016-08-23 06:51:00 -070097 SkDebugf("WARNING: capping window rectangles at %i. HW advertises support for %i.\n",
98 GrWindowRectangles::kMaxWindows, fMaxWindowRectangles);
csmartdalton28341fa2016-08-17 10:00:21 -070099 fMaxWindowRectangles = GrWindowRectangles::kMaxWindows;
100 }
Eric Karl5c779752017-05-08 12:02:07 -0700101 fAvoidStencilBuffers = options.fAvoidStencilBuffers;
bsalomon4ee6bd82015-05-27 13:23:23 -0700102}
103
bsalomondc47ff72015-05-26 12:16:59 -0700104static SkString map_flags_to_string(uint32_t flags) {
105 SkString str;
106 if (GrCaps::kNone_MapFlags == flags) {
107 str = "none";
108 } else {
109 SkASSERT(GrCaps::kCanMap_MapFlag & flags);
110 SkDEBUGCODE(flags &= ~GrCaps::kCanMap_MapFlag);
111 str = "can_map";
112
113 if (GrCaps::kSubset_MapFlag & flags) {
114 str.append(" partial");
115 } else {
116 str.append(" full");
117 }
118 SkDEBUGCODE(flags &= ~GrCaps::kSubset_MapFlag);
119 }
120 SkASSERT(0 == flags); // Make sure we handled all the flags.
121 return str;
122}
123
Brian Osman71a18892017-08-10 10:23:25 -0400124void GrCaps::dumpJSON(SkJSONWriter* writer) const {
125 writer->beginObject();
jvanverth84741b32016-09-30 08:39:02 -0700126
Brian Osman71a18892017-08-10 10:23:25 -0400127 writer->appendBool("MIP Map Support", fMipMapSupport);
128 writer->appendBool("NPOT Texture Tile Support", fNPOTTextureTileSupport);
129 writer->appendBool("sRGB Support", fSRGBSupport);
130 writer->appendBool("sRGB Write Control", fSRGBWriteControl);
131 writer->appendBool("sRGB Decode Disable", fSRGBDecodeDisableSupport);
132 writer->appendBool("Discard Render Target Support", fDiscardRenderTargetSupport);
133 writer->appendBool("Reuse Scratch Textures", fReuseScratchTextures);
134 writer->appendBool("Reuse Scratch Buffers", fReuseScratchBuffers);
135 writer->appendBool("Gpu Tracing Support", fGpuTracingSupport);
136 writer->appendBool("Oversized Stencil Support", fOversizedStencilSupport);
137 writer->appendBool("Texture Barrier Support", fTextureBarrierSupport);
138 writer->appendBool("Sample Locations Support", fSampleLocationsSupport);
139 writer->appendBool("Multisample disable support", fMultisampleDisableSupport);
140 writer->appendBool("Instance Attrib Support", fInstanceAttribSupport);
141 writer->appendBool("Uses Mixed Samples", fUsesMixedSamples);
142 writer->appendBool("Prefer client-side dynamic buffers", fPreferClientSideDynamicBuffers);
143 writer->appendBool("Full screen clear is free", fFullClearIsFree);
144 writer->appendBool("Must clear buffer memory", fMustClearUploadedBufferData);
145 writer->appendBool("Sample shading support", fSampleShadingSupport);
146 writer->appendBool("Fence sync support", fFenceSyncSupport);
147 writer->appendBool("Cross context texture support", fCrossContextTextureSupport);
148
Chris Daltoncc604e52017-10-06 16:27:32 -0600149 writer->appendBool("Blacklist Coverage Counting Path Renderer [workaround]",
150 fBlacklistCoverageCounting);
Brian Osman71a18892017-08-10 10:23:25 -0400151 writer->appendBool("Prefer VRAM Use over flushes [workaround]", fPreferVRAMUseOverFlushes);
robertphillips63926682015-08-20 09:39:02 -0700152
cdalton1dd05422015-06-12 09:01:18 -0700153 if (this->advancedBlendEquationSupport()) {
Brian Osman71a18892017-08-10 10:23:25 -0400154 writer->appendHexU32("Advanced Blend Equation Blacklist", fAdvBlendEqBlacklist);
cdalton1dd05422015-06-12 09:01:18 -0700155 }
bsalomondc47ff72015-05-26 12:16:59 -0700156
Brian Osman71a18892017-08-10 10:23:25 -0400157 writer->appendS32("Max Vertex Attributes", fMaxVertexAttributes);
158 writer->appendS32("Max Texture Size", fMaxTextureSize);
159 writer->appendS32("Max Render Target Size", fMaxRenderTargetSize);
160 writer->appendS32("Max Color Sample Count", fMaxColorSampleCount);
161 writer->appendS32("Max Stencil Sample Count", fMaxStencilSampleCount);
162 writer->appendS32("Max Raster Samples", fMaxRasterSamples);
163 writer->appendS32("Max Window Rectangles", fMaxWindowRectangles);
bsalomondc47ff72015-05-26 12:16:59 -0700164
csmartdaltone0d36292016-07-29 08:14:20 -0700165 static const char* kInstancedSupportNames[] = {
166 "None",
167 "Basic",
168 "Multisampled",
169 "Mixed Sampled",
170 };
171 GR_STATIC_ASSERT(0 == (int)InstancedSupport::kNone);
172 GR_STATIC_ASSERT(1 == (int)InstancedSupport::kBasic);
173 GR_STATIC_ASSERT(2 == (int)InstancedSupport::kMultisampled);
174 GR_STATIC_ASSERT(3 == (int)InstancedSupport::kMixedSampled);
175 GR_STATIC_ASSERT(4 == SK_ARRAY_COUNT(kInstancedSupportNames));
176
Brian Osman71a18892017-08-10 10:23:25 -0400177 writer->appendString("Instanced Support", kInstancedSupportNames[(int)fInstancedSupport]);
csmartdaltone0d36292016-07-29 08:14:20 -0700178
bsalomondc47ff72015-05-26 12:16:59 -0700179 static const char* kBlendEquationSupportNames[] = {
180 "Basic",
181 "Advanced",
182 "Advanced Coherent",
183 };
184 GR_STATIC_ASSERT(0 == kBasic_BlendEquationSupport);
185 GR_STATIC_ASSERT(1 == kAdvanced_BlendEquationSupport);
186 GR_STATIC_ASSERT(2 == kAdvancedCoherent_BlendEquationSupport);
187 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kBlendEquationSupportNames) == kLast_BlendEquationSupport + 1);
188
Brian Osman71a18892017-08-10 10:23:25 -0400189 writer->appendString("Blend Equation Support",
190 kBlendEquationSupportNames[fBlendEquationSupport]);
191 writer->appendString("Map Buffer Support", map_flags_to_string(fMapBufferFlags).c_str());
bsalomondc47ff72015-05-26 12:16:59 -0700192
bsalomon41e4384e2016-01-08 09:12:44 -0800193 SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, false));
194 SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, true));
Brian Osman0f450ac2017-08-09 20:45:52 +0000195 SkASSERT(!this->isConfigTexturable(kUnknown_GrPixelConfig));
Brian Osman175af0d2017-08-09 14:29:36 -0400196
Brian Osman71a18892017-08-10 10:23:25 -0400197 writer->beginArray("configs");
198
199 for (size_t i = 1; i < kGrPixelConfigCnt; ++i) {
Brian Osman0f450ac2017-08-09 20:45:52 +0000200 GrPixelConfig config = static_cast<GrPixelConfig>(i);
Brian Osman80488222017-08-10 13:29:30 -0400201 writer->beginObject(nullptr, false);
Brian Osman71a18892017-08-10 10:23:25 -0400202 writer->appendString("name", pixel_config_name(config));
203 writer->appendBool("renderable", this->isConfigRenderable(config, false));
204 writer->appendBool("renderableMSAA", this->isConfigRenderable(config, true));
205 writer->appendBool("texturable", this->isConfigTexturable(config));
206 writer->endObject();
Brian Osman0f450ac2017-08-09 20:45:52 +0000207 }
Brian Osman175af0d2017-08-09 14:29:36 -0400208
Brian Osman71a18892017-08-10 10:23:25 -0400209 writer->endArray();
210
211 this->onDumpJSON(writer);
212
213 writer->appendName("shaderCaps");
214 this->shaderCaps()->dumpJSON(writer);
215
216 writer->endObject();
bsalomondc47ff72015-05-26 12:16:59 -0700217}