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 "WebRenderCanvasLayer.h"
7 :
8 : #include "AsyncCanvasRenderer.h"
9 : #include "gfxPrefs.h"
10 : #include "gfxUtils.h"
11 : #include "GLContext.h"
12 : #include "GLScreenBuffer.h"
13 : #include "LayersLogging.h"
14 : #include "mozilla/gfx/2D.h"
15 : #include "mozilla/layers/ScrollingLayersHelper.h"
16 : #include "mozilla/layers/StackingContextHelper.h"
17 : #include "mozilla/layers/TextureClientSharedSurface.h"
18 : #include "mozilla/layers/WebRenderBridgeChild.h"
19 : #include "PersistentBufferProvider.h"
20 : #include "SharedSurface.h"
21 : #include "SharedSurfaceGL.h"
22 : #include "mozilla/webrender/WebRenderTypes.h"
23 :
24 : namespace mozilla {
25 : namespace layers {
26 :
27 0 : WebRenderCanvasLayer::~WebRenderCanvasLayer()
28 : {
29 0 : MOZ_COUNT_DTOR(WebRenderCanvasLayer);
30 :
31 0 : if (mExternalImageId.isSome()) {
32 0 : WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
33 : }
34 0 : }
35 :
36 : void
37 0 : WebRenderCanvasLayer::Initialize(const Data& aData)
38 : {
39 0 : ShareableCanvasLayer::Initialize(aData);
40 :
41 : // XXX: Use basic surface factory until we support shared surface.
42 0 : if (!mGLContext || mGLFrontbuffer)
43 0 : return;
44 :
45 0 : gl::GLScreenBuffer* screen = mGLContext->Screen();
46 0 : auto factory = MakeUnique<gl::SurfaceFactory_Basic>(mGLContext, screen->mCaps, mFlags);
47 0 : screen->Morph(Move(factory));
48 : }
49 :
50 : void
51 0 : WebRenderCanvasLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
52 : const StackingContextHelper& aSc)
53 : {
54 0 : UpdateCompositableClient();
55 :
56 0 : if (mExternalImageId.isNothing()) {
57 0 : mExternalImageId = Some(WrBridge()->AllocExternalImageIdForCompositable(mCanvasClient));
58 : }
59 :
60 0 : Maybe<gfx::Matrix4x4> transform;
61 0 : const bool needsYFlip = (mOriginPos == gl::OriginPos::BottomLeft);
62 0 : if (needsYFlip) {
63 0 : transform = Some(GetTransform().PreTranslate(0, mBounds.height, 0).PreScale(1, -1, 1));
64 : }
65 :
66 0 : ScrollingLayersHelper scroller(this, aBuilder, aSc);
67 0 : StackingContextHelper sc(aSc, aBuilder, this, transform);
68 :
69 0 : LayerRect rect(0, 0, mBounds.width, mBounds.height);
70 0 : DumpLayerInfo("CanvasLayer", rect);
71 :
72 0 : wr::ImageRendering filter = wr::ToImageRendering(mSamplingFilter);
73 :
74 0 : if (gfxPrefs::LayersDump()) {
75 0 : printf_stderr("CanvasLayer %p texture-filter=%s\n",
76 0 : this->GetLayer(),
77 0 : Stringify(filter).c_str());
78 : }
79 :
80 0 : WrImageKey key = GetImageKey();
81 0 : WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(mExternalImageId.value(), key));
82 0 : WrManager()->AddImageKeyForDiscard(key);
83 :
84 0 : WrRect r = sc.ToRelativeWrRect(rect);
85 0 : aBuilder.PushImage(r, r, filter, key);
86 0 : }
87 :
88 : void
89 0 : WebRenderCanvasLayer::AttachCompositable()
90 : {
91 0 : mCanvasClient->Connect();
92 0 : }
93 :
94 : CompositableForwarder*
95 0 : WebRenderCanvasLayer::GetForwarder()
96 : {
97 0 : return WrManager()->WrBridge();
98 : }
99 :
100 : } // namespace layers
101 : } // namespace mozilla
|