Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: trunk/src/cc/layers/texture_layer.cc

Issue 23702010: Revert 220418 "cc: Block commit on activate by setting a flag on..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « trunk/src/cc/layers/texture_layer.h ('k') | trunk/src/cc/layers/texture_layer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 The Chromium Authors. All rights reserved. 1 // Copyright 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layers/texture_layer.h" 5 #include "cc/layers/texture_layer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/synchronization/lock.h" 9 #include "base/synchronization/lock.h"
10 #include "cc/layers/texture_layer_client.h" 10 #include "cc/layers/texture_layer_client.h"
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 DCHECK(uses_mailbox_); 131 DCHECK(uses_mailbox_);
132 DCHECK(!mailbox.IsValid() || !holder_ref_ || 132 DCHECK(!mailbox.IsValid() || !holder_ref_ ||
133 !mailbox.Equals(holder_ref_->holder()->mailbox())); 133 !mailbox.Equals(holder_ref_->holder()->mailbox()));
134 // If we never commited the mailbox, we need to release it here. 134 // If we never commited the mailbox, we need to release it here.
135 if (mailbox.IsValid()) 135 if (mailbox.IsValid())
136 holder_ref_ = MailboxHolder::Create(mailbox); 136 holder_ref_ = MailboxHolder::Create(mailbox);
137 else 137 else
138 holder_ref_.reset(); 138 holder_ref_.reset();
139 needs_set_mailbox_ = true; 139 needs_set_mailbox_ = true;
140 SetNeedsCommit(); 140 SetNeedsCommit();
141 // The active frame needs to be replaced and the mailbox returned before the
142 // commit is called complete.
143 SetNextCommitWaitsForActivation();
144 } 141 }
145 142
146 void TextureLayer::WillModifyTexture() { 143 void TextureLayer::WillModifyTexture() {
147 if (layer_tree_host() && (DrawsContent() || content_committed_)) { 144 if (layer_tree_host() && (DrawsContent() || content_committed_)) {
148 layer_tree_host()->AcquireLayerTextures(); 145 layer_tree_host()->AcquireLayerTextures();
149 content_committed_ = false; 146 content_committed_ = false;
150 } 147 }
151 } 148 }
152 149
153 void TextureLayer::SetNeedsDisplayRect(const gfx::RectF& dirty_rect) { 150 void TextureLayer::SetNeedsDisplayRect(const gfx::RectF& dirty_rect) {
154 Layer::SetNeedsDisplayRect(dirty_rect); 151 Layer::SetNeedsDisplayRect(dirty_rect);
155 152
156 if (rate_limit_context_ && client_ && layer_tree_host() && DrawsContent()) 153 if (rate_limit_context_ && client_ && layer_tree_host() && DrawsContent())
157 layer_tree_host()->StartRateLimiter(client_->Context3d()); 154 layer_tree_host()->StartRateLimiter(client_->Context3d());
158 } 155 }
159 156
160 void TextureLayer::SetLayerTreeHost(LayerTreeHost* host) { 157 void TextureLayer::SetLayerTreeHost(LayerTreeHost* host) {
161 if (layer_tree_host() == host) { 158 if (layer_tree_host() == host) {
162 Layer::SetLayerTreeHost(host); 159 Layer::SetLayerTreeHost(host);
163 return; 160 return;
164 } 161 }
165 162
166 if (layer_tree_host()) { 163 if (layer_tree_host()) {
167 if (texture_id_) { 164 if (texture_id_)
168 layer_tree_host()->AcquireLayerTextures(); 165 layer_tree_host()->AcquireLayerTextures();
169 // The texture id needs to be removed from the active tree before the
170 // commit is called complete.
171 SetNextCommitWaitsForActivation();
172 }
173 if (rate_limit_context_ && client_) 166 if (rate_limit_context_ && client_)
174 layer_tree_host()->StopRateLimiter(client_->Context3d()); 167 layer_tree_host()->StopRateLimiter(client_->Context3d());
175 } 168 }
176 // If we're removed from the tree, the TextureLayerImpl will be destroyed, and 169 // If we're removed from the tree, the TextureLayerImpl will be destroyed, and
177 // we will need to set the mailbox again on a new TextureLayerImpl the next 170 // we will need to set the mailbox again on a new TextureLayerImpl the next
178 // time we push. 171 // time we push.
179 if (!host && uses_mailbox_ && holder_ref_) { 172 if (!host && uses_mailbox_ && holder_ref_)
180 needs_set_mailbox_ = true; 173 needs_set_mailbox_ = true;
181 // The active frame needs to be replaced and the mailbox returned before the
182 // commit is called complete.
183 SetNextCommitWaitsForActivation();
184 }
185 Layer::SetLayerTreeHost(host); 174 Layer::SetLayerTreeHost(host);
186 } 175 }
187 176
188 bool TextureLayer::DrawsContent() const { 177 bool TextureLayer::DrawsContent() const {
189 return (client_ || texture_id_ || holder_ref_) && Layer::DrawsContent(); 178 return (client_ || texture_id_ || holder_ref_) && Layer::DrawsContent();
190 } 179 }
191 180
192 bool TextureLayer::Update(ResourceUpdateQueue* queue, 181 bool TextureLayer::Update(ResourceUpdateQueue* queue,
193 const OcclusionTracker* occlusion) { 182 const OcclusionTracker* occlusion) {
194 bool updated = Layer::Update(queue, occlusion); 183 bool updated = Layer::Update(queue, occlusion);
195 if (client_) { 184 if (client_) {
196 if (uses_mailbox_) { 185 if (uses_mailbox_) {
197 TextureMailbox mailbox; 186 TextureMailbox mailbox;
198 if (client_->PrepareTextureMailbox( 187 if (client_->PrepareTextureMailbox(
199 &mailbox, layer_tree_host()->UsingSharedMemoryResources())) { 188 &mailbox, layer_tree_host()->UsingSharedMemoryResources())) {
200 SetTextureMailbox(mailbox); 189 SetTextureMailbox(mailbox);
201 updated = true; 190 updated = true;
202 } 191 }
203 } else { 192 } else {
204 texture_id_ = client_->PrepareTexture(); 193 texture_id_ = client_->PrepareTexture();
205 DCHECK_EQ(!!texture_id_, !!client_->Context3d()); 194 DCHECK_EQ(!!texture_id_, !!client_->Context3d());
206 if (client_->Context3d() && 195 if (client_->Context3d() &&
207 client_->Context3d()->getGraphicsResetStatusARB() != GL_NO_ERROR) 196 client_->Context3d()->getGraphicsResetStatusARB() != GL_NO_ERROR)
208 texture_id_ = 0; 197 texture_id_ = 0;
209 updated = true; 198 updated = true;
210 // The texture id needs to be removed from the active tree before the
211 // commit is called complete.
212 SetNextCommitWaitsForActivation();
213 } 199 }
214 } 200 }
215 201
216 // SetTextureMailbox could be called externally and the same mailbox used for 202 // SetTextureMailbox could be called externally and the same mailbox used for
217 // different textures. Such callers notify this layer that the texture has 203 // different textures. Such callers notify this layer that the texture has
218 // changed by calling SetNeedsDisplay, so check for that here. 204 // changed by calling SetNeedsDisplay, so check for that here.
219 return updated || !update_rect_.IsEmpty(); 205 return updated || !update_rect_.IsEmpty();
220 } 206 }
221 207
222 void TextureLayer::PushPropertiesTo(LayerImpl* layer) { 208 void TextureLayer::PushPropertiesTo(LayerImpl* layer) {
(...skipping 25 matching lines...) Expand all
248 Region TextureLayer::VisibleContentOpaqueRegion() const { 234 Region TextureLayer::VisibleContentOpaqueRegion() const {
249 if (contents_opaque()) 235 if (contents_opaque())
250 return visible_content_rect(); 236 return visible_content_rect();
251 237
252 if (blend_background_color_ && (SkColorGetA(background_color()) == 0xFF)) 238 if (blend_background_color_ && (SkColorGetA(background_color()) == 0xFF))
253 return visible_content_rect(); 239 return visible_content_rect();
254 240
255 return Region(); 241 return Region();
256 } 242 }
257 243
244 bool TextureLayer::BlocksPendingCommit() const {
245 // Double-buffered texture layers need to be blocked until they can be made
246 // triple-buffered. Single-buffered layers already prevent draws, so
247 // can block too for simplicity.
248 return DrawsContent();
249 }
250
258 bool TextureLayer::CanClipSelf() const { 251 bool TextureLayer::CanClipSelf() const {
259 return true; 252 return true;
260 } 253 }
261 254
262 TextureLayer::MailboxHolder::MainThreadReference::MainThreadReference( 255 TextureLayer::MailboxHolder::MainThreadReference::MainThreadReference(
263 MailboxHolder* holder) 256 MailboxHolder* holder)
264 : holder_(holder) { 257 : holder_(holder) {
265 holder_->InternalAddRef(); 258 holder_->InternalAddRef();
266 } 259 }
267 260
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 } 308 }
316 309
317 void TextureLayer::MailboxHolder::ReturnAndReleaseOnImplThread( 310 void TextureLayer::MailboxHolder::ReturnAndReleaseOnImplThread(
318 unsigned sync_point, bool is_lost) { 311 unsigned sync_point, bool is_lost) {
319 Return(sync_point, is_lost); 312 Return(sync_point, is_lost);
320 message_loop_->PostTask(FROM_HERE, 313 message_loop_->PostTask(FROM_HERE,
321 base::Bind(&MailboxHolder::InternalRelease, this)); 314 base::Bind(&MailboxHolder::InternalRelease, this));
322 } 315 }
323 316
324 } // namespace cc 317 } // namespace cc
OLDNEW
« no previous file with comments | « trunk/src/cc/layers/texture_layer.h ('k') | trunk/src/cc/layers/texture_layer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698