/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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 MOZILLA_GFX_RENDERCOMPOSITOR_ANGLE_H #define MOZILLA_GFX_RENDERCOMPOSITOR_ANGLE_H #include #include "GLTypes.h" #include "mozilla/Maybe.h" #include "mozilla/webrender/RenderCompositor.h" #include "mozilla/webrender/RenderThread.h" struct ID3D11DeviceContext; struct ID3D11Device; struct ID3D11Query; struct IDXGIFactory2; struct IDXGISwapChain; struct IDXGISwapChain1; namespace mozilla { namespace gl { class GLLibraryEGL; } // namespace gl namespace wr { class DCLayerTree; class RenderCompositorANGLE : public RenderCompositor { public: static UniquePtr Create( const RefPtr& aWidget, nsACString& aError); explicit RenderCompositorANGLE( const RefPtr& aWidget, RefPtr&& aGL); virtual ~RenderCompositorANGLE(); bool Initialize(nsACString& aError); bool BeginFrame() override; RenderedFrameId EndFrame(const nsTArray& aDirtyRects) final; bool WaitForGPU() override; RenderedFrameId GetLastCompletedFrameId() final; RenderedFrameId UpdateFrameId() final; void Pause() override; bool Resume() override; void Update() override; gl::GLContext* gl() const override { return mGL; } bool MakeCurrent() override; bool UseANGLE() const override { return true; } bool UseDComp() const override { return !!mDCLayerTree; } bool UseTripleBuffering() const override { return mUseTripleBuffering; } layers::WebRenderCompositor CompositorType() const override { if (UseDComp()) { return layers::WebRenderCompositor::DIRECT_COMPOSITION; } return layers::WebRenderCompositor::DRAW; } LayoutDeviceIntSize GetBufferSize() override; GLenum IsContextLost(bool aForce) override; bool SurfaceOriginIsTopLeft() override { return true; } bool SupportAsyncScreenshot() override; bool ShouldUseNativeCompositor() override; // Interface for wr::Compositor void CompositorBeginFrame() override; void CompositorEndFrame() override; void Bind(wr::NativeTileId aId, wr::DeviceIntPoint* aOffset, uint32_t* aFboId, wr::DeviceIntRect aDirtyRect, wr::DeviceIntRect aValidRect) override; void Unbind() override; void CreateSurface(wr::NativeSurfaceId aId, wr::DeviceIntPoint aVirtualOffset, wr::DeviceIntSize aTileSize, bool aIsOpaque) override; void CreateExternalSurface(wr::NativeSurfaceId aId, bool aIsOpaque) override; void DestroySurface(NativeSurfaceId aId) override; void CreateTile(wr::NativeSurfaceId aId, int32_t aX, int32_t aY) override; void DestroyTile(wr::NativeSurfaceId aId, int32_t aX, int32_t aY) override; void AttachExternalImage(wr::NativeSurfaceId aId, wr::ExternalImageId aExternalImage) override; void AddSurface(wr::NativeSurfaceId aId, const wr::CompositorSurfaceTransform& aTransform, wr::DeviceIntRect aClipRect, wr::ImageRendering aImageRendering) override; void EnableNativeCompositor(bool aEnable) override; void GetCompositorCapabilities(CompositorCapabilities* aCaps) override; // Interface for partial present bool UsePartialPresent() override; bool RequestFullRender() override; uint32_t GetMaxPartialPresentRects() override; bool MaybeReadback(const gfx::IntSize& aReadbackSize, const wr::ImageFormat& aReadbackFormat, const Range& aReadbackBuffer, bool* aNeedsYFlip) override; protected: bool UseCompositor(); void InitializeUsePartialPresent(); void InsertGraphicsCommandsFinishedWaitQuery( RenderedFrameId aRenderedFrameId); bool WaitForPreviousGraphicsCommandsFinishedQuery(bool aWaitAll = false); bool ResizeBufferIfNeeded(); bool CreateEGLSurface(); void DestroyEGLSurface(); ID3D11Device* GetDeviceOfEGLDisplay(nsACString& aError); bool CreateSwapChain(nsACString& aError); void CreateSwapChainForDCompIfPossible(IDXGIFactory2* aDXGIFactory2); RefPtr CreateSwapChainForDComp(bool aUseTripleBuffering); RefPtr GetD3D11Query(); void ReleaseNativeCompositorResources(); HWND GetCompositorHwnd(); RefPtr mGL; EGLConfig mEGLConfig = nullptr; EGLSurface mEGLSurface = nullptr; bool mUseTripleBuffering = false; RefPtr mDevice; RefPtr mCtx; RefPtr mSwapChain; RefPtr mSwapChain1; UniquePtr mDCLayerTree; std::queue>> mWaitForPresentQueries; RefPtr mRecycledQuery; RenderedFrameId mLastCompletedFrameId; Maybe mBufferSize; bool mUseNativeCompositor = true; bool mUsePartialPresent = false; bool mFullRender = false; // Used to know a timing of disabling native compositor. bool mDisablingNativeCompositor = false; bool mFirstPresent = true; }; } // namespace wr } // namespace mozilla #endif