Home | History | Annotate | Download | only in gpu
      1 
      2 /*
      3  * Copyright 2013 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 #ifndef GrCaps_DEFINED
      9 #define GrCaps_DEFINED
     10 
     11 #include "../private/GrTypesPriv.h"
     12 #include "GrBlend.h"
     13 #include "GrShaderCaps.h"
     14 #include "SkRefCnt.h"
     15 #include "SkString.h"
     16 
     17 struct GrContextOptions;
     18 class GrRenderTargetProxy;
     19 
     20 /**
     21  * Represents the capabilities of a GrContext.
     22  */
     23 class GrCaps : public SkRefCnt {
     24 public:
     25     GrCaps(const GrContextOptions&);
     26 
     27     virtual SkString dump() const;
     28     const GrShaderCaps* shaderCaps() const { return fShaderCaps.get(); }
     29 
     30     bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; }
     31     /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g.
     32         only for POT textures) */
     33     bool mipMapSupport() const { return fMipMapSupport; }
     34 
     35     /**
     36      * Skia convention is that a device only has sRGB support if it supports sRGB formats for both
     37      * textures and framebuffers. In addition:
     38      *   Decoding to linear of an sRGB texture can be disabled.
     39      */
     40     bool srgbSupport() const { return fSRGBSupport; }
     41     /**
     42      * Is there support for enabling/disabling sRGB writes for sRGB-capable color buffers?
     43      */
     44     bool srgbWriteControl() const { return fSRGBWriteControl; }
     45     bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; }
     46     bool gpuTracingSupport() const { return fGpuTracingSupport; }
     47     bool oversizedStencilSupport() const { return fOversizedStencilSupport; }
     48     bool textureBarrierSupport() const { return fTextureBarrierSupport; }
     49     bool sampleLocationsSupport() const { return fSampleLocationsSupport; }
     50     bool multisampleDisableSupport() const { return fMultisampleDisableSupport; }
     51     bool instanceAttribSupport() const { return fInstanceAttribSupport; }
     52     bool usesMixedSamples() const { return fUsesMixedSamples; }
     53     bool preferClientSideDynamicBuffers() const { return fPreferClientSideDynamicBuffers; }
     54 
     55     bool useDrawInsteadOfClear() const { return fUseDrawInsteadOfClear; }
     56 
     57     bool preferVRAMUseOverFlushes() const { return fPreferVRAMUseOverFlushes; }
     58 
     59     /**
     60      * Indicates the level of support for gr_instanced::* functionality. A higher level includes
     61      * all functionality from the levels below it.
     62      */
     63     enum class InstancedSupport {
     64         kNone,
     65         kBasic,
     66         kMultisampled,
     67         kMixedSampled
     68     };
     69 
     70     InstancedSupport instancedSupport() const { return fInstancedSupport; }
     71 
     72     bool avoidInstancedDrawsToFPTargets() const { return fAvoidInstancedDrawsToFPTargets; }
     73 
     74     bool avoidStencilBuffers() const { return fAvoidStencilBuffers; }
     75 
     76     /**
     77      * Indicates the capabilities of the fixed function blend unit.
     78      */
     79     enum BlendEquationSupport {
     80         kBasic_BlendEquationSupport,             //<! Support to select the operator that
     81                                                  //   combines src and dst terms.
     82         kAdvanced_BlendEquationSupport,          //<! Additional fixed function support for specific
     83                                                  //   SVG/PDF blend modes. Requires blend barriers.
     84         kAdvancedCoherent_BlendEquationSupport,  //<! Advanced blend equation support that does not
     85                                                  //   require blend barriers, and permits overlap.
     86 
     87         kLast_BlendEquationSupport = kAdvancedCoherent_BlendEquationSupport
     88     };
     89 
     90     BlendEquationSupport blendEquationSupport() const { return fBlendEquationSupport; }
     91 
     92     bool advancedBlendEquationSupport() const {
     93         return fBlendEquationSupport >= kAdvanced_BlendEquationSupport;
     94     }
     95 
     96     bool advancedCoherentBlendEquationSupport() const {
     97         return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport;
     98     }
     99 
    100     bool canUseAdvancedBlendEquation(GrBlendEquation equation) const {
    101         SkASSERT(GrBlendEquationIsAdvanced(equation));
    102         return SkToBool(fAdvBlendEqBlacklist & (1 << equation));
    103     }
    104 
    105     /**
    106      * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and
    107      * textures allows partial mappings or full mappings.
    108      */
    109     enum MapFlags {
    110         kNone_MapFlags   = 0x0,       //<! Cannot map the resource.
    111 
    112         kCanMap_MapFlag  = 0x1,       //<! The resource can be mapped. Must be set for any of
    113                                       //   the other flags to have meaning.k
    114         kSubset_MapFlag  = 0x2,       //<! The resource can be partially mapped.
    115     };
    116 
    117     uint32_t mapBufferFlags() const { return fMapBufferFlags; }
    118 
    119     // Scratch textures not being reused means that those scratch textures
    120     // that we upload to (i.e., don't have a render target) will not be
    121     // recycled in the texture cache. This is to prevent ghosting by drivers
    122     // (in particular for deferred architectures).
    123     bool reuseScratchTextures() const { return fReuseScratchTextures; }
    124     bool reuseScratchBuffers() const { return fReuseScratchBuffers; }
    125 
    126     /// maximum number of attribute values per vertex
    127     int maxVertexAttributes() const { return fMaxVertexAttributes; }
    128 
    129     int maxRenderTargetSize() const { return fMaxRenderTargetSize; }
    130     int maxTextureSize() const { return fMaxTextureSize; }
    131     /** This is the maximum tile size to use by GPU devices for rendering sw-backed images/bitmaps.
    132         It is usually the max texture size, unless we're overriding it for testing. */
    133     int maxTileSize() const { SkASSERT(fMaxTileSize <= fMaxTextureSize); return fMaxTileSize; }
    134 
    135     int maxRasterSamples() const { return fMaxRasterSamples; }
    136 
    137     // Find a sample count greater than or equal to the requested count which is supported for a
    138     // color buffer of the given config. If MSAA is not support for the config we will return 0.
    139     virtual int getSampleCount(int requestedCount, GrPixelConfig config) const = 0;
    140 
    141     int maxWindowRectangles() const { return fMaxWindowRectangles; }
    142 
    143     virtual bool isConfigTexturable(GrPixelConfig) const = 0;
    144     virtual bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const = 0;
    145     virtual bool canConfigBeImageStorage(GrPixelConfig config) const = 0;
    146 
    147     bool suppressPrints() const { return fSuppressPrints; }
    148 
    149     size_t bufferMapThreshold() const {
    150         SkASSERT(fBufferMapThreshold >= 0);
    151         return fBufferMapThreshold;
    152     }
    153 
    154     bool fullClearIsFree() const { return fFullClearIsFree; }
    155 
    156     /** True in environments that will issue errors if memory uploaded to buffers
    157         is not initialized (even if not read by draw calls). */
    158     bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; }
    159 
    160     bool wireframeMode() const { return fWireframeMode; }
    161 
    162     bool sampleShadingSupport() const { return fSampleShadingSupport; }
    163 
    164     bool fenceSyncSupport() const { return fFenceSyncSupport; }
    165     bool crossContextTextureSupport() const { return fCrossContextTextureSupport; }
    166 
    167     /**
    168      * This is can be called before allocating a texture to be a dst for copySurface. This is only
    169      * used for doing dst copies needed in blends, thus the src is always a GrRenderTargetProxy. It
    170      * will populate the origin, config, and flags fields of the desc such that copySurface can
    171      * efficiently succeed. rectsMustMatch will be set to true if the copy operation must ensure
    172      * that the src and dest rects are identical. disallowSubrect will be set to true if copy rect
    173      * must equal src's bounds.
    174      */
    175     virtual bool initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc,
    176                                     bool* rectsMustMatch, bool* disallowSubrect) const = 0;
    177 
    178 protected:
    179     /** Subclasses must call this at the end of their constructors in order to apply caps
    180         overrides requested by the client. Note that overrides will only reduce the caps never
    181         expand them. */
    182     void applyOptionsOverrides(const GrContextOptions& options);
    183 
    184     sk_sp<GrShaderCaps> fShaderCaps;
    185 
    186     bool fNPOTTextureTileSupport                     : 1;
    187     bool fMipMapSupport                              : 1;
    188     bool fSRGBSupport                                : 1;
    189     bool fSRGBWriteControl                           : 1;
    190     bool fDiscardRenderTargetSupport                 : 1;
    191     bool fReuseScratchTextures                       : 1;
    192     bool fReuseScratchBuffers                        : 1;
    193     bool fGpuTracingSupport                          : 1;
    194     bool fOversizedStencilSupport                    : 1;
    195     bool fTextureBarrierSupport                      : 1;
    196     bool fSampleLocationsSupport                     : 1;
    197     bool fMultisampleDisableSupport                  : 1;
    198     bool fInstanceAttribSupport                      : 1;
    199     bool fUsesMixedSamples                           : 1;
    200     bool fPreferClientSideDynamicBuffers             : 1;
    201     bool fFullClearIsFree                            : 1;
    202     bool fMustClearUploadedBufferData                : 1;
    203 
    204     // Driver workaround
    205     bool fUseDrawInsteadOfClear                      : 1;
    206     bool fAvoidInstancedDrawsToFPTargets             : 1;
    207     bool fAvoidStencilBuffers                        : 1;
    208 
    209     // ANGLE workaround
    210     bool fPreferVRAMUseOverFlushes                   : 1;
    211 
    212     bool fSampleShadingSupport                       : 1;
    213     // TODO: this may need to be an enum to support different fence types
    214     bool fFenceSyncSupport                           : 1;
    215 
    216     // Vulkan doesn't support this (yet) and some drivers have issues, too
    217     bool fCrossContextTextureSupport                 : 1;
    218 
    219     InstancedSupport fInstancedSupport;
    220 
    221     BlendEquationSupport fBlendEquationSupport;
    222     uint32_t fAdvBlendEqBlacklist;
    223     GR_STATIC_ASSERT(kLast_GrBlendEquation < 32);
    224 
    225     uint32_t fMapBufferFlags;
    226     int fBufferMapThreshold;
    227 
    228     int fMaxRenderTargetSize;
    229     int fMaxVertexAttributes;
    230     int fMaxTextureSize;
    231     int fMaxTileSize;
    232     int fMaxColorSampleCount;
    233     int fMaxStencilSampleCount;
    234     int fMaxRasterSamples;
    235     int fMaxWindowRectangles;
    236 
    237 private:
    238     virtual void onApplyOptionsOverrides(const GrContextOptions&) {}
    239 
    240     bool fSuppressPrints : 1;
    241     bool fWireframeMode  : 1;
    242 
    243     typedef SkRefCnt INHERITED;
    244 };
    245 
    246 #endif
    247