aboutsummaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorGravatar erikchen <erikchen@chromium.org>2016-02-05 12:10:55 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-02-05 12:10:55 -0800
commit7fec91ce6660190f8d7c5eb6f3061e4550cc672b (patch)
tree2b2509fa48e9c7b57220fe0a58b8b97090359263 /include
parent3601f280dc400cb75167393b0a2b6670b5f25ea4 (diff)
skia: Add support for CHROMIUM_image backed textures.
I created a new abstract base class TextureStorageAllocator that consumers of Skia can subclass and pass back to Skia. When a surface is created with a pointer to a TextureStorageAllocator, any textures it creates, or that are derived from the original surface, will allocate and deallocate storage using the methods on TextureStorageAllocator. BUG=https://code.google.com/p/chromium/issues/detail?id=579664 GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1623653002 Committed: https://skia.googlesource.com/skia/+/92098e691f10a010e7421125ba4d44c02506bb55 Review URL: https://codereview.chromium.org/1623653002
Diffstat (limited to 'include')
-rw-r--r--include/core/SkSurface.h10
-rw-r--r--include/gpu/GrTypes.h64
2 files changed, 68 insertions, 6 deletions
diff --git a/include/core/SkSurface.h b/include/core/SkSurface.h
index 52097be66e..45262d78e6 100644
--- a/include/core/SkSurface.h
+++ b/include/core/SkSurface.h
@@ -120,12 +120,16 @@ public:
/**
* Return a new surface whose contents will be drawn to an offscreen
* render target, allocated by the surface.
+ *
+ * The GrTextureStorageAllocator will be reused if SkImage snapshots create
+ * additional textures.
*/
- static SkSurface* NewRenderTarget(GrContext*, Budgeted, const SkImageInfo&, int sampleCount,
- const SkSurfaceProps* = NULL);
+ static SkSurface* NewRenderTarget(
+ GrContext*, Budgeted, const SkImageInfo&, int sampleCount, const SkSurfaceProps* = NULL,
+ GrTextureStorageAllocator = GrTextureStorageAllocator());
static SkSurface* NewRenderTarget(GrContext* gr, Budgeted b, const SkImageInfo& info) {
- return NewRenderTarget(gr, b, info, 0, NULL);
+ return NewRenderTarget(gr, b, info, 0);
}
int width() const { return fWidth; }
diff --git a/include/gpu/GrTypes.h b/include/gpu/GrTypes.h
index dbcb9a6583..767e07206e 100644
--- a/include/gpu/GrTypes.h
+++ b/include/gpu/GrTypes.h
@@ -409,6 +409,9 @@ enum GrSurfaceFlags {
GR_MAKE_BITFIELD_OPS(GrSurfaceFlags)
+// opaque type for 3D API object handles
+typedef intptr_t GrBackendObject;
+
/**
* Some textures will be stored such that the upper and left edges of the content meet at the
* the origin (in texture coord space) and for other textures the lower and left edges meet at
@@ -423,6 +426,58 @@ enum GrSurfaceOrigin {
};
/**
+ * An container of function pointers which consumers of Skia can fill in and
+ * pass to Skia. Skia will use these function pointers in place of its backend
+ * API texture creation function. Either all of the function pointers should be
+ * filled in, or they should all be nullptr.
+ */
+struct GrTextureStorageAllocator {
+ GrTextureStorageAllocator()
+ : fAllocateTextureStorage(nullptr)
+ , fDeallocateTextureStorage(nullptr) {
+ }
+
+ enum class Result {
+ kSucceededAndUploaded,
+ kSucceededWithoutUpload,
+ kFailed
+ };
+ typedef Result (*AllocateTextureStorageProc)(
+ void* ctx, GrBackendObject texture, unsigned width,
+ unsigned height, GrPixelConfig config, const void* srcData, GrSurfaceOrigin);
+ typedef void (*DeallocateTextureStorageProc)(void* ctx, GrBackendObject texture);
+
+ /*
+ * Generates and binds a texture to |textureStorageTarget()|. Allocates
+ * storage for the texture.
+ *
+ * In OpenGL, the MIN and MAX filters for the created texture must be
+ * GL_LINEAR. The WRAP_S and WRAP_T must be GL_CLAMP_TO_EDGE.
+ *
+ * If |srcData| is not nullptr, then the implementation of this function
+ * may attempt to upload the data into the texture. On successful upload,
+ * or if |srcData| is nullptr, returns kSucceededAndUploaded.
+ */
+ AllocateTextureStorageProc fAllocateTextureStorage;
+
+ /*
+ * Deallocate the storage for the given texture.
+ *
+ * Skia does not always destroy its outstanding textures. See
+ * GrContext::abandonContext() for more details. The consumer of Skia is
+ * responsible for making sure that all textures are destroyed, even if this
+ * callback is not invoked.
+ */
+ DeallocateTextureStorageProc fDeallocateTextureStorage;
+
+ /*
+ * The context to use when invoking fAllocateTextureStorage and
+ * fDeallocateTextureStorage.
+ */
+ void* fCtx;
+};
+
+/**
* Describes a surface to be created.
*/
struct GrSurfaceDesc {
@@ -454,6 +509,12 @@ struct GrSurfaceDesc {
* max supported count.
*/
int fSampleCnt;
+
+ /**
+ * A custom platform-specific allocator to use in place of the backend APIs
+ * usual texture creation method (e.g. TexImage2D in OpenGL).
+ */
+ GrTextureStorageAllocator fTextureStorageAllocator;
};
// Legacy alias
@@ -469,9 +530,6 @@ enum GrClipType {
///////////////////////////////////////////////////////////////////////////////
-// opaque type for 3D API object handles
-typedef intptr_t GrBackendObject;
-
/** Ownership rules for external GPU resources imported into Skia. */
enum GrWrapOwnership {