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 "WebRenderCanvasRenderer.h"
10 #include "GLScreenBuffer.h"
11 #include "mozilla/layers/CompositorBridgeChild.h"
12 #include "mozilla/StaticPrefs_webgl.h"
13 #include "SharedSurfaceGL.h"
14 #include "WebRenderBridgeChild.h"
19 CompositableForwarder
* WebRenderCanvasRenderer::GetForwarder() {
20 return mManager
->WrBridge();
23 WebRenderCanvasRendererAsync::~WebRenderCanvasRendererAsync() {
24 if (mPipelineId
.isSome()) {
25 mManager
->RemovePipelineIdForCompositable(mPipelineId
.ref());
30 void WebRenderCanvasRendererAsync::Initialize(const CanvasRendererData
& aData
) {
31 WebRenderCanvasRenderer::Initialize(aData
);
33 ClearCachedResources();
36 bool WebRenderCanvasRendererAsync::CreateCompositable() {
38 auto compositableFlags
= TextureFlags::NO_FLAGS
;
39 if (!mData
.mIsAlphaPremult
) {
40 // WR needs this flag marked on the compositable, not just the texture.
41 compositableFlags
|= TextureFlags::NON_PREMULTIPLIED
;
43 mCanvasClient
= new CanvasClient(GetForwarder(), compositableFlags
);
44 mCanvasClient
->Connect();
49 void WebRenderCanvasRendererAsync::EnsurePipeline() {
50 MOZ_ASSERT(mCanvasClient
);
59 // Alloc async image pipeline id.
61 mManager
->WrBridge()->GetCompositorBridgeChild()->GetNextPipelineId());
62 mManager
->AddPipelineIdForCompositable(
63 mPipelineId
.ref(), mCanvasClient
->GetIPCHandle(),
64 CompositableHandleOwner::WebRenderBridge
);
67 bool WebRenderCanvasRendererAsync::HasPipeline() {
68 return mPipelineId
.isSome();
71 void WebRenderCanvasRendererAsync::ClearCachedResources() {
72 if (mPipelineId
.isSome()) {
73 mManager
->RemovePipelineIdForCompositable(mPipelineId
.ref());
78 void WebRenderCanvasRendererAsync::
79 UpdateCompositableClientForEmptyTransaction() {
80 bool wasDirty
= IsDirty();
81 UpdateCompositableClient();
82 if (wasDirty
&& mPipelineId
.isSome()) {
83 // Notify an update of async image pipeline during empty transaction.
84 // During non empty transaction, WebRenderBridgeParent receives
85 // OpUpdateAsyncImagePipeline message, but during empty transaction, the
86 // message is not sent to WebRenderBridgeParent. Then
87 // OpUpdatedAsyncImagePipeline is used to notify the update.
88 mManager
->AddWebRenderParentCommand(
89 OpUpdatedAsyncImagePipeline(mPipelineId
.ref()));
94 } // namespace mozilla