Bumping manifests a=b2g-bump
[gecko.git] / gfx / layers / ipc / SharedRGBImage.cpp
bloba7517a76b637e42b5bf3de298fdcdea583cbc504
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "SharedRGBImage.h"
6 #include "ImageTypes.h" // for ImageFormat::SHARED_RGB, etc
7 #include "Shmem.h" // for Shmem
8 #include "gfx2DGlue.h" // for ImageFormatToSurfaceFormat, etc
9 #include "gfxPlatform.h" // for gfxPlatform, gfxImageFormat
10 #include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator, etc
11 #include "mozilla/layers/ImageClient.h" // for ImageClient
12 #include "mozilla/layers/ImageDataSerializer.h" // for ImageDataSerializer
13 #include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor, etc
14 #include "mozilla/layers/TextureClient.h" // for BufferTextureClient, etc
15 #include "mozilla/layers/ImageBridgeChild.h" // for ImageBridgeChild
16 #include "mozilla/mozalloc.h" // for operator delete, etc
17 #include "nsAutoPtr.h" // for nsRefPtr
18 #include "nsDebug.h" // for NS_WARNING, NS_ASSERTION
19 #include "nsISupportsImpl.h" // for Image::AddRef, etc
20 #include "nsRect.h" // for nsIntRect
21 #include "nsSize.h" // for nsIntSize
23 // Just big enough for a 1080p RGBA32 frame
24 #define MAX_FRAME_SIZE (16 * 1024 * 1024)
26 namespace mozilla {
27 namespace layers {
29 already_AddRefed<Image>
30 CreateSharedRGBImage(ImageContainer *aImageContainer,
31 nsIntSize aSize,
32 gfxImageFormat aImageFormat)
34 NS_ASSERTION(aImageFormat == gfxImageFormat::ARGB32 ||
35 aImageFormat == gfxImageFormat::RGB24 ||
36 aImageFormat == gfxImageFormat::RGB16_565,
37 "RGB formats supported only");
39 if (!aImageContainer) {
40 NS_WARNING("No ImageContainer to allocate SharedRGBImage");
41 return nullptr;
44 nsRefPtr<Image> image = aImageContainer->CreateImage(ImageFormat::SHARED_RGB);
46 if (!image) {
47 NS_WARNING("Failed to create SharedRGBImage");
48 return nullptr;
51 nsRefPtr<SharedRGBImage> rgbImage = static_cast<SharedRGBImage*>(image.get());
52 if (!rgbImage->Allocate(gfx::ToIntSize(aSize),
53 gfx::ImageFormatToSurfaceFormat(aImageFormat))) {
54 NS_WARNING("Failed to allocate a shared image");
55 return nullptr;
57 return image.forget();
60 SharedRGBImage::SharedRGBImage(ImageClient* aCompositable)
61 : Image(nullptr, ImageFormat::SHARED_RGB)
62 , mCompositable(aCompositable)
64 MOZ_COUNT_CTOR(SharedRGBImage);
67 SharedRGBImage::~SharedRGBImage()
69 MOZ_COUNT_DTOR(SharedRGBImage);
71 if (mCompositable->GetAsyncID() != 0 &&
72 !InImageBridgeChildThread()) {
73 ImageBridgeChild::DispatchReleaseTextureClient(mTextureClient.forget().drop());
74 ImageBridgeChild::DispatchReleaseImageClient(mCompositable.forget().drop());
78 bool
79 SharedRGBImage::Allocate(gfx::IntSize aSize, gfx::SurfaceFormat aFormat)
81 mSize = aSize;
82 mTextureClient = mCompositable->CreateBufferTextureClient(aFormat, aSize,
83 gfx::BackendType::NONE,
84 TextureFlags::DEFAULT);
85 return !!mTextureClient;
88 uint8_t*
89 SharedRGBImage::GetBuffer()
91 if (!mTextureClient) {
92 return nullptr;
95 ImageDataSerializer serializer(mTextureClient->GetBuffer(), mTextureClient->GetBufferSize());
96 return serializer.GetData();
99 gfx::IntSize
100 SharedRGBImage::GetSize()
102 return mSize;
105 size_t
106 SharedRGBImage::GetBufferSize()
108 return mTextureClient ? mTextureClient->GetBufferSize()
109 : 0;
112 TextureClient*
113 SharedRGBImage::GetTextureClient(CompositableClient* aClient)
115 return mTextureClient.get();
118 TemporaryRef<gfx::SourceSurface>
119 SharedRGBImage::GetAsSourceSurface()
121 return nullptr;
124 } // namespace layers
125 } // namespace mozilla