1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "CanvasRenderer.h"
9 #include "BuildConstants.h"
10 #include "ipc/KnowsCompositor.h"
11 #include "mozilla/gfx/gfxVars.h"
12 #include "mozilla/StaticPrefs_webgl.h"
13 #include "nsICanvasRenderingContextInternal.h"
14 #include "PersistentBufferProvider.h"
15 #include "WebGLTypes.h"
18 # include "mozilla/widget/DMABufSurface.h"
19 # include "mozilla/widget/DMABufLibWrapper.h"
25 CanvasRendererData::CanvasRendererData() = default;
26 CanvasRendererData::~CanvasRendererData() = default;
30 BorrowedSourceSurface::BorrowedSourceSurface(
31 PersistentBufferProvider
* const returnTo
,
32 const RefPtr
<gfx::SourceSurface
> surf
)
33 : mReturnTo(returnTo
), mSurf(surf
) {}
35 BorrowedSourceSurface::~BorrowedSourceSurface() {
37 auto forgettable
= mSurf
;
38 mReturnTo
->ReturnSnapshot(forgettable
.forget());
44 CanvasRenderer::CanvasRenderer() { MOZ_COUNT_CTOR(CanvasRenderer
); }
46 CanvasRenderer::~CanvasRenderer() { MOZ_COUNT_DTOR(CanvasRenderer
); }
48 void CanvasRenderer::Initialize(const CanvasRendererData
& aData
) {
52 bool CanvasRenderer::IsDataValid(const CanvasRendererData
& aData
) const {
53 return mData
.GetContext() == aData
.GetContext();
56 std::shared_ptr
<BorrowedSourceSurface
> CanvasRenderer::BorrowSnapshot(
57 const bool requireAlphaPremult
) const {
58 const auto context
= mData
.GetContext();
59 if (!context
) return nullptr;
60 RefPtr
<PersistentBufferProvider
> provider
= context
->GetBufferProvider();
62 RefPtr
<gfx::SourceSurface
> ss
;
65 ss
= provider
->BorrowSnapshot();
69 ss
= context
->GetFrontBufferSnapshot(requireAlphaPremult
);
71 if (!ss
) return nullptr;
73 return std::make_shared
<BorrowedSourceSurface
>(provider
, ss
);
76 void CanvasRenderer::FirePreTransactionCallback() const {
77 if (!mData
.mDoPaintCallbacks
) return;
78 const auto context
= mData
.GetContext();
80 context
->OnBeforePaintTransaction();
83 void CanvasRenderer::FireDidTransactionCallback() const {
84 if (!mData
.mDoPaintCallbacks
) return;
85 const auto context
= mData
.GetContext();
87 context
->OnDidPaintTransaction();
90 TextureType
TexTypeForWebgl(KnowsCompositor
* const knowsCompositor
) {
91 if (!knowsCompositor
) return TextureType::Unknown
;
92 const auto layersBackend
= knowsCompositor
->GetCompositorBackendType();
94 switch (layersBackend
) {
95 case LayersBackend::LAYERS_LAST
:
96 MOZ_CRASH("Unexpected LayersBackend::LAYERS_LAST");
98 case LayersBackend::LAYERS_NONE
:
99 return TextureType::Unknown
;
101 case LayersBackend::LAYERS_WR
:
106 if (knowsCompositor
->SupportsD3D11()) {
107 return TextureType::D3D11
;
111 return TextureType::MacIOSurface
;
114 #ifdef MOZ_WIDGET_GTK
116 if (!knowsCompositor
->UsingSoftwareWebRender() &&
117 widget::DMABufDevice::IsDMABufWebGLEnabled()) {
118 return TextureType::DMABUF
;
124 if (gfx::gfxVars::UseAHardwareBufferSharedSurfaceWebglOop()) {
125 return TextureType::AndroidHardwareBuffer
;
127 if (StaticPrefs::webgl_enable_surface_texture()) {
128 return TextureType::AndroidNativeWindow
;
132 return TextureType::Unknown
;
135 } // namespace layers
136 } // namespace mozilla