summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/include/gpu/GrTexture.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/include/gpu/GrTexture.h')
-rw-r--r--gfx/skia/skia/include/gpu/GrTexture.h102
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