blob: 1efea17bdc07594644d85e33b82dae981c12dc42 [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;
bsalomondc47ff72015-05-26 12:16:59 -070056
57 fUseDrawInsteadOfClear = false;
58
csmartdaltone0d36292016-07-29 08:14:20 -070059 fInstancedSupport = InstancedSupport::kNone;
60
bsalomondc47ff72015-05-26 12:16:59 -070061 fBlendEquationSupport = kBasic_BlendEquationSupport;
cdalton1dd05422015-06-12 09:01:18 -070062 fAdvBlendEqBlacklist = 0;
63
bsalomondc47ff72015-05-26 12:16:59 -070064 fMapBufferFlags = kNone_MapFlags;
65
bsalomon7dbd45d2016-03-23 10:40:53 -070066 fMaxVertexAttributes = 0;
egdanielff1d5472015-09-10 08:37:20 -070067 fMaxRenderTargetSize = 1;
68 fMaxTextureSize = 1;
egdanieleed519e2016-01-15 11:36:18 -080069 fMaxColorSampleCount = 0;
70 fMaxStencilSampleCount = 0;
cdaltonaf8bc7d2016-02-05 09:35:20 -080071 fMaxRasterSamples = 0;
csmartdalton9bc11872016-08-09 12:42:47 -070072 fMaxWindowRectangles = 0;
bsalomondc47ff72015-05-26 12:16:59 -070073
robertphillipscaef3452015-11-11 13:18:11 -080074 fSuppressPrints = options.fSuppressPrints;
75 fImmediateFlush = options.fImmediateMode;
cdalton397536c2016-03-25 12:15:03 -070076 fBufferMapThreshold = options.fBufferMapThreshold;
joshualitt83bc2292015-06-18 14:18:02 -070077 fUseDrawInsteadOfPartialRenderTargetWrite = options.fUseDrawInsteadOfPartialRenderTargetWrite;
bsalomonbabafcc2016-02-16 11:36:47 -080078 fUseDrawInsteadOfAllRenderTargetWrites = false;
csmartdaltone0d36292016-07-29 08:14:20 -070079 fAvoidInstancedDrawsToFPTargets = false;
robertphillips63926682015-08-20 09:39:02 -070080
81 fPreferVRAMUseOverFlushes = true;
bsalomondc47ff72015-05-26 12:16:59 -070082}
83
bsalomon4ee6bd82015-05-27 13:23:23 -070084void GrCaps::applyOptionsOverrides(const GrContextOptions& options) {
csmartdalton28341fa2016-08-17 10:00:21 -070085 this->onApplyOptionsOverrides(options);
bsalomon4ee6bd82015-05-27 13:23:23 -070086 fMaxTextureSize = SkTMin(fMaxTextureSize, options.fMaxTextureSizeOverride);
bsalomon8c07b7a2015-11-02 11:36:52 -080087 // If the max tile override is zero, it means we should use the max texture size.
88 if (!options.fMaxTileSizeOverride || options.fMaxTileSizeOverride > fMaxTextureSize) {
89 fMaxTileSize = fMaxTextureSize;
90 } else {
91 fMaxTileSize = options.fMaxTileSizeOverride;
92 }
csmartdalton28341fa2016-08-17 10:00:21 -070093 if (fMaxWindowRectangles > GrWindowRectangles::kMaxWindows) {
csmartdalton7535f412016-08-23 06:51:00 -070094 SkDebugf("WARNING: capping window rectangles at %i. HW advertises support for %i.\n",
95 GrWindowRectangles::kMaxWindows, fMaxWindowRectangles);
csmartdalton28341fa2016-08-17 10:00:21 -070096 fMaxWindowRectangles = GrWindowRectangles::kMaxWindows;
97 }
bsalomon4ee6bd82015-05-27 13:23:23 -070098}
99
bsalomondc47ff72015-05-26 12:16:59 -0700100static SkString map_flags_to_string(uint32_t flags) {
101 SkString str;
102 if (GrCaps::kNone_MapFlags == flags) {
103 str = "none";
104 } else {
105 SkASSERT(GrCaps::kCanMap_MapFlag & flags);
106 SkDEBUGCODE(flags &= ~GrCaps::kCanMap_MapFlag);
107 str = "can_map";
108
109 if (GrCaps::kSubset_MapFlag & flags) {
110 str.append(" partial");
111 } else {
112 str.append(" full");
113 }
114 SkDEBUGCODE(flags &= ~GrCaps::kSubset_MapFlag);
115 }
116 SkASSERT(0 == flags); // Make sure we handled all the flags.
117 return str;
118}
119
120SkString GrCaps::dump() const {
121 SkString r;
122 static const char* gNY[] = {"NO", "YES"};
123 r.appendf("MIP Map Support : %s\n", gNY[fMipMapSupport]);
124 r.appendf("NPOT Texture Tile Support : %s\n", gNY[fNPOTTextureTileSupport]);
brianosmana6359362016-03-21 06:55:37 -0700125 r.appendf("sRGB Support : %s\n", gNY[fSRGBSupport]);
brianosman35b784d2016-05-05 11:52:53 -0700126 r.appendf("sRGB Write Control : %s\n", gNY[fSRGBWriteControl]);
bsalomondc47ff72015-05-26 12:16:59 -0700127 r.appendf("Two Sided Stencil Support : %s\n", gNY[fTwoSidedStencilSupport]);
128 r.appendf("Stencil Wrap Ops Support : %s\n", gNY[fStencilWrapOpsSupport]);
129 r.appendf("Discard Render Target Support : %s\n", gNY[fDiscardRenderTargetSupport]);
130 r.appendf("Reuse Scratch Textures : %s\n", gNY[fReuseScratchTextures]);
robertphillips1b8e1b52015-06-24 06:54:10 -0700131 r.appendf("Reuse Scratch Buffers : %s\n", gNY[fReuseScratchBuffers]);
bsalomondc47ff72015-05-26 12:16:59 -0700132 r.appendf("Gpu Tracing Support : %s\n", gNY[fGpuTracingSupport]);
133 r.appendf("Compressed Update Support : %s\n", gNY[fCompressedTexSubImageSupport]);
134 r.appendf("Oversized Stencil Support : %s\n", gNY[fOversizedStencilSupport]);
135 r.appendf("Texture Barrier Support : %s\n", gNY[fTextureBarrierSupport]);
cdaltoneb79eea2016-02-26 10:39:34 -0800136 r.appendf("Sample Locations Support : %s\n", gNY[fSampleLocationsSupport]);
csmartdalton2b5f2cb2016-06-10 14:06:32 -0700137 r.appendf("Multisample disable support : %s\n", gNY[fMultisampleDisableSupport]);
egdanieleed519e2016-01-15 11:36:18 -0800138 r.appendf("Uses Mixed Samples : %s\n", gNY[fUsesMixedSamples]);
csmartdalton485a1202016-07-13 10:16:32 -0700139 r.appendf("Prefer client-side dynamic buffers : %s\n", gNY[fPreferClientSideDynamicBuffers]);
egdaniel51c8d402015-08-06 10:54:13 -0700140 r.appendf("Full screen clear is free : %s\n", gNY[fFullClearIsFree]);
bsalomon7dea7b72015-08-19 08:26:51 -0700141 r.appendf("Must clear buffer memory : %s\n", gNY[fMustClearUploadedBufferData]);
jvanverth84741b32016-09-30 08:39:02 -0700142 r.appendf("Sample shading support : %s\n", gNY[fSampleShadingSupport]);
143 r.appendf("Fence sync support : %s\n", gNY[fFenceSyncSupport]);
144
bsalomondc47ff72015-05-26 12:16:59 -0700145 r.appendf("Draw Instead of Clear [workaround] : %s\n", gNY[fUseDrawInsteadOfClear]);
joshualitt83bc2292015-06-18 14:18:02 -0700146 r.appendf("Draw Instead of TexSubImage [workaround] : %s\n",
147 gNY[fUseDrawInsteadOfPartialRenderTargetWrite]);
robertphillips63926682015-08-20 09:39:02 -0700148 r.appendf("Prefer VRAM Use over flushes [workaround] : %s\n", gNY[fPreferVRAMUseOverFlushes]);
149
cdalton1dd05422015-06-12 09:01:18 -0700150 if (this->advancedBlendEquationSupport()) {
151 r.appendf("Advanced Blend Equation Blacklist : 0x%x\n", fAdvBlendEqBlacklist);
152 }
bsalomondc47ff72015-05-26 12:16:59 -0700153
bsalomon7dbd45d2016-03-23 10:40:53 -0700154 r.appendf("Max Vertex Attributes : %d\n", fMaxVertexAttributes);
bsalomondc47ff72015-05-26 12:16:59 -0700155 r.appendf("Max Texture Size : %d\n", fMaxTextureSize);
bsalomondc47ff72015-05-26 12:16:59 -0700156 r.appendf("Max Render Target Size : %d\n", fMaxRenderTargetSize);
egdanieleed519e2016-01-15 11:36:18 -0800157 r.appendf("Max Color Sample Count : %d\n", fMaxColorSampleCount);
158 r.appendf("Max Stencil Sample Count : %d\n", fMaxStencilSampleCount);
cdaltonaf8bc7d2016-02-05 09:35:20 -0800159 r.appendf("Max Raster Samples : %d\n", fMaxRasterSamples);
csmartdalton9bc11872016-08-09 12:42:47 -0700160 r.appendf("Max Window Rectangles : %d\n", fMaxWindowRectangles);
bsalomondc47ff72015-05-26 12:16:59 -0700161
csmartdaltone0d36292016-07-29 08:14:20 -0700162 static const char* kInstancedSupportNames[] = {
163 "None",
164 "Basic",
165 "Multisampled",
166 "Mixed Sampled",
167 };
168 GR_STATIC_ASSERT(0 == (int)InstancedSupport::kNone);
169 GR_STATIC_ASSERT(1 == (int)InstancedSupport::kBasic);
170 GR_STATIC_ASSERT(2 == (int)InstancedSupport::kMultisampled);
171 GR_STATIC_ASSERT(3 == (int)InstancedSupport::kMixedSampled);
172 GR_STATIC_ASSERT(4 == SK_ARRAY_COUNT(kInstancedSupportNames));
173
174 r.appendf("Instanced Support : %s\n",
175 kInstancedSupportNames[(int)fInstancedSupport]);
176
bsalomondc47ff72015-05-26 12:16:59 -0700177 static const char* kBlendEquationSupportNames[] = {
178 "Basic",
179 "Advanced",
180 "Advanced Coherent",
181 };
182 GR_STATIC_ASSERT(0 == kBasic_BlendEquationSupport);
183 GR_STATIC_ASSERT(1 == kAdvanced_BlendEquationSupport);
184 GR_STATIC_ASSERT(2 == kAdvancedCoherent_BlendEquationSupport);
185 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kBlendEquationSupportNames) == kLast_BlendEquationSupport + 1);
186
187 r.appendf("Blend Equation Support : %s\n",
188 kBlendEquationSupportNames[fBlendEquationSupport]);
189 r.appendf("Map Buffer Support : %s\n",
190 map_flags_to_string(fMapBufferFlags).c_str());
191
bsalomon41e4384e2016-01-08 09:12:44 -0800192 SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, false));
193 SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, true));
bsalomondc47ff72015-05-26 12:16:59 -0700194
csmartdalton6aa0e112017-02-08 16:14:11 -0500195 for (size_t i = 1; i < kGrPixelConfigCnt; ++i) {
bsalomon41e4384e2016-01-08 09:12:44 -0800196 GrPixelConfig config = static_cast<GrPixelConfig>(i);
bsalomondc47ff72015-05-26 12:16:59 -0700197 r.appendf("%s is renderable: %s, with MSAA: %s\n",
csmartdalton6aa0e112017-02-08 16:14:11 -0500198 pixel_config_name(config),
bsalomon41e4384e2016-01-08 09:12:44 -0800199 gNY[this->isConfigRenderable(config, false)],
200 gNY[this->isConfigRenderable(config, true)]);
bsalomondc47ff72015-05-26 12:16:59 -0700201 }
202
bsalomon41e4384e2016-01-08 09:12:44 -0800203 SkASSERT(!this->isConfigTexturable(kUnknown_GrPixelConfig));
bsalomondc47ff72015-05-26 12:16:59 -0700204
csmartdalton6aa0e112017-02-08 16:14:11 -0500205 for (size_t i = 1; i < kGrPixelConfigCnt; ++i) {
bsalomon41e4384e2016-01-08 09:12:44 -0800206 GrPixelConfig config = static_cast<GrPixelConfig>(i);
bsalomondc47ff72015-05-26 12:16:59 -0700207 r.appendf("%s is uploadable to a texture: %s\n",
csmartdalton6aa0e112017-02-08 16:14:11 -0500208 pixel_config_name(config),
bsalomon41e4384e2016-01-08 09:12:44 -0800209 gNY[this->isConfigTexturable(config)]);
bsalomondc47ff72015-05-26 12:16:59 -0700210 }
211
212 return r;
213}