Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 : * This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #include "WebRenderLayer.h"
7 :
8 : #include "gfxPrefs.h"
9 : #include "LayersLogging.h"
10 : #include "mozilla/layers/ImageClient.h"
11 : #include "mozilla/layers/WebRenderBridgeChild.h"
12 : #include "mozilla/layers/WebRenderLayerManager.h"
13 : #include "nsThreadUtils.h"
14 : #include "UnitTransforms.h"
15 :
16 : namespace mozilla {
17 :
18 : using namespace gfx;
19 :
20 : namespace layers {
21 :
22 : WebRenderLayerManager*
23 0 : WebRenderLayer::WrManager()
24 : {
25 0 : return static_cast<WebRenderLayerManager*>(GetLayer()->Manager());
26 : }
27 :
28 : WebRenderBridgeChild*
29 0 : WebRenderLayer::WrBridge()
30 : {
31 0 : return WrManager()->WrBridge();
32 : }
33 :
34 : WrImageKey
35 0 : WebRenderLayer::GetImageKey()
36 : {
37 : WrImageKey key;
38 0 : key.mNamespace = WrBridge()->GetNamespace();
39 0 : key.mHandle = WrBridge()->GetNextResourceId();
40 0 : return key;
41 : }
42 :
43 : Maybe<WrImageMask>
44 0 : WebRenderLayer::BuildWrMaskLayer(const StackingContextHelper& aRelativeTo)
45 : {
46 0 : if (GetLayer()->GetMaskLayer()) {
47 0 : WebRenderLayer* maskLayer = ToWebRenderLayer(GetLayer()->GetMaskLayer());
48 0 : gfx::Matrix4x4 transform = maskLayer->GetLayer()->GetTransform();
49 0 : return maskLayer->RenderMaskLayer(aRelativeTo, transform);
50 : }
51 :
52 0 : return Nothing();
53 : }
54 :
55 : LayerRect
56 0 : WebRenderLayer::Bounds()
57 : {
58 0 : return LayerRect(GetLayer()->GetVisibleRegion().GetBounds());
59 : }
60 :
61 : BoundsTransformMatrix
62 0 : WebRenderLayer::BoundsTransform()
63 : {
64 0 : gfx::Matrix4x4 transform = GetLayer()->GetTransform();
65 0 : transform._41 = 0.0f;
66 0 : transform._42 = 0.0f;
67 0 : transform._43 = 0.0f;
68 0 : return ViewAs<BoundsTransformMatrix>(transform);
69 : }
70 :
71 : LayerRect
72 0 : WebRenderLayer::BoundsForStackingContext()
73 : {
74 0 : LayerRect bounds = Bounds();
75 0 : BoundsTransformMatrix transform = BoundsTransform();
76 0 : if (!transform.IsIdentity()) {
77 : // WR will only apply the 'translate' of the transform, so we need to do the scale/rotation manually.
78 0 : bounds.MoveTo(transform.TransformPoint(bounds.TopLeft()));
79 : }
80 :
81 0 : return bounds;
82 : }
83 :
84 : Maybe<wr::ImageKey>
85 0 : WebRenderLayer::UpdateImageKey(ImageClientSingle* aImageClient,
86 : ImageContainer* aContainer,
87 : Maybe<wr::ImageKey>& aOldKey,
88 : wr::ExternalImageId& aExternalImageId)
89 : {
90 0 : MOZ_ASSERT(aImageClient);
91 0 : MOZ_ASSERT(aContainer);
92 :
93 0 : uint32_t oldCounter = aImageClient->GetLastUpdateGenerationCounter();
94 :
95 0 : bool ret = aImageClient->UpdateImage(aContainer, /* unused */0);
96 0 : if (!ret || aImageClient->IsEmpty()) {
97 : // Delete old key
98 0 : if (aOldKey.isSome()) {
99 0 : WrManager()->AddImageKeyForDiscard(aOldKey.value());
100 : }
101 0 : return Nothing();
102 : }
103 :
104 : // Reuse old key if generation is not updated.
105 0 : if (oldCounter == aImageClient->GetLastUpdateGenerationCounter() && aOldKey.isSome()) {
106 0 : return aOldKey;
107 : }
108 :
109 : // Delete old key, we are generating a new key.
110 0 : if (aOldKey.isSome()) {
111 0 : WrManager()->AddImageKeyForDiscard(aOldKey.value());
112 : }
113 :
114 0 : WrImageKey key = GetImageKey();
115 0 : WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(aExternalImageId, key));
116 0 : return Some(key);
117 : }
118 :
119 : void
120 0 : WebRenderLayer::DumpLayerInfo(const char* aLayerType, const LayerRect& aRect)
121 : {
122 0 : if (!gfxPrefs::LayersDump()) {
123 0 : return;
124 : }
125 :
126 0 : Layer* layer = GetLayer();
127 0 : Matrix4x4 transform = layer->GetTransform();
128 0 : LayerRect bounds = Bounds();
129 0 : WrMixBlendMode mixBlendMode = wr::ToWrMixBlendMode(GetLayer()->GetMixBlendMode());
130 :
131 0 : printf_stderr("%s %p using bounds=%s, transform=%s, rect=%s, clip=%s, mix-blend-mode=%s\n",
132 : aLayerType,
133 : layer,
134 0 : Stringify(bounds).c_str(),
135 0 : Stringify(transform).c_str(),
136 0 : Stringify(aRect).c_str(),
137 0 : layer->GetClipRect() ? Stringify(layer->GetClipRect().value()).c_str() : "none",
138 0 : Stringify(mixBlendMode).c_str());
139 : }
140 :
141 : } // namespace layers
142 : } // namespace mozilla
|