diff options
Diffstat (limited to 'gfx/skia/skia/include/gpu/GrTexture.h')
-rw-r--r-- | gfx/skia/skia/include/gpu/GrTexture.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/gfx/skia/skia/include/gpu/GrTexture.h b/gfx/skia/skia/include/gpu/GrTexture.h new file mode 100644 index 0000000000..ad861d5aee --- /dev/null +++ b/gfx/skia/skia/include/gpu/GrTexture.h @@ -0,0 +1,102 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrTexture_DEFINED +#define GrTexture_DEFINED + +#include "include/core/SkImage.h" +#include "include/core/SkPoint.h" +#include "include/core/SkRefCnt.h" +#include "include/gpu/GrBackendSurface.h" +#include "include/gpu/GrSurface.h" +#include "include/private/GrTypesPriv.h" + +class GrTexturePriv; + +class GrTexture : virtual public GrSurface { +public: + GrTexture* asTexture() override { return this; } + const GrTexture* asTexture() const override { return this; } + + virtual GrBackendTexture getBackendTexture() const = 0; + + /** + * This function indicates that the texture parameters (wrap mode, filtering, ...) have been + * changed externally to Skia. + */ + SK_API virtual void textureParamsModified() = 0; + + /** + * This function steals the backend texture from a uniquely owned GrTexture with no pending + * IO, passing it out to the caller. The GrTexture is deleted in the process. + * + * Note that if the GrTexture is not uniquely owned (no other refs), or has pending IO, this + * function will fail. + */ + static bool StealBackendTexture(sk_sp<GrTexture>, + GrBackendTexture*, + SkImage::BackendTextureReleaseProc*); + + /** See addIdleProc. */ + enum class IdleState { + kFlushed, + kFinished + }; + /** + * Installs a proc on this texture. It will be called when the texture becomes "idle". There + * are two types of idle states as indicated by IdleState. For managed backends (e.g. GL where + * a driver typically handles CPU/GPU synchronization of resource access) there is no difference + * between the two. They both mean "all work related to the resource has been flushed to the + * backend API and the texture is not owned outside the resource cache". + * + * If the API is unmanaged (e.g. Vulkan) then kFinished has the additional constraint that the + * work flushed to the GPU is finished. + */ + virtual void addIdleProc(sk_sp<GrRefCntedCallback> idleProc, IdleState) { + // This is the default implementation for the managed case where the IdleState can be + // ignored. Unmanaged backends, e.g. Vulkan, must override this to consider IdleState. + fIdleProcs.push_back(std::move(idleProc)); + } + /** Helper version of addIdleProc that creates the ref-counted wrapper. */ + void addIdleProc(GrRefCntedCallback::Callback callback, + GrRefCntedCallback::Context context, + IdleState state) { + this->addIdleProc(sk_make_sp<GrRefCntedCallback>(callback, context), state); + } + + /** Access methods that are only to be used within Skia code. */ + inline GrTexturePriv texturePriv(); + inline const GrTexturePriv texturePriv() const; + +protected: + GrTexture(GrGpu*, const SkISize&, GrPixelConfig, GrProtected, GrTextureType, GrMipMapsStatus); + + virtual bool onStealBackendTexture(GrBackendTexture*, SkImage::BackendTextureReleaseProc*) = 0; + + SkTArray<sk_sp<GrRefCntedCallback>> fIdleProcs; + + void willRemoveLastRef() override { + // We're about to be idle in the resource cache. Do our part to trigger the idle callbacks. + fIdleProcs.reset(); + } + void computeScratchKey(GrScratchKey*) const override; + +private: + size_t onGpuMemorySize() const override; + void markMipMapsDirty(); + void markMipMapsClean(); + + GrTextureType fTextureType; + GrMipMapsStatus fMipMapsStatus; + int fMaxMipMapLevel; + friend class GrTexturePriv; + + typedef GrSurface INHERITED; +}; + +#endif |