Home | History | Annotate | Download | only in gpu
      1 /*
      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"
     10 #include "GrWindowRectangles.h"
     11 
     12 static 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 kRGBA_float_GrPixelConfig: return "RGBAFloat";
     25         case kRG_float_GrPixelConfig: return "RGFloat";
     26         case kAlpha_half_GrPixelConfig: return "AlphaHalf";
     27         case kRGBA_half_GrPixelConfig: return "RGBAHalf";
     28     }
     29     SkFAIL("Invalid pixel config");
     30     return "<invalid>";
     31 }
     32 
     33 GrCaps::GrCaps(const GrContextOptions& options) {
     34     fMipMapSupport = false;
     35     fNPOTTextureTileSupport = false;
     36     fSRGBSupport = false;
     37     fSRGBWriteControl = false;
     38     fDiscardRenderTargetSupport = false;
     39     fReuseScratchTextures = true;
     40     fReuseScratchBuffers = true;
     41     fGpuTracingSupport = false;
     42     fOversizedStencilSupport = false;
     43     fTextureBarrierSupport = false;
     44     fSampleLocationsSupport = false;
     45     fMultisampleDisableSupport = false;
     46     fInstanceAttribSupport = false;
     47     fUsesMixedSamples = false;
     48     fPreferClientSideDynamicBuffers = false;
     49     fFullClearIsFree = false;
     50     fMustClearUploadedBufferData = false;
     51     fSampleShadingSupport = false;
     52     fFenceSyncSupport = false;
     53     fCrossContextTextureSupport = false;
     54 
     55     fUseDrawInsteadOfClear = false;
     56 
     57     fInstancedSupport = InstancedSupport::kNone;
     58 
     59     fBlendEquationSupport = kBasic_BlendEquationSupport;
     60     fAdvBlendEqBlacklist = 0;
     61 
     62     fMapBufferFlags = kNone_MapFlags;
     63 
     64     fMaxVertexAttributes = 0;
     65     fMaxRenderTargetSize = 1;
     66     fMaxTextureSize = 1;
     67     fMaxColorSampleCount = 0;
     68     fMaxStencilSampleCount = 0;
     69     fMaxRasterSamples = 0;
     70     fMaxWindowRectangles = 0;
     71 
     72     fSuppressPrints = options.fSuppressPrints;
     73     fWireframeMode = options.fWireframeMode;
     74     fBufferMapThreshold = options.fBufferMapThreshold;
     75     fAvoidInstancedDrawsToFPTargets = false;
     76     fAvoidStencilBuffers = false;
     77 
     78     fPreferVRAMUseOverFlushes = true;
     79 }
     80 
     81 void GrCaps::applyOptionsOverrides(const GrContextOptions& options) {
     82     this->onApplyOptionsOverrides(options);
     83     fMaxTextureSize = SkTMin(fMaxTextureSize, options.fMaxTextureSizeOverride);
     84     // If the max tile override is zero, it means we should use the max texture size.
     85     if (!options.fMaxTileSizeOverride || options.fMaxTileSizeOverride > fMaxTextureSize) {
     86         fMaxTileSize = fMaxTextureSize;
     87     } else {
     88         fMaxTileSize = options.fMaxTileSizeOverride;
     89     }
     90     if (fMaxWindowRectangles > GrWindowRectangles::kMaxWindows) {
     91         SkDebugf("WARNING: capping window rectangles at %i. HW advertises support for %i.\n",
     92                  GrWindowRectangles::kMaxWindows, fMaxWindowRectangles);
     93         fMaxWindowRectangles = GrWindowRectangles::kMaxWindows;
     94     }
     95     fAvoidStencilBuffers = options.fAvoidStencilBuffers;
     96 }
     97 
     98 static SkString map_flags_to_string(uint32_t flags) {
     99     SkString str;
    100     if (GrCaps::kNone_MapFlags == flags) {
    101         str = "none";
    102     } else {
    103         SkASSERT(GrCaps::kCanMap_MapFlag & flags);
    104         SkDEBUGCODE(flags &= ~GrCaps::kCanMap_MapFlag);
    105         str = "can_map";
    106 
    107         if (GrCaps::kSubset_MapFlag & flags) {
    108             str.append(" partial");
    109         } else {
    110             str.append(" full");
    111         }
    112         SkDEBUGCODE(flags &= ~GrCaps::kSubset_MapFlag);
    113     }
    114     SkASSERT(0 == flags); // Make sure we handled all the flags.
    115     return str;
    116 }
    117 
    118 SkString GrCaps::dump() const {
    119     SkString r;
    120     static const char* gNY[] = {"NO", "YES"};
    121     r.appendf("MIP Map Support                    : %s\n", gNY[fMipMapSupport]);
    122     r.appendf("NPOT Texture Tile Support          : %s\n", gNY[fNPOTTextureTileSupport]);
    123     r.appendf("sRGB Support                       : %s\n", gNY[fSRGBSupport]);
    124     r.appendf("sRGB Write Control                 : %s\n", gNY[fSRGBWriteControl]);
    125     r.appendf("Discard Render Target Support      : %s\n", gNY[fDiscardRenderTargetSupport]);
    126     r.appendf("Reuse Scratch Textures             : %s\n", gNY[fReuseScratchTextures]);
    127     r.appendf("Reuse Scratch Buffers              : %s\n", gNY[fReuseScratchBuffers]);
    128     r.appendf("Gpu Tracing Support                : %s\n", gNY[fGpuTracingSupport]);
    129     r.appendf("Oversized Stencil Support          : %s\n", gNY[fOversizedStencilSupport]);
    130     r.appendf("Texture Barrier Support            : %s\n", gNY[fTextureBarrierSupport]);
    131     r.appendf("Sample Locations Support           : %s\n", gNY[fSampleLocationsSupport]);
    132     r.appendf("Multisample disable support        : %s\n", gNY[fMultisampleDisableSupport]);
    133     r.appendf("Instance Attrib Support            : %s\n", gNY[fInstanceAttribSupport]);
    134     r.appendf("Uses Mixed Samples                 : %s\n", gNY[fUsesMixedSamples]);
    135     r.appendf("Prefer client-side dynamic buffers : %s\n", gNY[fPreferClientSideDynamicBuffers]);
    136     r.appendf("Full screen clear is free          : %s\n", gNY[fFullClearIsFree]);
    137     r.appendf("Must clear buffer memory           : %s\n", gNY[fMustClearUploadedBufferData]);
    138     r.appendf("Sample shading support             : %s\n", gNY[fSampleShadingSupport]);
    139     r.appendf("Fence sync support                 : %s\n", gNY[fFenceSyncSupport]);
    140     r.appendf("Cross context texture support      : %s\n", gNY[fCrossContextTextureSupport]);
    141 
    142     r.appendf("Draw Instead of Clear [workaround] : %s\n", gNY[fUseDrawInsteadOfClear]);
    143     r.appendf("Prefer VRAM Use over flushes [workaround] : %s\n", gNY[fPreferVRAMUseOverFlushes]);
    144 
    145     if (this->advancedBlendEquationSupport()) {
    146         r.appendf("Advanced Blend Equation Blacklist  : 0x%x\n", fAdvBlendEqBlacklist);
    147     }
    148 
    149     r.appendf("Max Vertex Attributes              : %d\n", fMaxVertexAttributes);
    150     r.appendf("Max Texture Size                   : %d\n", fMaxTextureSize);
    151     r.appendf("Max Render Target Size             : %d\n", fMaxRenderTargetSize);
    152     r.appendf("Max Color Sample Count             : %d\n", fMaxColorSampleCount);
    153     r.appendf("Max Stencil Sample Count           : %d\n", fMaxStencilSampleCount);
    154     r.appendf("Max Raster Samples                 : %d\n", fMaxRasterSamples);
    155     r.appendf("Max Window Rectangles              : %d\n", fMaxWindowRectangles);
    156 
    157     static const char* kInstancedSupportNames[] = {
    158         "None",
    159         "Basic",
    160         "Multisampled",
    161         "Mixed Sampled",
    162     };
    163     GR_STATIC_ASSERT(0 == (int)InstancedSupport::kNone);
    164     GR_STATIC_ASSERT(1 == (int)InstancedSupport::kBasic);
    165     GR_STATIC_ASSERT(2 == (int)InstancedSupport::kMultisampled);
    166     GR_STATIC_ASSERT(3 == (int)InstancedSupport::kMixedSampled);
    167     GR_STATIC_ASSERT(4 == SK_ARRAY_COUNT(kInstancedSupportNames));
    168 
    169     r.appendf("Instanced Support                  : %s\n",
    170               kInstancedSupportNames[(int)fInstancedSupport]);
    171 
    172     static const char* kBlendEquationSupportNames[] = {
    173         "Basic",
    174         "Advanced",
    175         "Advanced Coherent",
    176     };
    177     GR_STATIC_ASSERT(0 == kBasic_BlendEquationSupport);
    178     GR_STATIC_ASSERT(1 == kAdvanced_BlendEquationSupport);
    179     GR_STATIC_ASSERT(2 == kAdvancedCoherent_BlendEquationSupport);
    180     GR_STATIC_ASSERT(SK_ARRAY_COUNT(kBlendEquationSupportNames) == kLast_BlendEquationSupport + 1);
    181 
    182     r.appendf("Blend Equation Support             : %s\n",
    183               kBlendEquationSupportNames[fBlendEquationSupport]);
    184     r.appendf("Map Buffer Support                 : %s\n",
    185               map_flags_to_string(fMapBufferFlags).c_str());
    186 
    187     SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, false));
    188     SkASSERT(!this->isConfigRenderable(kUnknown_GrPixelConfig, true));
    189 
    190     for (size_t i = 1; i < kGrPixelConfigCnt; ++i)  {
    191         GrPixelConfig config = static_cast<GrPixelConfig>(i);
    192         r.appendf("%s is renderable: %s, with MSAA: %s\n",
    193                   pixel_config_name(config),
    194                   gNY[this->isConfigRenderable(config, false)],
    195                   gNY[this->isConfigRenderable(config, true)]);
    196     }
    197 
    198     SkASSERT(!this->isConfigTexturable(kUnknown_GrPixelConfig));
    199 
    200     for (size_t i = 1; i < kGrPixelConfigCnt; ++i)  {
    201         GrPixelConfig config = static_cast<GrPixelConfig>(i);
    202         r.appendf("%s is uploadable to a texture: %s\n",
    203                   pixel_config_name(config),
    204                   gNY[this->isConfigTexturable(config)]);
    205     }
    206 
    207     return r;
    208 }
    209