Merge mozilla-central to autoland. CLOSED TREE
[gecko.git] / gfx / layers / wr / WebRenderCanvasRenderer.cpp
blob47dd08a7a45d9745ecce745fd0c988717a491445
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"
9 #include "GLContext.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"
16 namespace mozilla {
17 namespace layers {
19 CompositableForwarder* WebRenderCanvasRenderer::GetForwarder() {
20 return mManager->WrBridge();
23 WebRenderCanvasRendererAsync::~WebRenderCanvasRendererAsync() {
24 if (mPipelineId.isSome()) {
25 mManager->RemovePipelineIdForCompositable(mPipelineId.ref());
26 mPipelineId.reset();
30 void WebRenderCanvasRendererAsync::Initialize(const CanvasRendererData& aData) {
31 WebRenderCanvasRenderer::Initialize(aData);
33 ClearCachedResources();
36 bool WebRenderCanvasRendererAsync::CreateCompositable() {
37 if (!mCanvasClient) {
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();
46 return true;
49 void WebRenderCanvasRendererAsync::EnsurePipeline() {
50 MOZ_ASSERT(mCanvasClient);
51 if (!mCanvasClient) {
52 return;
55 if (mPipelineId) {
56 return;
59 // Alloc async image pipeline id.
60 mPipelineId = Some(
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());
74 mPipelineId.reset();
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()));
93 } // namespace layers
94 } // namespace mozilla