/* -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40; -*- */ /* 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/. */ #ifndef SHARED_SURFACE_ANGLE_H_ #define SHARED_SURFACE_ANGLE_H_ #include #include "SharedSurface.h" struct IDXGIKeyedMutex; struct ID3D11Texture2D; namespace mozilla { namespace gl { class GLContext; class GLLibraryEGL; class SharedSurface_ANGLEShareHandle : public SharedSurface { public: static UniquePtr Create(GLContext* gl, EGLContext context, EGLConfig config, const gfx::IntSize& size, bool hasAlpha); static SharedSurface_ANGLEShareHandle* Cast(SharedSurface* surf) { MOZ_ASSERT(surf->mType == SharedSurfaceType::EGLSurfaceANGLE); return (SharedSurface_ANGLEShareHandle*)surf; } protected: GLLibraryEGL* const mEGL; const EGLContext mContext; const EGLSurface mPBuffer; public: const HANDLE mShareHandle; protected: RefPtr mKeyedMutex; RefPtr mConsumerKeyedMutex; RefPtr mConsumerTexture; const GLuint mFence; SharedSurface_ANGLEShareHandle(GLContext* gl, GLLibraryEGL* egl, const gfx::IntSize& size, bool hasAlpha, EGLContext context, EGLSurface pbuffer, HANDLE shareHandle, const RefPtr& keyedMutex, GLuint fence); EGLDisplay Display(); public: virtual ~SharedSurface_ANGLEShareHandle(); virtual void LockProdImpl() override; virtual void UnlockProdImpl() override; virtual void Fence() override; virtual void ProducerAcquireImpl() override; virtual void ProducerReleaseImpl() override; virtual void ProducerReadAcquireImpl() override; virtual void ProducerReadReleaseImpl() override; virtual void ConsumerAcquireImpl() override; virtual void ConsumerReleaseImpl() override; virtual bool WaitSync() override; virtual bool PollSync() override; virtual void Fence_ContentThread_Impl() override; virtual bool WaitSync_ContentThread_Impl() override; virtual bool PollSync_ContentThread_Impl() override; const RefPtr& GetConsumerTexture() const { return mConsumerTexture; } virtual bool ToSurfaceDescriptor(layers::SurfaceDescriptor* const out_descriptor) override; }; class SurfaceFactory_ANGLEShareHandle : public SurfaceFactory { protected: GLContext* const mProdGL; GLLibraryEGL* const mEGL; EGLContext mContext; EGLConfig mConfig; public: static UniquePtr Create(GLContext* gl, const SurfaceCaps& caps, const RefPtr& allocator, const layers::TextureFlags& flags); protected: SurfaceFactory_ANGLEShareHandle(GLContext* gl, const SurfaceCaps& caps, const RefPtr& allocator, const layers::TextureFlags& flags, GLLibraryEGL* egl, bool* const out_success); virtual UniquePtr CreateShared(const gfx::IntSize& size) override { bool hasAlpha = mReadCaps.alpha; return SharedSurface_ANGLEShareHandle::Create(mProdGL, mContext, mConfig, size, hasAlpha); } }; } /* namespace gfx */ } /* namespace mozilla */ #endif /* SHARED_SURFACE_ANGLE_H_ */