gfx/layers/client/ClientThebesLayer.cpp

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:cd1b8bc0ac8b
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 "ClientThebesLayer.h"
7 #include "ClientTiledThebesLayer.h" // for ClientTiledThebesLayer
8 #include "SimpleTiledContentClient.h"
9 #include <stdint.h> // for uint32_t
10 #include "GeckoProfiler.h" // for PROFILER_LABEL
11 #include "client/ClientLayerManager.h" // for ClientLayerManager, etc
12 #include "gfxContext.h" // for gfxContext
13 #include "gfxRect.h" // for gfxRect
14 #include "gfxPrefs.h" // for gfxPrefs
15 #include "mozilla/Assertions.h" // for MOZ_ASSERT, etc
16 #include "mozilla/gfx/2D.h" // for DrawTarget
17 #include "mozilla/gfx/Matrix.h" // for Matrix
18 #include "mozilla/gfx/Rect.h" // for Rect, IntRect
19 #include "mozilla/gfx/Types.h" // for Float, etc
20 #include "mozilla/layers/LayersTypes.h"
21 #include "mozilla/Preferences.h"
22 #include "nsAutoPtr.h" // for nsRefPtr
23 #include "nsCOMPtr.h" // for already_AddRefed
24 #include "nsISupportsImpl.h" // for Layer::AddRef, etc
25 #include "nsRect.h" // for nsIntRect
26 #include "gfx2DGlue.h"
27
28 using namespace mozilla::gfx;
29
30 namespace mozilla {
31 namespace layers {
32
33 void
34 ClientThebesLayer::PaintThebes()
35 {
36 PROFILER_LABEL("ClientThebesLayer", "PaintThebes");
37 NS_ASSERTION(ClientManager()->InDrawing(),
38 "Can only draw in drawing phase");
39
40 uint32_t flags = RotatedContentBuffer::PAINT_CAN_DRAW_ROTATED;
41 #ifndef MOZ_WIDGET_ANDROID
42 if (ClientManager()->CompositorMightResample()) {
43 flags |= RotatedContentBuffer::PAINT_WILL_RESAMPLE;
44 }
45 if (!(flags & RotatedContentBuffer::PAINT_WILL_RESAMPLE)) {
46 if (MayResample()) {
47 flags |= RotatedContentBuffer::PAINT_WILL_RESAMPLE;
48 }
49 }
50 #endif
51 PaintState state =
52 mContentClient->BeginPaintBuffer(this, flags);
53 mValidRegion.Sub(mValidRegion, state.mRegionToInvalidate);
54
55 if (!state.mRegionToDraw.IsEmpty() && !ClientManager()->GetThebesLayerCallback()) {
56 ClientManager()->SetTransactionIncomplete();
57 return;
58 }
59
60 // The area that became invalid and is visible needs to be repainted
61 // (this could be the whole visible area if our buffer switched
62 // from RGB to RGBA, because we might need to repaint with
63 // subpixel AA)
64 state.mRegionToInvalidate.And(state.mRegionToInvalidate,
65 GetEffectiveVisibleRegion());
66
67 bool didUpdate = false;
68 RotatedContentBuffer::DrawIterator iter;
69 while (DrawTarget* target = mContentClient->BorrowDrawTargetForPainting(state, &iter)) {
70 SetAntialiasingFlags(this, target);
71
72 nsRefPtr<gfxContext> ctx = gfxContext::ContextForDrawTarget(target);
73
74 ClientManager()->GetThebesLayerCallback()(this,
75 ctx,
76 iter.mDrawRegion,
77 state.mClip,
78 state.mRegionToInvalidate,
79 ClientManager()->GetThebesLayerCallbackData());
80
81 ctx = nullptr;
82 mContentClient->ReturnDrawTargetToBuffer(target);
83 didUpdate = true;
84 }
85
86 if (didUpdate) {
87 Mutated();
88
89 mValidRegion.Or(mValidRegion, state.mRegionToDraw);
90
91 ContentClientRemote* contentClientRemote = static_cast<ContentClientRemote*>(mContentClient.get());
92 MOZ_ASSERT(contentClientRemote->GetIPDLActor());
93
94 // Hold(this) ensures this layer is kept alive through the current transaction
95 // The ContentClient assumes this layer is kept alive (e.g., in CreateBuffer),
96 // so deleting this Hold for whatever reason will break things.
97 ClientManager()->Hold(this);
98 contentClientRemote->Updated(state.mRegionToDraw,
99 mVisibleRegion,
100 state.mDidSelfCopy);
101 }
102 }
103
104 void
105 ClientThebesLayer::RenderLayer()
106 {
107 if (GetMaskLayer()) {
108 ToClientLayer(GetMaskLayer())->RenderLayer();
109 }
110
111 if (!mContentClient) {
112 mContentClient = ContentClient::CreateContentClient(ClientManager()->AsShadowForwarder());
113 if (!mContentClient) {
114 return;
115 }
116 mContentClient->Connect();
117 ClientManager()->AsShadowForwarder()->Attach(mContentClient, this);
118 MOZ_ASSERT(mContentClient->GetForwarder());
119 }
120
121 mContentClient->BeginPaint();
122 PaintThebes();
123 mContentClient->EndPaint();
124 }
125
126 already_AddRefed<ThebesLayer>
127 ClientLayerManager::CreateThebesLayer()
128 {
129 return CreateThebesLayerWithHint(NONE);
130 }
131
132 already_AddRefed<ThebesLayer>
133 ClientLayerManager::CreateThebesLayerWithHint(ThebesLayerCreationHint aHint)
134 {
135 NS_ASSERTION(InConstruction(), "Only allowed in construction phase");
136 if (
137 #ifdef MOZ_B2G
138 aHint == SCROLLABLE &&
139 #endif
140 gfxPrefs::LayersTilesEnabled() &&
141 (AsShadowForwarder()->GetCompositorBackendType() == LayersBackend::LAYERS_OPENGL ||
142 AsShadowForwarder()->GetCompositorBackendType() == LayersBackend::LAYERS_D3D9 ||
143 AsShadowForwarder()->GetCompositorBackendType() == LayersBackend::LAYERS_D3D11)) {
144 if (gfxPrefs::LayersUseSimpleTiles()) {
145 nsRefPtr<SimpleClientTiledThebesLayer> layer =
146 new SimpleClientTiledThebesLayer(this);
147 CREATE_SHADOW(Thebes);
148 return layer.forget();
149 } else {
150 nsRefPtr<ClientTiledThebesLayer> layer =
151 new ClientTiledThebesLayer(this);
152 CREATE_SHADOW(Thebes);
153 return layer.forget();
154 }
155 } else
156 {
157 nsRefPtr<ClientThebesLayer> layer =
158 new ClientThebesLayer(this);
159 CREATE_SHADOW(Thebes);
160 return layer.forget();
161 }
162 }
163
164
165 }
166 }

mercurial