diff options
author | 2015-07-08 12:54:04 -0700 | |
---|---|---|
committer | 2015-07-08 12:54:04 -0700 | |
commit | 81793410a80b1bb147e765caccdd7fb36e34edf8 (patch) | |
tree | 29884476878efc63b5302f5ddda666d9d75fde23 /src | |
parent | 3c06511e910524bf9456c532fe20d1b2956e7d97 (diff) |
add ability to get FBO ID to Surface
BUG=skia:
Review URL: https://codereview.chromium.org/1220733007
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/gl/GrGLRenderTarget.h | 2 | ||||
-rw-r--r-- | src/image/SkSurface.cpp | 6 | ||||
-rw-r--r-- | src/image/SkSurface_Base.h | 6 | ||||
-rw-r--r-- | src/image/SkSurface_Gpu.cpp | 32 | ||||
-rw-r--r-- | src/image/SkSurface_Gpu.h | 5 |
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; |