1 /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 4; -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "SharedSurface.h"
9 #include "GLBlitHelper.h"
10 #include "GLContext.h"
11 #include "GLReadTexImageHelper.h"
12 #include "GLScreenBuffer.h"
13 #include "nsThreadUtils.h"
14 #include "ScopedGLHelpers.h"
15 #include "SharedSurfaceGL.h"
16 #include "SharedSurfaceEGL.h"
17 #include "mozilla/gfx/Logging.h"
18 #include "mozilla/layers/CompositorTypes.h"
19 #include "mozilla/layers/TextureClientSharedSurface.h"
20 #include "mozilla/layers/TextureForwarder.h"
21 #include "mozilla/StaticPrefs_webgl.h"
22 #include "mozilla/Unused.h"
23 #include "VRManagerChild.h"
26 # include "SharedSurfaceANGLE.h"
27 # include "SharedSurfaceD3D11Interop.h"
31 # include "SharedSurfaceIO.h"
35 # include "gfxPlatformGtk.h"
36 # include "SharedSurfaceDMABUF.h"
39 #ifdef MOZ_WIDGET_ANDROID
40 # include "SharedSurfaceAndroidHardwareBuffer.h"
46 ////////////////////////////////////////////////////////////////////////
49 SharedSurface::SharedSurface(const SharedSurfaceDesc
& desc
,
50 UniquePtr
<MozFramebuffer
> fb
)
51 : mDesc(desc
), mFb(std::move(fb
)) {}
53 SharedSurface::~SharedSurface() = default;
55 void SharedSurface::LockProd() {
56 MOZ_ASSERT(!mIsLocked
);
60 mDesc
.gl
->LockSurface(this);
64 void SharedSurface::UnlockProd() {
65 if (!mIsLocked
) return;
69 mDesc
.gl
->UnlockSurface(this);
73 ////////////////////////////////////////////////////////////////////////
77 UniquePtr
<SurfaceFactory
> SurfaceFactory::Create(
78 GLContext
* const pGl
, const layers::TextureType consumerType
) {
81 switch (consumerType
) {
82 case layers::TextureType::D3D11
:
85 return SurfaceFactory_ANGLEShareHandle::Create(gl
);
87 if (StaticPrefs::webgl_dxgl_enabled()) {
88 return SurfaceFactory_D3D11Interop::Create(gl
);
93 case layers::TextureType::MacIOSurface
:
95 return MakeUnique
<SurfaceFactory_IOSurface
>(gl
);
100 case layers::TextureType::DMABUF
:
102 if (gl
.GetContextType() == GLContextType::EGL
&&
103 widget::GetDMABufDevice()->IsDMABufWebGLEnabled()) {
104 return SurfaceFactory_DMABUF::Create(gl
);
109 case layers::TextureType::AndroidNativeWindow
:
110 #ifdef MOZ_WIDGET_ANDROID
111 return MakeUnique
<SurfaceFactory_SurfaceTexture
>(gl
);
116 case layers::TextureType::AndroidHardwareBuffer
:
117 #ifdef MOZ_WIDGET_ANDROID
118 return SurfaceFactory_AndroidHardwareBuffer::Create(gl
);
123 case layers::TextureType::EGLImage
:
124 #ifdef MOZ_WIDGET_ANDROID
125 if (XRE_IsParentProcess()) {
126 return SurfaceFactory_EGLImage::Create(gl
);
131 case layers::TextureType::Unknown
:
132 case layers::TextureType::Last
:
137 // Silence a warning.
144 SurfaceFactory::SurfaceFactory(const PartialSharedSurfaceDesc
& partialDesc
)
145 : mDesc(partialDesc
), mMutex("SurfaceFactor::mMutex") {}
147 SurfaceFactory::~SurfaceFactory() = default;
150 } // namespace mozilla