aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar joshualitt <joshualitt@chromium.org>2015-07-08 12:54:04 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-07-08 12:54:04 -0700
commit81793410a80b1bb147e765caccdd7fb36e34edf8 (patch)
tree29884476878efc63b5302f5ddda666d9d75fde23 /src
parent3c06511e910524bf9456c532fe20d1b2956e7d97 (diff)
add ability to get FBO ID to Surface
Diffstat (limited to 'src')
-rw-r--r--src/gpu/gl/GrGLRenderTarget.h2
-rw-r--r--src/image/SkSurface.cpp6
-rw-r--r--src/image/SkSurface_Base.h6
-rw-r--r--src/image/SkSurface_Gpu.cpp32
-rw-r--r--src/image/SkSurface_Gpu.h5
5 files changed, 38 insertions, 13 deletions
diff --git a/src/gpu/gl/GrGLRenderTarget.h b/src/gpu/gl/GrGLRenderTarget.h
index 2113a800af..1e6dc7f767 100644
--- a/src/gpu/gl/GrGLRenderTarget.h
+++ b/src/gpu/gl/GrGLRenderTarget.h
@@ -55,6 +55,8 @@ public:
}
}
+ GrBackendObject getRenderTargetHandle() const override { return fRTFBOID; }
+
/** When we don't own the FBO ID we don't attempt to modify its attachments. */
bool canAttemptStencilAttachment() const override {
return kCached_LifeCycle == fRTLifecycle || kUncached_LifeCycle == fRTLifecycle;
diff --git a/src/image/SkSurface.cpp b/src/image/SkSurface.cpp
index 35409be810..2e8c7fa87e 100644
--- a/src/image/SkSurface.cpp
+++ b/src/image/SkSurface.cpp
@@ -175,10 +175,14 @@ bool SkSurface::readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t d
return this->getCanvas()->readPixels(dstInfo, dstPixels, dstRowBytes, srcX, srcY);
}
-GrBackendObject SkSurface::getTextureHandle(TextureHandleAccess access) {
+GrBackendObject SkSurface::getTextureHandle(BackendHandleAccess access) {
return asSB(this)->onGetTextureHandle(access);
}
+bool SkSurface::getRenderTargetHandle(GrBackendObject* obj, BackendHandleAccess access) {
+ return asSB(this)->onGetRenderTargetHandle(obj, access);
+}
+
//////////////////////////////////////////////////////////////////////////////////////
#if !SK_SUPPORT_GPU
diff --git a/src/image/SkSurface_Base.h b/src/image/SkSurface_Base.h
index 3f1301ee34..b8eb7dd5f1 100644
--- a/src/image/SkSurface_Base.h
+++ b/src/image/SkSurface_Base.h
@@ -18,10 +18,14 @@ public:
SkSurface_Base(const SkImageInfo&, const SkSurfaceProps*);
virtual ~SkSurface_Base();
- virtual GrBackendObject onGetTextureHandle(TextureHandleAccess) {
+ virtual GrBackendObject onGetTextureHandle(BackendHandleAccess) {
return 0;
}
+ virtual bool onGetRenderTargetHandle(GrBackendObject*, BackendHandleAccess) {
+ return false;
+ }
+
/**
* Allocate a canvas that will draw into this surface. We will cache this
* canvas, to return the same object to the caller multiple times. We
diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp
index 3a306ad3e6..67f54d5bbb 100644
--- a/src/image/SkSurface_Gpu.cpp
+++ b/src/image/SkSurface_Gpu.cpp
@@ -26,21 +26,37 @@ SkSurface_Gpu::~SkSurface_Gpu() {
fDevice->unref();
}
-GrBackendObject SkSurface_Gpu::onGetTextureHandle(TextureHandleAccess access) {
- GrRenderTarget* rt = fDevice->accessRenderTarget();
+static GrRenderTarget* prepare_rt_for_external_access(SkSurface_Gpu* surface,
+ SkSurface::BackendHandleAccess access) {
+ GrRenderTarget* rt = surface->getDevice()->accessRenderTarget();
switch (access) {
- case kFlushRead_TextureHandleAccess:
+ case SkSurface::kFlushRead_BackendHandleAccess:
break;
- case kFlushWrite_TextureHandleAccess:
- case kDiscardWrite_TextureHandleAccess:
+ case SkSurface::kFlushWrite_BackendHandleAccess:
+ case SkSurface::kDiscardWrite_BackendHandleAccess:
// for now we don't special-case on Discard, but we may in the future.
- this->notifyContentWillChange(kRetain_ContentChangeMode);
+ surface->notifyContentWillChange(SkSurface::kRetain_ContentChangeMode);
// legacy: need to dirty the bitmap's genID in our device (curse it)
- fDevice->fLegacyBitmap.notifyPixelsChanged();
+ surface->getDevice()->accessBitmap(false).notifyPixelsChanged();
break;
}
rt->prepareForExternalIO();
- return rt->asTexture()->getTextureHandle();
+ return rt;
+}
+
+GrBackendObject SkSurface_Gpu::onGetTextureHandle(BackendHandleAccess access) {
+ GrRenderTarget* rt = prepare_rt_for_external_access(this, access);
+ GrTexture* texture = rt->asTexture();
+ if (texture) {
+ return texture->getTextureHandle();
+ }
+ return 0;
+}
+
+bool SkSurface_Gpu::onGetRenderTargetHandle(GrBackendObject* obj, BackendHandleAccess access) {
+ GrRenderTarget* rt = prepare_rt_for_external_access(this, access);
+ *obj = rt->getRenderTargetHandle();
+ return true;
}
SkCanvas* SkSurface_Gpu::onNewCanvas() {
diff --git a/src/image/SkSurface_Gpu.h b/src/image/SkSurface_Gpu.h
index ed94a24fcd..23241540bf 100644
--- a/src/image/SkSurface_Gpu.h
+++ b/src/image/SkSurface_Gpu.h
@@ -16,12 +16,11 @@ class SkGpuDevice;
class SkSurface_Gpu : public SkSurface_Base {
public:
-
-
SkSurface_Gpu(SkGpuDevice*);
virtual ~SkSurface_Gpu();
- GrBackendObject onGetTextureHandle(TextureHandleAccess) override;
+ GrBackendObject onGetTextureHandle(BackendHandleAccess) override;
+ bool onGetRenderTargetHandle(GrBackendObject*, BackendHandleAccess) override;
SkCanvas* onNewCanvas() override;
SkSurface* onNewSurface(const SkImageInfo&) override;
SkImage* onNewImageSnapshot(Budgeted) override;