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 "WebRenderUserData.h"
7 : #include "nsDisplayListInvalidation.h"
8 :
9 : namespace mozilla {
10 : namespace layers {
11 :
12 : WebRenderBridgeChild*
13 0 : WebRenderUserData::WrBridge() const
14 : {
15 0 : return mWRManager->WrBridge();
16 : }
17 :
18 0 : WebRenderImageData::WebRenderImageData(WebRenderLayerManager* aWRManager)
19 0 : : WebRenderUserData(aWRManager)
20 : {
21 0 : }
22 :
23 0 : WebRenderImageData::~WebRenderImageData()
24 : {
25 0 : if (mKey) {
26 0 : mWRManager->AddImageKeyForDiscard(mKey.value());
27 : }
28 :
29 0 : if (mExternalImageId) {
30 0 : WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
31 : }
32 :
33 0 : if (mPipelineId) {
34 0 : WrBridge()->RemovePipelineIdForAsyncCompositable(mPipelineId.ref());
35 : }
36 0 : }
37 :
38 : Maybe<wr::ImageKey>
39 0 : WebRenderImageData::UpdateImageKey(ImageContainer* aContainer, bool aForceUpdate)
40 : {
41 0 : CreateImageClientIfNeeded();
42 0 : CreateExternalImageIfNeeded();
43 :
44 0 : if (!mImageClient || !mExternalImageId) {
45 0 : return Nothing();
46 : }
47 :
48 0 : MOZ_ASSERT(mImageClient->AsImageClientSingle());
49 0 : MOZ_ASSERT(aContainer);
50 :
51 0 : ImageClientSingle* imageClient = mImageClient->AsImageClientSingle();
52 0 : uint32_t oldCounter = imageClient->GetLastUpdateGenerationCounter();
53 :
54 0 : bool ret = imageClient->UpdateImage(aContainer, /* unused */0);
55 0 : if (!ret || imageClient->IsEmpty()) {
56 : // Delete old key
57 0 : if (mKey) {
58 0 : mWRManager->AddImageKeyForDiscard(mKey.value());
59 0 : mKey = Nothing();
60 : }
61 0 : return Nothing();
62 : }
63 :
64 : // Reuse old key if generation is not updated.
65 0 : if (!aForceUpdate && oldCounter == imageClient->GetLastUpdateGenerationCounter() && mKey) {
66 0 : return mKey;
67 : }
68 :
69 : // Delete old key, we are generating a new key.
70 0 : if (mKey) {
71 0 : mWRManager->AddImageKeyForDiscard(mKey.value());
72 : }
73 :
74 0 : WrImageKey key = WrBridge()->GetNextImageKey();
75 0 : mWRManager->WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(mExternalImageId.value(), key));
76 0 : mKey = Some(key);
77 :
78 0 : return mKey;
79 : }
80 :
81 : already_AddRefed<ImageClient>
82 0 : WebRenderImageData::GetImageClient()
83 : {
84 0 : RefPtr<ImageClient> imageClient = mImageClient;
85 0 : return imageClient.forget();
86 : }
87 :
88 : void
89 0 : WebRenderImageData::CreateAsyncImageWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
90 : ImageContainer* aContainer,
91 : const StackingContextHelper& aSc,
92 : const LayerRect& aBounds,
93 : const LayerRect& aSCBounds,
94 : const Matrix4x4& aSCTransform,
95 : const MaybeIntSize& aScaleToSize,
96 : const WrImageRendering& aFilter,
97 : const WrMixBlendMode& aMixBlendMode)
98 : {
99 0 : MOZ_ASSERT(aContainer->IsAsync());
100 0 : if (!mPipelineId) {
101 : // Alloc async image pipeline id.
102 0 : mPipelineId = Some(WrBridge()->GetCompositorBridgeChild()->GetNextPipelineId());
103 0 : WrBridge()->AddPipelineIdForAsyncCompositable(mPipelineId.ref(),
104 0 : aContainer->GetAsyncContainerHandle());
105 : }
106 0 : MOZ_ASSERT(!mImageClient);
107 0 : MOZ_ASSERT(!mExternalImageId);
108 :
109 : // Push IFrame for async image pipeline.
110 : //
111 : // We don't push a stacking context for this async image pipeline here.
112 : // Instead, we do it inside the iframe that hosts the image. As a result,
113 : // a bunch of the calculations normally done as part of that stacking
114 : // context need to be done manually and pushed over to the parent side,
115 : // where it will be done when we build the display list for the iframe.
116 : // That happens in WebRenderCompositableHolder.
117 0 : WrRect r = aSc.ToRelativeWrRect(aBounds);
118 0 : aBuilder.PushIFrame(r, mPipelineId.ref());
119 :
120 0 : WrBridge()->AddWebRenderParentCommand(OpUpdateAsyncImagePipeline(mPipelineId.value(),
121 : aSCBounds,
122 : aSCTransform,
123 : aScaleToSize,
124 : aFilter,
125 0 : aMixBlendMode));
126 0 : }
127 :
128 : void
129 0 : WebRenderImageData::CreateImageClientIfNeeded()
130 : {
131 0 : if (!mImageClient) {
132 0 : mImageClient = ImageClient::CreateImageClient(CompositableType::IMAGE,
133 0 : WrBridge(),
134 0 : TextureFlags::DEFAULT);
135 0 : if (!mImageClient) {
136 0 : return;
137 : }
138 :
139 0 : mImageClient->Connect();
140 : }
141 : }
142 :
143 : void
144 0 : WebRenderImageData::CreateExternalImageIfNeeded()
145 : {
146 0 : if (!mExternalImageId) {
147 0 : mExternalImageId = Some(WrBridge()->AllocExternalImageIdForCompositable(mImageClient));
148 : }
149 0 : }
150 :
151 0 : WebRenderFallbackData::~WebRenderFallbackData()
152 : {
153 0 : }
154 :
155 0 : WebRenderFallbackData::WebRenderFallbackData(WebRenderLayerManager* aWRManager)
156 0 : : WebRenderImageData(aWRManager)
157 : {
158 0 : }
159 :
160 : nsAutoPtr<nsDisplayItemGeometry>
161 0 : WebRenderFallbackData::GetGeometry()
162 : {
163 0 : return mGeometry;
164 : }
165 :
166 : void
167 0 : WebRenderFallbackData::SetGeometry(nsAutoPtr<nsDisplayItemGeometry> aGeometry)
168 : {
169 0 : mGeometry = aGeometry;
170 0 : }
171 :
172 : } // namespace layers
173 : } // namespace mozilla
|