/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrTextureProxy_DEFINED #define GrTextureProxy_DEFINED #include "GrSamplerState.h" #include "GrSurfaceProxy.h" class GrCaps; class GrDeferredProxyUploader; class GrResourceCache; class GrResourceProvider; class GrTextureOpList; class GrTextureProxyPriv; // This class delays the acquisition of textures until they are actually required class GrTextureProxy : virtual public GrSurfaceProxy { public: GrTextureProxy* asTextureProxy() override { return this; } const GrTextureProxy* asTextureProxy() const override { return this; } // Actually instantiate the backing texture, if necessary bool instantiate(GrResourceProvider*) override; GrSamplerState::Filter highestFilterMode() const; GrMipMapped mipMapped() const { return fMipMapped; } /** * Return the texture proxy's unique key. It will be invalid if the proxy doesn't have one. */ const GrUniqueKey& getUniqueKey() const { #ifdef SK_DEBUG if (fTarget && fUniqueKey.isValid()) { SkASSERT(fTarget->getUniqueKey().isValid()); // It is possible for a non-keyed proxy to have a uniquely keyed resource assigned to // it. This just means that a future user of the resource will be filling it with unique // data. However, if the proxy has a unique key its attached resource should also // have that key. SkASSERT(fUniqueKey == fTarget->getUniqueKey()); } #endif return fUniqueKey; } /** * Internal-only helper class used for manipulations of the resource by the cache. */ class CacheAccess; inline CacheAccess cacheAccess(); inline const CacheAccess cacheAccess() const; // Provides access to special purpose functions. GrTextureProxyPriv texPriv(); const GrTextureProxyPriv texPriv() const; protected: friend class GrSurfaceProxy; // for ctors friend class GrTextureProxyPriv; // Deferred version GrTextureProxy(const GrSurfaceDesc& srcDesc, SkBackingFit, SkBudgeted, const void* srcData, size_t srcRowBytes, uint32_t flags); // Lazy-callback version GrTextureProxy(LazyInstantiateCallback&&, GrPixelConfig); // Wrapped version GrTextureProxy(sk_sp, GrSurfaceOrigin); ~GrTextureProxy() override; SkDestinationSurfaceColorMode mipColorMode() const { return fMipColorMode; } sk_sp createSurface(GrResourceProvider*) const override; private: GrMipMapped fMipMapped; SkDestinationSurfaceColorMode fMipColorMode; GrUniqueKey fUniqueKey; GrResourceCache* fCache; // only set when fUniqueKey is valid // Only used for proxies whose contents are being prepared on a worker thread. This object // stores the texture data, allowing the proxy to remain uninstantiated until flush. At that // point, the proxy is instantiated, and this data is used to perform an ASAP upload. std::unique_ptr fDeferredUploader; size_t onUninstantiatedGpuMemorySize() const override; // Methods made available via GrTextureProxy::CacheAccess void setUniqueKey(GrResourceCache*, const GrUniqueKey&); void clearUniqueKey(); SkDEBUGCODE(void validateLazyTexture(const GrTexture*) override;) // For wrapped proxies the GrTexture pointer is stored in GrIORefProxy. // For deferred proxies that pointer will be filled in when we need to instantiate // the deferred resource typedef GrSurfaceProxy INHERITED; }; #endif