/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrCaps_DEFINED #define GrCaps_DEFINED #include "../private/GrTypesPriv.h" #include "GrBlend.h" #include "GrShaderCaps.h" #include "SkImageInfo.h" #include "SkRefCnt.h" #include "SkString.h" class GrBackendRenderTarget; class GrBackendTexture; struct GrContextOptions; class GrRenderTargetProxy; class SkJSONWriter; /** * Represents the capabilities of a GrContext. */ class GrCaps : public SkRefCnt { public: GrCaps(const GrContextOptions&); void dumpJSON(SkJSONWriter*) const; const GrShaderCaps* shaderCaps() const { return fShaderCaps.get(); } bool npotTextureTileSupport() const { return fNPOTTextureTileSupport; } /** To avoid as-yet-unnecessary complexity we don't allow any partial support of MIP Maps (e.g. only for POT textures) */ bool mipMapSupport() const { return fMipMapSupport; } /** * Skia convention is that a device only has sRGB support if it supports sRGB formats for both * textures and framebuffers. In addition: * Decoding to linear of an sRGB texture can be disabled. */ bool srgbSupport() const { return fSRGBSupport; } /** * Is there support for enabling/disabling sRGB writes for sRGB-capable color buffers? */ bool srgbWriteControl() const { return fSRGBWriteControl; } bool srgbDecodeDisableSupport() const { return fSRGBDecodeDisableSupport; } bool discardRenderTargetSupport() const { return fDiscardRenderTargetSupport; } bool gpuTracingSupport() const { return fGpuTracingSupport; } bool oversizedStencilSupport() const { return fOversizedStencilSupport; } bool textureBarrierSupport() const { return fTextureBarrierSupport; } bool sampleLocationsSupport() const { return fSampleLocationsSupport; } bool multisampleDisableSupport() const { return fMultisampleDisableSupport; } bool instanceAttribSupport() const { return fInstanceAttribSupport; } bool usesMixedSamples() const { return fUsesMixedSamples; } bool preferClientSideDynamicBuffers() const { return fPreferClientSideDynamicBuffers; } // On tilers, an initial fullscreen clear is an OPTIMIZATION. It allows the hardware to // initialize each tile with a constant value rather than loading each pixel from memory. bool preferFullscreenClears() const { return fPreferFullscreenClears; } bool preferVRAMUseOverFlushes() const { return fPreferVRAMUseOverFlushes; } bool blacklistCoverageCounting() const { return fBlacklistCoverageCounting; } bool avoidStencilBuffers() const { return fAvoidStencilBuffers; } /** * Indicates the capabilities of the fixed function blend unit. */ enum BlendEquationSupport { kBasic_BlendEquationSupport, //= kAdvanced_BlendEquationSupport; } bool advancedCoherentBlendEquationSupport() const { return kAdvancedCoherent_BlendEquationSupport == fBlendEquationSupport; } bool canUseAdvancedBlendEquation(GrBlendEquation equation) const { SkASSERT(GrBlendEquationIsAdvanced(equation)); return SkToBool(fAdvBlendEqBlacklist & (1 << equation)); } /** * Indicates whether GPU->CPU memory mapping for GPU resources such as vertex buffers and * textures allows partial mappings or full mappings. */ enum MapFlags { kNone_MapFlags = 0x0, //= 0); return fBufferMapThreshold; } /** True in environments that will issue errors if memory uploaded to buffers is not initialized (even if not read by draw calls). */ bool mustClearUploadedBufferData() const { return fMustClearUploadedBufferData; } bool wireframeMode() const { return fWireframeMode; } bool sampleShadingSupport() const { return fSampleShadingSupport; } bool fenceSyncSupport() const { return fFenceSyncSupport; } bool crossContextTextureSupport() const { return fCrossContextTextureSupport; } /** * This is can be called before allocating a texture to be a dst for copySurface. This is only * used for doing dst copies needed in blends, thus the src is always a GrRenderTargetProxy. It * will populate the origin, config, and flags fields of the desc such that copySurface can * efficiently succeed. rectsMustMatch will be set to true if the copy operation must ensure * that the src and dest rects are identical. disallowSubrect will be set to true if copy rect * must equal src's bounds. */ virtual bool initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc, bool* rectsMustMatch, bool* disallowSubrect) const = 0; /** * Returns true if the GrBackendTexutre can we used with the supplied SkColorType. If it is * compatible, the passed in GrPixelConfig will be set to a config that matches the backend * format and requested SkColorType. */ virtual bool validateBackendTexture(const GrBackendTexture& tex, SkColorType ct, GrPixelConfig*) const = 0; virtual bool validateBackendRenderTarget(const GrBackendRenderTarget&, SkColorType, GrPixelConfig*) const = 0; protected: /** Subclasses must call this at the end of their constructors in order to apply caps overrides requested by the client. Note that overrides will only reduce the caps never expand them. */ void applyOptionsOverrides(const GrContextOptions& options); sk_sp fShaderCaps; bool fNPOTTextureTileSupport : 1; bool fMipMapSupport : 1; bool fSRGBSupport : 1; bool fSRGBWriteControl : 1; bool fSRGBDecodeDisableSupport : 1; bool fDiscardRenderTargetSupport : 1; bool fReuseScratchTextures : 1; bool fReuseScratchBuffers : 1; bool fGpuTracingSupport : 1; bool fOversizedStencilSupport : 1; bool fTextureBarrierSupport : 1; bool fSampleLocationsSupport : 1; bool fMultisampleDisableSupport : 1; bool fInstanceAttribSupport : 1; bool fUsesMixedSamples : 1; bool fPreferClientSideDynamicBuffers : 1; bool fPreferFullscreenClears : 1; bool fMustClearUploadedBufferData : 1; // Driver workaround bool fBlacklistCoverageCounting : 1; bool fAvoidStencilBuffers : 1; // ANGLE workaround bool fPreferVRAMUseOverFlushes : 1; bool fSampleShadingSupport : 1; // TODO: this may need to be an enum to support different fence types bool fFenceSyncSupport : 1; // Vulkan doesn't support this (yet) and some drivers have issues, too bool fCrossContextTextureSupport : 1; BlendEquationSupport fBlendEquationSupport; uint32_t fAdvBlendEqBlacklist; GR_STATIC_ASSERT(kLast_GrBlendEquation < 32); uint32_t fMapBufferFlags; int fBufferMapThreshold; int fMaxRenderTargetSize; int fMaxVertexAttributes; int fMaxTextureSize; int fMaxTileSize; int fMaxColorSampleCount; int fMaxStencilSampleCount; int fMaxRasterSamples; int fMaxWindowRectangles; int fMaxClipAnalyticFPs; private: virtual void onApplyOptionsOverrides(const GrContextOptions&) {} virtual void onDumpJSON(SkJSONWriter*) const {} bool fSuppressPrints : 1; bool fWireframeMode : 1; typedef SkRefCnt INHERITED; }; #endif