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)
29 already_AddRefed
<Image
>
30 CreateSharedRGBImage(ImageContainer
*aImageContainer
,
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");
44 nsRefPtr
<Image
> image
= aImageContainer
->CreateImage(ImageFormat::SHARED_RGB
);
47 NS_WARNING("Failed to create SharedRGBImage");
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");
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());
79 SharedRGBImage::Allocate(gfx::IntSize aSize
, gfx::SurfaceFormat aFormat
)
82 mTextureClient
= mCompositable
->CreateBufferTextureClient(aFormat
, aSize
,
83 gfx::BackendType::NONE
,
84 TextureFlags::DEFAULT
);
85 return !!mTextureClient
;
89 SharedRGBImage::GetBuffer()
91 if (!mTextureClient
) {
95 ImageDataSerializer
serializer(mTextureClient
->GetBuffer(), mTextureClient
->GetBufferSize());
96 return serializer
.GetData();
100 SharedRGBImage::GetSize()
106 SharedRGBImage::GetBufferSize()
108 return mTextureClient
? mTextureClient
->GetBufferSize()
113 SharedRGBImage::GetTextureClient(CompositableClient
* aClient
)
115 return mTextureClient
.get();
118 TemporaryRef
<gfx::SourceSurface
>
119 SharedRGBImage::GetAsSourceSurface()
124 } // namespace layers
125 } // namespace mozilla