blob: ade64d6588c14788bb4b3c22a71d2438ea02134c [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"
bsalomondc47ff72015-05-26 12:16:59 -070011
csmartdalton6aa0e112017-02-08 16:14:11 -050012static const char* pixel_config_name(GrPixelConfig config) {
13 switch (config) {
14 case kUnknown_GrPixelConfig: return "Unknown";
15 case kAlpha_8_GrPixelConfig: return "Alpha8";
16 case kGray_8_GrPixelConfig: return "Gray8";
17 case kRGB_565_GrPixelConfig: return "RGB565";
18 case kRGBA_4444_GrPixelConfig: return "RGBA444";
19 case kRGBA_8888_GrPixelConfig: return "RGBA8888";
20 case kBGRA_8888_GrPixelConfig: return "BGRA8888";
21 case kSRGBA_8888_GrPixelConfig: return "SRGBA8888";
22 case kSBGRA_8888_GrPixelConfig: return "SBGRA8888";
23 case kRGBA_8888_sint_GrPixelConfig: return "RGBA8888_sint";
24 case kETC1_GrPixelConfig: return "ETC1";
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 }
30 SkFAIL("Invalid pixel config");
31 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;
bsalomondc47ff72015-05-26 12:16:59 -070039 fTwoSidedStencilSupport = false;
40 fStencilWrapOpsSupport = false;
41 fDiscardRenderTargetSupport = false;
42 fReuseScratchTextures = true;
robertphillips1b8e1b52015-06-24 06:54:10 -070043 fReuseScratchBuffers = true;
bsalomondc47ff72015-05-26 12:16:59 -070044 fGpuTracingSupport = false;
45 fCompressedTexSubImageSupport = false;
46 fOversizedStencilSupport = false;
47 fTextureBarrierSupport = false;
cdaltoneb79eea2016-02-26 10:39:34 -080048 fSampleLocationsSupport = false;
csmartdalton2b5f2cb2016-06-10 14:06:32 -070049 fMultisampleDisableSupport = false;
egdanieleed519e2016-01-15 11:36:18 -080050 fUsesMixedSamples = false;
csmartdalton485a1202016-07-13 10:16:32 -070051 fPreferClientSideDynamicBuffers = false;
egdaniel51c8d402015-08-06 10:54:13 -070052 fFullClearIsFree = false;
bsalomon7dea7b72015-08-19 08:26:51 -070053 fMustClearUploadedBufferData = false;
ethannicholas28ef4452016-03-25 09:26:03 -070054 fSampleShadingSupport = false;
jvanverth84741b32016-09-30 08:39:02 -070055 fFenceSyncSupport = false;
Brian Osman2c2bc112017-02-28 10:02:49 -050056 fCrossContextTextureSupport = false;
bsalomondc47ff72015-05-26 12:16:59 -070057
58 fUseDrawInsteadOfClear = false;
59
csmartdaltone0d36292016-07-29 08:14:20 -070060 fInstancedSupport = InstancedSupport::kNone;
61
bsalomondc47ff72015-05-26 12:16:59 -070062 fBlendEquationSupport = kBasic_BlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -070063 fAdvBlendEqBlacklist = 0;
64
bsalomondc47ff72015-05-26 12:16:59 -070065 fMapBufferFlags = kNone_MapFlags;
66
bsalomon7dbd45d2016-03-23 10:40:53 -070067 fMaxVertexAttributes = 0;
egdanielff1d5472015-09-10 08:37:20 -070068 fMaxRenderTargetSize = 1;
69 fMaxTextureSize = 1;
egdanieleed519e2016-01-15 11:36:18 -080070 fMaxColorSampleCount = 0;
71 fMaxStencilSampleCount = 0;
cdaltonaf8bc7d2016-02-05 09:35:20 -080072 fMaxRasterSamples = 0;
csmartdalton9bc11872016-08-09 12:42:47 -070073 fMaxWindowRectangles = 0;
bsalomondc47ff72015-05-26 12:16:59 -070074
robertphillipscaef3452015-11-11 13:18:11 -080075 fSuppressPrints = options.fSuppressPrints;
76 fImmediateFlush = options.fImmediateMode;
cdalton397536c2016-03-25 12:15:03 -070077 fBufferMapThreshold = options.fBufferMapThreshold;
joshualitt83bc2292015-06-18 14:18:02 -070078 fUseDrawInsteadOfPartialRenderTargetWrite = options.fUseDrawInsteadOfPartialRenderTargetWrite;
bsalomonbabafcc2016-02-16 11:36:47 -080079 fUseDrawInsteadOfAllRenderTargetWrites = false;
csmartdaltone0d36292016-07-29 08:14:20 -070080 fAvoidInstancedDrawsToFPTargets = false;
robertphillips63926682015-08-20 09:39:02 -070081
82 fPreferVRAMUseOverFlushes = true;
bsalomondc47ff72015-05-26 12:16:59 -070083}
84
bsalomon4ee6bd82015-05-27 13:23:23 -070085void GrCaps::applyOptionsOverrides(const GrContextOptions& options) {
csmartdalton28341fa2016-08-17 10:00:21 -070086 this->onApplyOptionsOverrides(options);
bsalomon4ee6bd82015-05-27 13:23:23 -070087 fMaxTextureSize = SkTMin(fMaxTextureSize, options.fMaxTextureSizeOverride);
bsalomon8c07b7a2015-11-02 11:36:52 -080088 // If the max tile override is zero, it means we should use the max texture size.
89 if (!options.fMaxTileSizeOverride || options.fMaxTileSizeOverride > fMaxTextureSize) {
90 fMaxTileSize = fMaxTextureSize;
91 } else {
92 fMaxTileSize = options.fMaxTileSizeOverride;
93 }
csmartdalton28341fa2016-08-17 10:00:21 -070094 if (fMaxWindowRectangles > GrWindowRectangles::kMaxWindows) {
csmartdalton7535f412016-08-23 06:51:00 -070095 SkDebugf("WARNING: capping window rectangles at %i. HW advertises support for %i.\n",
96 GrWindowRectangles::kMaxWindows, fMaxWindowRectangles);
csmartdalton28341fa2016-08-17 10:00:21 -070097 fMaxWindowRectangles = GrWindowRectangles::kMaxWindows;
98 }
bsalomon4ee6bd82015-05-27 13:23:23 -070099}
100
bsalomondc47ff72015-05-26 12:16:59 -0700101static SkString map_flags_to_string(uint32_t flags) {
102 SkString str;
103 if (GrCaps::kNone_MapFlags == flags) {
104 str = "none";
105 } else {
106 SkASSERT(GrCaps::kCanMap_MapFlag & flags);
107 SkDEBUGCODE(flags &= ~GrCaps::kCanMap_MapFlag);
108 str = "can_map";
109
110 if (GrCaps::kSubset_MapFlag & flags) {
111 str.append(" partial");
112 } else {
113 str.append(" full");
114 }
115 SkDEBUGCODE(flags &= ~GrCaps::kSubset_MapFlag);
116 }
117 SkASSERT(0 == flags); // Make sure we handled all the flags.
118 return str;
119}
120
121SkString GrCaps::dump() const {
122 SkString r;
123 static const char* gNY[] = {"NO", "YES"};
124 r.appendf("MIP Map Support : %s\n", gNY[fMipMapSupport]);
125 r.appendf("NPOT Texture Tile Support : %s\n", gNY[fNPOTTextureTileSupport]);
brianosmana6359362016-03-21 06:55:37 -0700126 r.appendf("sRGB Support : %s\n", gNY[fSRGBSupport]);
brianosman35b784d2016-05-05 11:52:53 -0700127 r.appendf("sRGB Write Control : %s\n", gNY[fSRGBWriteControl]);
bsalomondc47ff72015-05-26 12:16:59 -0700128 r.appendf("Two Sided Stencil Support : %s\n", gNY[fTwoSidedStencilSupport]);
129 r.appendf("Stencil Wrap Ops Support : %s\n", gNY[fStencilWrapOpsSupport]);
130 r.appendf("Discard Render Target Support : %s\n", gNY[fDiscardRenderTargetSupport]);
131 r.appendf("Reuse Scratch Textures : %s\n", gNY[fReuseScratchTextures]);
robertphillips1b8e1b52015-06-24 06:54:10 -0700132 r.appendf("Reuse Scratch Buffers : %s\n", gNY[fReuseScratchBuffers]);
bsalomondc47ff72015-05-26 12:16:59 -0700133 r.appendf("Gpu Tracing Support : %s\n", gNY[fGpuTracingSupport]);
134 r.appendf("Compressed Update Support : %s\n", gNY[fCompressedTexSubImageSupport]);
135 r.appendf("Oversized Stencil Support : %s\n", gNY[fOversizedStencilSupport]);
136 r.appendf("Texture Barrier Support : %s\n", gNY[fTextureBarrierSupport]);
cdaltoneb79eea2016-02-26 10:39:34 -0800137 r.appendf("Sample Locations Support : %s\n", gNY[fSampleLocationsSupport]);
csmartdalton2b5f2cb2016-06-10 14:06:32 -0700138 r.appendf("Multisample disable support : %s\n", gNY[fMultisampleDisableSupport]);
egdanieleed519e2016-01-15 11:36:18 -0800139 r.appendf("Uses Mixed Samples : %s\n", gNY[fUsesMixedSamples]);
csmartdalton485a1202016-07-13 10:16:32 -0700140 r.appendf("Prefer client-side dynamic buffers : %s\n", gNY[fPreferClientSideDynamicBuffers]);
egdaniel51c8d402015-08-06 10:54:13 -0700141 r.appendf("Full screen clear is free : %s\n", gNY[fFullClearIsFree]);
bsalomon7dea7b72015-08-19 08:26:51 -0700142 r.appendf("Must clear buffer memory : %s\n", gNY[fMustClearUploadedBufferData]);
jvanverth84741b32016-09-30 08:39:02 -0700143 r.appendf("Sample shading support : %s\n", gNY[fSampleShadingSupport]);
144 r.appendf("Fence sync support : %s\n", gNY[fFenceSyncSupport]);
Brian Osman2c2bc112017-02-28 10:02:49 -0500145 r.appendf("Cross context texture support : %s\n", gNY[fCrossContextTextureSupport]);
jvanverth84741b32016-09-30 08:39:02 -0700146
bsalomondc47ff72015-05-26 12:16:59 -0700147 r.appendf("Draw Instead of Clear [workaround] : %s\n", gNY[fUseDrawInsteadOfClear]);
joshualitt83bc2292015-06-18 14:18:02 -0700148 r.appendf("Draw Instead of TexSubImage [workaround] : %s\n",
149 gNY[fUseDrawInsteadOfPartialRenderTargetWrite]);
robertphillips63926682015-08-20 09:39:02 -0700150 r.appendf("Prefer VRAM Use over flushes [workaround] : %s\n", gNY[fPreferVRAMUseOverFlushes]);
151
cdalton1dd05422015-06-12 09:01:18 -0700152 if (this->advancedBlendEquationSupport()) {
153 r.appendf("Advanced Blend Equation Blacklist : 0x%x\n", fAdvBlendEqBlacklist);
154 }
bsalomondc47ff72015-05-26 12:16:59 -0700155
bsalomon7dbd45d2016-03-23 10:40:53 -0700156 r.appendf("Max Vertex Attributes : %d\n", fMaxVertexAttributes);
bsalomondc47ff72015-05-26 12:16:59 -0700157 r.appendf("Max Texture Size : %d\n", fMaxTextureSize);
bsalomondc47ff72015-05-26 12:16:59 -0700158 r.appendf("Max Render Target Size : %d\n", fMaxRenderTargetSize);
egdanieleed519e2016-01-15 11:36:18 -0800159 r.appendf("Max Color Sample Count : %d\n", fMaxColorSampleCount);
160 r.appendf("Max Stencil Sample Count : %d\n", fMaxStencilSampleCount);
cdaltonaf8bc7d2016-02-05 09:35:20 -0800161 r.appendf("Max Raster Samples : %d\n", fMaxRasterSamples);
csmartdalton9bc11872016-08-09 12:42:47 -0700162 r.appendf("Max Window Rectangles : %d\n", fMaxWindowRectangles);
bsalomondc47ff72015-05-26 12:16:59 -0700163
csmartdaltone0d36292016-07-29 08:14:20 -0700164 static const char* kInstancedSupportNames[] = {
165 "None",
166 "Basic",
167 "Multisampled",
168 "Mixed Sampled",
169 };
170 GR_STATIC_ASSERT(0 == (int)InstancedSupport::kNone);
171 GR_STATIC_ASSERT(1 == (int)InstancedSupport::kBasic);
172 GR_STATIC_ASSERT(2 == (int)InstancedSupport::kMultisampled);
173 GR_STATIC_ASSERT(3 == (int)InstancedSupport::kMixedSampled);
174 GR_STATIC_ASSERT(4 == SK_ARRAY_COUNT(kInstancedSupportNames));
175
176 r.appendf("Instanced Support : %s\n",
177 kInstancedSupportNames[(int)fInstancedSupport]);
178
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
189 r.appendf("Blend Equation Support : %s\n",
190 kBlendEquationSupportNames[fBlendEquationSupport]);
191 r.appendf("Map Buffer Support : %s\n",
192 map_flags_to_string(fMapBufferFlags).c_str());
193
bsalomon41e4384e2016-01-08 09:12:44 -0800194 SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, false));
195 SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, true));
bsalomondc47ff72015-05-26 12:16:59 -0700196
csmartdalton6aa0e112017-02-08 16:14:11 -0500197 for (size_t i = 1; i < kGrPixelConfigCnt; ++i) {
bsalomon41e4384e2016-01-08 09:12:44 -0800198 GrPixelConfig config = static_cast<GrPixelConfig>(i);
bsalomondc47ff72015-05-26 12:16:59 -0700199 r.appendf("%s is renderable: %s, with MSAA: %s\n",
csmartdalton6aa0e112017-02-08 16:14:11 -0500200 pixel_config_name(config),
bsalomon41e4384e2016-01-08 09:12:44 -0800201 gNY[this->isConfigRenderable(config, false)],
202 gNY[this->isConfigRenderable(config, true)]);
bsalomondc47ff72015-05-26 12:16:59 -0700203 }
204
bsalomon41e4384e2016-01-08 09:12:44 -0800205 SkASSERT(!this->isConfigTexturable(kUnknown_GrPixelConfig));
bsalomondc47ff72015-05-26 12:16:59 -0700206
csmartdalton6aa0e112017-02-08 16:14:11 -0500207 for (size_t i = 1; i < kGrPixelConfigCnt; ++i) {
bsalomon41e4384e2016-01-08 09:12:44 -0800208 GrPixelConfig config = static_cast<GrPixelConfig>(i);
bsalomondc47ff72015-05-26 12:16:59 -0700209 r.appendf("%s is uploadable to a texture: %s\n",
csmartdalton6aa0e112017-02-08 16:14:11 -0500210 pixel_config_name(config),
bsalomon41e4384e2016-01-08 09:12:44 -0800211 gNY[this->isConfigTexturable(config)]);
bsalomondc47ff72015-05-26 12:16:59 -0700212 }
213
214 return r;
215}