Bug 1332952 - Implement GetAsSourceSurface() for SharedRGBImage. r?mattwoodrow draft
authorkaro <kkoorts@mozilla.com>
Mon, 23 Jan 2017 11:06:17 +1300
changeset 465412 3591de153af35276ea26cf09aed463f9a5e40d46
parent 462612 225419844a61334893cca6c303b1364d9407076d
child 543136 45da6e6a21a1dec2f10d4888f936ad54af515276
push id42586
push userbmo:kkoorts@mozilla.com
push dateTue, 24 Jan 2017 00:41:11 +0000
reviewersmattwoodrow
bugs1332952
milestone53.0a1
Bug 1332952 - Implement GetAsSourceSurface() for SharedRGBImage. r?mattwoodrow MozReview-Commit-ID: E9zl5FchvZG
gfx/layers/ipc/SharedRGBImage.cpp
gfx/layers/ipc/SharedRGBImage.h
--- a/gfx/layers/ipc/SharedRGBImage.cpp
+++ b/gfx/layers/ipc/SharedRGBImage.cpp
@@ -101,13 +101,38 @@ TextureClient*
 SharedRGBImage::GetTextureClient(KnowsCompositor* aForwarder)
 {
   return mTextureClient.get();
 }
 
 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
 } // namespace mozilla
--- a/gfx/layers/ipc/SharedRGBImage.h
+++ b/gfx/layers/ipc/SharedRGBImage.h
@@ -46,14 +46,15 @@ public:
 
   already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override;
 
   bool Allocate(gfx::IntSize aSize, gfx::SurfaceFormat aFormat);
 private:
   gfx::IntSize mSize;
   RefPtr<ImageClient> mCompositable;
   RefPtr<TextureClient> mTextureClient;
+  nsCountedRef<nsMainThreadSourceSurfaceRef> mSourceSurface;
 };
 
 } // namespace layers
 } // namespace mozilla
 
 #endif