/* -*- 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_layers_mlgpu_RenderViewMLGPU_h #define mozilla_gfx_layers_mlgpu_RenderViewMLGPU_h #include "LayerManagerMLGPU.h" #include "ClearRegionHelper.h" #include "RenderPassMLGPU.h" #include "Units.h" #include namespace mozilla { namespace layers { class FrameBuilder; class ContainerLayerMLGPU; class MLGRenderTarget; class RenderViewMLGPU { public: NS_INLINE_DECL_REFCOUNTING(RenderViewMLGPU) // Constructor for the widget render target. RenderViewMLGPU(FrameBuilder* aBuilder, MLGRenderTarget* aTarget, const nsIntRegion& aInvalidRegion); // Constructor for intermediate surfaces. RenderViewMLGPU(FrameBuilder* aBuilder, ContainerLayerMLGPU* aContainer, RenderViewMLGPU* aParent); void Prepare(); void Render(); void AddChild(RenderViewMLGPU* aParent); void AddItem(LayerMLGPU* aItem, const gfx::IntRect& aBounds, Maybe&& aGeometry); void FinishBuilding(); const gfx::IntPoint& GetTargetOffset() const { return mTargetOffset; } RenderViewMLGPU* GetParent() const { return mParent; } bool HasDepthBuffer() const { return mUseDepthBuffer; } // Render after having previously delayed rendering due to the view // requiring a backdrop copy. void RenderAfterBackdropCopy(); void RestoreDeviceState(); // The size and render target cannot be read until the view has finished // building, since we try to right-size the render target to the visible // region. MLGRenderTarget* GetRenderTarget() const; gfx::IntSize GetSize() const; gfx::IntRect GetInvalidRect() const { return mInvalidBounds; } private: RenderViewMLGPU(FrameBuilder* aBuilder, RenderViewMLGPU* aParent); ~RenderViewMLGPU(); void ExecuteRendering(); bool UpdateVisibleRegion(ItemInfo& aItem); void AddItemFrontToBack(LayerMLGPU* aLayer, ItemInfo& aItem); void AddItemBackToFront(LayerMLGPU* aLayer, ItemInfo& aItem); void PrepareClears(); void SetDeviceState(); void SetDepthTestMode(MLGDepthTestMode aMode); void ExecutePass(RenderPassMLGPU* aPass); // Return the sorting index offset to use. int32_t PrepareDepthBuffer(); private: std::deque> mFrontToBack; std::deque> mBackToFront; FrameBuilder* mBuilder; RefPtr mDevice; RenderViewMLGPU* mParent; std::vector> mChildren; // Shader data. ConstantBufferSection mWorldConstants; // Information for the initial target surface clear. This covers the area that // won't be occluded by opaque content. ClearRegionHelper mPreClear; // The post-clear region, that must be cleared after all drawing is done. nsIntRegion mPostClearRegion; ClearRegionHelper mPostClear; // Either an MLGSwapChain-derived render target, or an intermediate surface. RefPtr mTarget; // For intermediate render targets only, this is the layer owning the render // target. ContainerLayerMLGPU* mContainer; // The offset adjustment from container layer space to render target space. // This is 0,0 for the root view. gfx::IntPoint mTargetOffset; // The invalid bounds as computed by LayerTreeInvalidation. This is the // initial render bounds size, if invalidation is disabled. gfx::IntRect mInvalidBounds; // The occluded region, which is updated every time we process an opaque, // rectangular item. This is not actually in LayerPixels, we do this to // avoid FromUnknownRegion which has array copies. LayerIntRegion mOccludedRegion; // True if we've finished adding layers to the view. bool mFinishedBuilding; // This state is used to avoid changing buffers while we execute batches. size_t mCurrentLayerBufferIndex; size_t mCurrentMaskRectBufferIndex; // This state is saved locally so it can be restored in RestoreDeviceState. MLGDepthTestMode mCurrentDepthMode; // Depth-buffer tracking. int32_t mNextSortIndex; bool mUseDepthBuffer; bool mDepthBufferNeedsClear; }; } // namespace layers } // namespace mozilla #endif // mozilla_gfx_layers_mlgpu_RenderViewMLGPU_h