summaryrefslogtreecommitdiffstats
path: root/gfx/layers/basic/BasicCompositor.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--gfx/layers/basic/BasicCompositor.h240
1 files changed, 240 insertions, 0 deletions
diff --git a/gfx/layers/basic/BasicCompositor.h b/gfx/layers/basic/BasicCompositor.h
new file mode 100644
index 0000000000..7044088e0e
--- /dev/null
+++ b/gfx/layers/basic/BasicCompositor.h
@@ -0,0 +1,240 @@
+/* -*- 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_BASICCOMPOSITOR_H
+#define MOZILLA_GFX_BASICCOMPOSITOR_H
+
+#include "mozilla/layers/Compositor.h"
+#include "mozilla/layers/TextureHost.h"
+#include "mozilla/gfx/2D.h"
+#include "mozilla/gfx/Triangle.h"
+#include "mozilla/gfx/Polygon.h"
+
+namespace mozilla {
+namespace layers {
+
+class BasicCompositingRenderTarget : public CompositingRenderTarget {
+ public:
+ BasicCompositingRenderTarget(gfx::DrawTarget* aDrawTarget,
+ const gfx::IntRect& aRect,
+ const gfx::IntPoint& aClipSpaceOrigin)
+ : CompositingRenderTarget(aRect.TopLeft()),
+ mDrawTarget(aDrawTarget),
+ mSize(aRect.Size()),
+ mClipSpaceOrigin(aClipSpaceOrigin) {}
+
+ const char* Name() const override { return "BasicCompositingRenderTarget"; }
+
+ gfx::IntSize GetSize() const override { return mSize; }
+
+ // The point that DrawGeometry's aClipRect is relative to. Will be (0, 0) for
+ // root render targets and equal to GetOrigin() for non-root render targets.
+ gfx::IntPoint GetClipSpaceOrigin() const { return mClipSpaceOrigin; }
+
+ // In render target coordinates, i.e. the same space as GetOrigin().
+ // NOT relative to mClipSpaceOrigin!
+ void SetClipRect(const Maybe<gfx::IntRect>& aRect) { mClipRect = aRect; }
+ const Maybe<gfx::IntRect>& GetClipRect() const { return mClipRect; }
+
+ void BindRenderTarget();
+
+ gfx::SurfaceFormat GetFormat() const override {
+ return mDrawTarget ? mDrawTarget->GetFormat()
+ : gfx::SurfaceFormat(gfx::SurfaceFormat::UNKNOWN);
+ }
+
+ RefPtr<gfx::DrawTarget> mDrawTarget;
+ gfx::IntSize mSize;
+ gfx::IntPoint mClipSpaceOrigin;
+ Maybe<gfx::IntRect> mClipRect;
+};
+
+class BasicCompositor : public Compositor {
+ public:
+ BasicCompositor(CompositorBridgeParent* aParent,
+ widget::CompositorWidget* aWidget);
+
+ protected:
+ virtual ~BasicCompositor();
+
+ public:
+ BasicCompositor* AsBasicCompositor() override { return this; }
+
+ bool Initialize(nsCString* const out_failureReason) override;
+
+ void Destroy() override;
+
+ TextureFactoryIdentifier GetTextureFactoryIdentifier() override;
+
+ already_AddRefed<CompositingRenderTarget> CreateRenderTarget(
+ const gfx::IntRect& aRect, SurfaceInitMode aInit) override;
+
+ already_AddRefed<CompositingRenderTarget> CreateRenderTargetFromSource(
+ const gfx::IntRect& aRect, const CompositingRenderTarget* aSource,
+ const gfx::IntPoint& aSourcePoint) override;
+
+ virtual already_AddRefed<CompositingRenderTarget> CreateRootRenderTarget(
+ gfx::DrawTarget* aDrawTarget, const gfx::IntRect& aDrawTargetRect,
+ const gfx::IntRegion& aClearRegion);
+
+ already_AddRefed<DataTextureSource> CreateDataTextureSource(
+ TextureFlags aFlags = TextureFlags::NO_FLAGS) override;
+
+ already_AddRefed<DataTextureSource> CreateDataTextureSourceAround(
+ gfx::DataSourceSurface* aSurface) override;
+
+ already_AddRefed<DataTextureSource> CreateDataTextureSourceAroundYCbCr(
+ TextureHost* aTexture) override;
+
+ bool SupportsEffect(EffectTypes aEffect) override;
+
+ bool SupportsLayerGeometry() const override;
+
+ bool ReadbackRenderTarget(CompositingRenderTarget* aSource,
+ AsyncReadbackBuffer* aDest) override;
+
+ already_AddRefed<AsyncReadbackBuffer> CreateAsyncReadbackBuffer(
+ const gfx::IntSize& aSize) override;
+
+ bool BlitRenderTarget(CompositingRenderTarget* aSource,
+ const gfx::IntSize& aSourceSize,
+ const gfx::IntSize& aDestSize) override;
+
+ void SetRenderTarget(CompositingRenderTarget* aSource) override {
+ mRenderTarget = static_cast<BasicCompositingRenderTarget*>(aSource);
+ mRenderTarget->BindRenderTarget();
+ }
+
+ already_AddRefed<CompositingRenderTarget> GetWindowRenderTarget()
+ const override {
+ return do_AddRef(mFullWindowRenderTarget);
+ }
+
+ already_AddRefed<CompositingRenderTarget> GetCurrentRenderTarget()
+ const override {
+ return do_AddRef(mRenderTarget);
+ }
+
+ void DrawQuad(const gfx::Rect& aRect, const gfx::IntRect& aClipRect,
+ const EffectChain& aEffectChain, gfx::Float aOpacity,
+ const gfx::Matrix4x4& aTransform,
+ const gfx::Rect& aVisibleRect) override;
+
+ void ClearRect(const gfx::Rect& aRect) override;
+
+ Maybe<gfx::IntRect> BeginFrameForWindow(
+ const nsIntRegion& aInvalidRegion, const Maybe<gfx::IntRect>& aClipRect,
+ const gfx::IntRect& aRenderBounds,
+ const nsIntRegion& aOpaqueRegion) override;
+
+ Maybe<gfx::IntRect> BeginFrameForTarget(
+ const nsIntRegion& aInvalidRegion, const Maybe<gfx::IntRect>& aClipRect,
+ const gfx::IntRect& aRenderBounds, const nsIntRegion& aOpaqueRegion,
+ gfx::DrawTarget* aTarget, const gfx::IntRect& aTargetBounds) override;
+
+ void BeginFrameForNativeLayers() override;
+
+ Maybe<gfx::IntRect> BeginRenderingToNativeLayer(
+ const nsIntRegion& aInvalidRegion, const Maybe<gfx::IntRect>& aClipRect,
+ const nsIntRegion& aOpaqueRegion, NativeLayer* aNativeLayer) override;
+
+ void EndRenderingToNativeLayer() override;
+
+ void NormalDrawingDone() override;
+ void EndFrame() override;
+
+ RefPtr<SurfacePoolHandle> GetSurfacePoolHandle() override;
+
+ bool SupportsPartialTextureUpdate() override { return true; }
+ bool CanUseCanvasLayerForSize(const gfx::IntSize& aSize) override {
+ return true;
+ }
+ int32_t GetMaxTextureSize() const override;
+ void SetDestinationSurfaceSize(const gfx::IntSize& aSize) override {}
+
+ void MakeCurrent(MakeCurrentFlags aFlags = 0) override {}
+
+#ifdef MOZ_DUMP_PAINTING
+ const char* Name() const override { return "Basic"; }
+#endif // MOZ_DUMP_PAINTING
+
+ LayersBackend GetBackendType() const override {
+ return LayersBackend::LAYERS_BASIC;
+ }
+
+ bool IsPendingComposite() override { return mIsPendingEndRemoteDrawing; }
+
+ void FinishPendingComposite() override;
+
+ private:
+ template <typename Geometry>
+ void DrawGeometry(const Geometry& aGeometry, const gfx::Rect& aRect,
+ const gfx::IntRect& aClipRect,
+ const EffectChain& aEffectChain, gfx::Float aOpacity,
+ const gfx::Matrix4x4& aTransform,
+ const gfx::Rect& aVisibleRect, const bool aEnableAA);
+
+ void DrawPolygon(const gfx::Polygon& aPolygon, const gfx::Rect& aRect,
+ const gfx::IntRect& aClipRect,
+ const EffectChain& aEffectChain, gfx::Float aOpacity,
+ const gfx::Matrix4x4& aTransform,
+ const gfx::Rect& aVisibleRect) override;
+
+ void TryToEndRemoteDrawing();
+ void EndRemoteDrawing();
+
+ bool NeedsToDeferEndRemoteDrawing();
+
+ bool NeedToRecreateFullWindowRenderTarget() const;
+
+ // When rendering to a back buffer, this is the front buffer that the contents
+ // of the back buffer need to be copied to. Only non-null between
+ // BeginFrameForWindow and EndRemoteDrawing, and only when using a back
+ // buffer.
+ RefPtr<gfx::DrawTarget> mFrontBuffer;
+
+ // The current render target for drawing
+ RefPtr<BasicCompositingRenderTarget> mRenderTarget;
+
+ // The native layer that we're currently rendering to, if any.
+ // Non-null only between BeginFrameForWindow and EndFrame if
+ // BeginFrameForWindow has been called with a non-null aNativeLayer.
+ RefPtr<NativeLayer> mCurrentNativeLayer;
+
+ RefPtr<SurfacePoolHandle> mSurfacePoolHandle;
+
+ gfx::IntRegion mInvalidRegion;
+
+ uint32_t mMaxTextureSize;
+ bool mIsPendingEndRemoteDrawing;
+ bool mShouldInvalidateWindow = false;
+
+ // Where the current frame is being rendered to.
+ enum class FrameDestination : uint8_t {
+ NO_CURRENT_FRAME, // before BeginFrameForXYZ or after EndFrame
+ WINDOW, // between BeginFrameForWindow and EndFrame
+ TARGET, // between BeginFrameForTarget and EndFrame
+ NATIVE_LAYERS // between BeginFrameForNativeLayers and EndFrame
+ };
+ FrameDestination mCurrentFrameDest = FrameDestination::NO_CURRENT_FRAME;
+
+ // mDrawTarget will not be the full window on all platforms. We therefore need
+ // to keep a full window render target around when we are capturing
+ // screenshots on those platforms.
+ RefPtr<BasicCompositingRenderTarget> mFullWindowRenderTarget;
+
+ // The 1x1 dummy render target that's the "current" render target between
+ // BeginFrameForNativeLayers and EndFrame but outside pairs of
+ // Begin/EndRenderingToNativeLayer. Created on demand.
+ RefPtr<CompositingRenderTarget> mNativeLayersReferenceRT;
+};
+
+BasicCompositor* AssertBasicCompositor(Compositor* aCompositor);
+
+} // namespace layers
+} // namespace mozilla
+
+#endif /* MOZILLA_GFX_BASICCOMPOSITOR_H */