diff options
Diffstat (limited to 'gfx/layers/ipc/SharedRGBImage.cpp')
-rw-r--r-- | gfx/layers/ipc/SharedRGBImage.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/gfx/layers/ipc/SharedRGBImage.cpp b/gfx/layers/ipc/SharedRGBImage.cpp new file mode 100644 index 000000000..bb3bb968c --- /dev/null +++ b/gfx/layers/ipc/SharedRGBImage.cpp @@ -0,0 +1,113 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "SharedRGBImage.h" +#include "ImageTypes.h" // for ImageFormat::SHARED_RGB, etc +#include "Shmem.h" // for Shmem +#include "gfx2DGlue.h" // for ImageFormatToSurfaceFormat, etc +#include "gfxPlatform.h" // for gfxPlatform, gfxImageFormat +#include "mozilla/gfx/Point.h" // for IntSIze +#include "mozilla/layers/BufferTexture.h" +#include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator, etc +#include "mozilla/layers/ImageClient.h" // for ImageClient +#include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor, etc +#include "mozilla/layers/TextureClient.h" // for BufferTextureClient, etc +#include "mozilla/layers/ImageBridgeChild.h" // for ImageBridgeChild +#include "mozilla/mozalloc.h" // for operator delete, etc +#include "nsDebug.h" // for NS_WARNING, NS_ASSERTION +#include "nsISupportsImpl.h" // for Image::AddRef, etc +#include "nsRect.h" // for mozilla::gfx::IntRect + +// Just big enough for a 1080p RGBA32 frame +#define MAX_FRAME_SIZE (16 * 1024 * 1024) + +namespace mozilla { +namespace layers { + +already_AddRefed<Image> +CreateSharedRGBImage(ImageContainer *aImageContainer, + gfx::IntSize aSize, + gfxImageFormat aImageFormat) +{ + NS_ASSERTION(aImageFormat == gfx::SurfaceFormat::A8R8G8B8_UINT32 || + aImageFormat == gfx::SurfaceFormat::X8R8G8B8_UINT32 || + aImageFormat == gfx::SurfaceFormat::R5G6B5_UINT16, + "RGB formats supported only"); + + if (!aImageContainer) { + NS_WARNING("No ImageContainer to allocate SharedRGBImage"); + return nullptr; + } + + RefPtr<SharedRGBImage> rgbImage = aImageContainer->CreateSharedRGBImage(); + if (!rgbImage) { + NS_WARNING("Failed to create SharedRGBImage"); + return nullptr; + } + if (!rgbImage->Allocate(aSize, gfx::ImageFormatToSurfaceFormat(aImageFormat))) { + NS_WARNING("Failed to allocate a shared image"); + return nullptr; + } + return rgbImage.forget(); +} + +SharedRGBImage::SharedRGBImage(ImageClient* aCompositable) +: Image(nullptr, ImageFormat::SHARED_RGB) +, mCompositable(aCompositable) +{ + MOZ_COUNT_CTOR(SharedRGBImage); +} + +SharedRGBImage::~SharedRGBImage() +{ + MOZ_COUNT_DTOR(SharedRGBImage); + + if (mCompositable->GetAsyncID() != 0 && + !InImageBridgeChildThread()) { + ADDREF_MANUALLY(mTextureClient); + ImageBridgeChild::DispatchReleaseTextureClient(mTextureClient); + mTextureClient = nullptr; + } +} + +bool +SharedRGBImage::Allocate(gfx::IntSize aSize, gfx::SurfaceFormat aFormat) +{ + mSize = aSize; + mTextureClient = mCompositable->CreateBufferTextureClient(aFormat, aSize, + gfx::BackendType::NONE, + TextureFlags::DEFAULT); + return !!mTextureClient; +} + +uint8_t* +SharedRGBImage::GetBuffer() +{ + MappedTextureData mapped; + if (mTextureClient && mTextureClient->BorrowMappedData(mapped)) { + return mapped.data; + } + return 0; +} + +gfx::IntSize +SharedRGBImage::GetSize() +{ + return mSize; +} + +TextureClient* +SharedRGBImage::GetTextureClient(KnowsCompositor* aForwarder) +{ + return mTextureClient.get(); +} + +already_AddRefed<gfx::SourceSurface> +SharedRGBImage::GetAsSourceSurface() +{ + return nullptr; +} + +} // namespace layers +} // namespace mozilla |