From 15d607a200671a02417318327e6c9104a0991899 Mon Sep 17 00:00:00 2001 From: Andrew Osmond Date: Mon, 30 Oct 2017 09:10:45 -0400 Subject: [PATCH] Bug 1331944 - Part 6. Expand SharedSurfacesChild to support sharing ImageContainers directly. r=jrmuizel --- gfx/layers/ipc/SharedSurfacesChild.cpp | 31 ++++++++++++++++++++++++++ gfx/layers/ipc/SharedSurfacesChild.h | 1 + 2 files changed, 32 insertions(+) diff --git a/gfx/layers/ipc/SharedSurfacesChild.cpp b/gfx/layers/ipc/SharedSurfacesChild.cpp index f18ac4d68d3f..f38804716146 100644 --- a/gfx/layers/ipc/SharedSurfacesChild.cpp +++ b/gfx/layers/ipc/SharedSurfacesChild.cpp @@ -155,6 +155,37 @@ SharedSurfacesChild::Share(SourceSurfaceSharedData* aSurface, return NS_OK; } +/* static */ nsresult +SharedSurfacesChild::Share(ImageContainer* aContainer, + wr::ExternalImageId& aId, + uint32_t& aGeneration) +{ + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(aContainer); + + if (aContainer->IsAsync()) { + return NS_ERROR_NOT_IMPLEMENTED; + } + + AutoTArray images; + aContainer->GetCurrentImages(&images, &aGeneration); + if (images.IsEmpty()) { + return NS_ERROR_NOT_AVAILABLE; + } + + RefPtr surface = images[0].mImage->GetAsSourceSurface(); + if (!surface) { + return NS_ERROR_NOT_IMPLEMENTED; + } + + if (surface->GetType() != SurfaceType::DATA_SHARED) { + return NS_ERROR_NOT_IMPLEMENTED; + } + + auto sharedSurface = static_cast(surface.get()); + return Share(sharedSurface, aId); +} + /* static */ void SharedSurfacesChild::Unshare(const wr::ExternalImageId& aId) { diff --git a/gfx/layers/ipc/SharedSurfacesChild.h b/gfx/layers/ipc/SharedSurfacesChild.h index 2947ef8a700a..b2b46f432d98 100644 --- a/gfx/layers/ipc/SharedSurfacesChild.h +++ b/gfx/layers/ipc/SharedSurfacesChild.h @@ -26,6 +26,7 @@ class SharedSurfacesChild final { public: static nsresult Share(gfx::SourceSurfaceSharedData* aSurface, wr::ExternalImageId& aId); + static nsresult Share(ImageContainer* aContainer, wr::ExternalImageId& aId, uint32_t& aGeneration); private: SharedSurfacesChild() = delete;