Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/layers/wr/WebRenderCanvasRenderer.cpp
Line
Count
Source (jump to first uncovered line)
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/. */
6
7
#include "WebRenderCanvasRenderer.h"
8
9
#include "GLContext.h"
10
#include "GLScreenBuffer.h"
11
#include "mozilla/layers/CompositorBridgeChild.h"
12
#include "SharedSurfaceGL.h"
13
#include "WebRenderBridgeChild.h"
14
#include "WebRenderLayerManager.h"
15
16
namespace mozilla {
17
namespace layers {
18
19
CompositableForwarder*
20
WebRenderCanvasRenderer::GetForwarder()
21
0
{
22
0
  return mManager->WrBridge();
23
0
}
24
25
void
26
WebRenderCanvasRenderer::Initialize(const CanvasInitializeData& aData)
27
0
{
28
0
  ShareableCanvasRenderer::Initialize(aData);
29
0
}
30
31
WebRenderCanvasRendererAsync::~WebRenderCanvasRendererAsync()
32
0
{
33
0
  Destroy();
34
0
}
35
36
void
37
WebRenderCanvasRendererAsync::Initialize(const CanvasInitializeData& aData)
38
0
{
39
0
  WebRenderCanvasRenderer::Initialize(aData);
40
0
41
0
  if (mPipelineId.isSome()) {
42
0
    mManager->WrBridge()->RemovePipelineIdForCompositable(mPipelineId.ref());
43
0
    mPipelineId.reset();
44
0
  }
45
0
}
46
47
bool
48
WebRenderCanvasRendererAsync::CreateCompositable()
49
0
{
50
0
  if (!mCanvasClient) {
51
0
    TextureFlags flags = TextureFlags::DEFAULT;
52
0
    if (mOriginPos == gl::OriginPos::BottomLeft) {
53
0
      flags |= TextureFlags::ORIGIN_BOTTOM_LEFT;
54
0
    }
55
0
56
0
    if (!mIsAlphaPremultiplied) {
57
0
      flags |= TextureFlags::NON_PREMULTIPLIED;
58
0
    }
59
0
60
0
    mCanvasClient = CanvasClient::CreateCanvasClient(GetCanvasClientType(),
61
0
                                                     GetForwarder(),
62
0
                                                     flags);
63
0
    if (!mCanvasClient) {
64
0
      return false;
65
0
    }
66
0
67
0
    mCanvasClient->Connect();
68
0
  }
69
0
70
0
  if (!mPipelineId) {
71
0
    // Alloc async image pipeline id.
72
0
    mPipelineId = Some(mManager->WrBridge()->GetCompositorBridgeChild()->GetNextPipelineId());
73
0
    mManager->WrBridge()->AddPipelineIdForCompositable(mPipelineId.ref(),
74
0
                                                       mCanvasClient->GetIPCHandle());
75
0
  }
76
0
77
0
  return true;
78
0
}
79
80
void
81
WebRenderCanvasRendererAsync::ClearCachedResources()
82
0
{
83
0
  if (mPipelineId.isSome()) {
84
0
    mManager->WrBridge()->RemovePipelineIdForCompositable(mPipelineId.ref());
85
0
    mPipelineId.reset();
86
0
  }
87
0
}
88
89
void
90
WebRenderCanvasRendererAsync::Destroy()
91
0
{
92
0
  if (mPipelineId.isSome()) {
93
0
    mManager->WrBridge()->RemovePipelineIdForCompositable(mPipelineId.ref());
94
0
    mPipelineId.reset();
95
0
  }
96
0
}
97
98
void
99
WebRenderCanvasRendererAsync::UpdateCompositableClientForEmptyTransaction()
100
0
{
101
0
  UpdateCompositableClient();
102
0
  if (mPipelineId.isSome()) {
103
0
    // Notify an update of async image pipeline during empty transaction.
104
0
    // During non empty transaction, WebRenderBridgeParent receives OpUpdateAsyncImagePipeline message,
105
0
    // but during empty transaction, the message is not sent to WebRenderBridgeParent.
106
0
    // Then OpUpdatedAsyncImagePipeline is used to notify the update.
107
0
    mManager->WrBridge()->AddWebRenderParentCommand(OpUpdatedAsyncImagePipeline(mPipelineId.ref()));
108
0
  }
109
0
}
110
111
} // namespace layers
112
} // namespace mozilla