diff options
-rw-r--r-- | gfx/layers/ipc/SharedRGBImage.cpp | 27 | ||||
-rw-r--r-- | gfx/layers/ipc/SharedRGBImage.h | 1 |
2 files changed, 27 insertions, 1 deletions
diff --git a/gfx/layers/ipc/SharedRGBImage.cpp b/gfx/layers/ipc/SharedRGBImage.cpp index bb3bb968cd..2db2ef105a 100644 --- a/gfx/layers/ipc/SharedRGBImage.cpp +++ b/gfx/layers/ipc/SharedRGBImage.cpp @@ -106,7 +106,32 @@ SharedRGBImage::GetTextureClient(KnowsCompositor* aForwarder) already_AddRefed<gfx::SourceSurface> SharedRGBImage::GetAsSourceSurface() { - return nullptr; + NS_ASSERTION(NS_IsMainThread(), "Must be main thread"); + + if (mSourceSurface) { + RefPtr<gfx::SourceSurface> surface(mSourceSurface); + return surface.forget(); + } + + RefPtr<gfx::SourceSurface> surface; + { + // We are 'borrowing' the DrawTarget and retaining a permanent reference to + // the underlying data (via the surface). It is in this instance since we + // know that the TextureClient is always wrapping a BufferTextureData and + // therefore it won't go away underneath us. + BufferTextureData* decoded_buffer = + mTextureClient->GetInternalData()->AsBufferTextureData(); + RefPtr<gfx::DrawTarget> drawTarget = decoded_buffer->BorrowDrawTarget(); + + if (!drawTarget) { + return nullptr; + } + + surface = drawTarget->Snapshot(); + } + + mSourceSurface = surface; + return surface.forget(); } } // namespace layers diff --git a/gfx/layers/ipc/SharedRGBImage.h b/gfx/layers/ipc/SharedRGBImage.h index 2c6009c19c..7122b27bc4 100644 --- a/gfx/layers/ipc/SharedRGBImage.h +++ b/gfx/layers/ipc/SharedRGBImage.h @@ -51,6 +51,7 @@ private: gfx::IntSize mSize; RefPtr<ImageClient> mCompositable; RefPtr<TextureClient> mTextureClient; + nsCountedRef<nsMainThreadSourceSurfaceRef> mSourceSurface; }; } // namespace layers |