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

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

Issue 485043003: cc: Use correct message loop proxy in BlockingTaskRunner (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments. Created 6 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
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/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/synchronization/lock.h" 10 #include "base/synchronization/lock.h"
11 #include "cc/base/simple_enclosed_region.h" 11 #include "cc/base/simple_enclosed_region.h"
12 #include "cc/layers/texture_layer_client.h" 12 #include "cc/layers/texture_layer_client.h"
13 #include "cc/layers/texture_layer_impl.h" 13 #include "cc/layers/texture_layer_impl.h"
14 #include "cc/resources/single_release_callback.h" 14 #include "cc/resources/single_release_callback.h"
15 #include "cc/resources/single_release_callback_impl.h"
15 #include "cc/trees/blocking_task_runner.h" 16 #include "cc/trees/blocking_task_runner.h"
16 #include "cc/trees/layer_tree_host.h" 17 #include "cc/trees/layer_tree_host.h"
17 18
18 namespace cc { 19 namespace cc {
19 20
20 scoped_refptr<TextureLayer> TextureLayer::CreateForMailbox( 21 scoped_refptr<TextureLayer> TextureLayer::CreateForMailbox(
21 TextureLayerClient* client) { 22 TextureLayerClient* client) {
22 return scoped_refptr<TextureLayer>(new TextureLayer(client)); 23 return scoped_refptr<TextureLayer>(new TextureLayer(client));
23 } 24 }
24 25
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 238
238 TextureLayerImpl* texture_layer = static_cast<TextureLayerImpl*>(layer); 239 TextureLayerImpl* texture_layer = static_cast<TextureLayerImpl*>(layer);
239 texture_layer->SetFlipped(flipped_); 240 texture_layer->SetFlipped(flipped_);
240 texture_layer->SetUVTopLeft(uv_top_left_); 241 texture_layer->SetUVTopLeft(uv_top_left_);
241 texture_layer->SetUVBottomRight(uv_bottom_right_); 242 texture_layer->SetUVBottomRight(uv_bottom_right_);
242 texture_layer->SetVertexOpacity(vertex_opacity_); 243 texture_layer->SetVertexOpacity(vertex_opacity_);
243 texture_layer->SetPremultipliedAlpha(premultiplied_alpha_); 244 texture_layer->SetPremultipliedAlpha(premultiplied_alpha_);
244 texture_layer->SetBlendBackgroundColor(blend_background_color_); 245 texture_layer->SetBlendBackgroundColor(blend_background_color_);
245 if (needs_set_mailbox_) { 246 if (needs_set_mailbox_) {
246 TextureMailbox texture_mailbox; 247 TextureMailbox texture_mailbox;
247 scoped_ptr<SingleReleaseCallback> release_callback; 248 scoped_ptr<SingleReleaseCallbackImpl> release_callback_impl;
248 if (holder_ref_) { 249 if (holder_ref_) {
249 TextureMailboxHolder* holder = holder_ref_->holder(); 250 TextureMailboxHolder* holder = holder_ref_->holder();
250 texture_mailbox = holder->mailbox(); 251 texture_mailbox = holder->mailbox();
251 release_callback = holder->GetCallbackForImplThread(); 252 release_callback_impl = holder->GetCallbackForImplThread();
252 } 253 }
253 texture_layer->SetTextureMailbox(texture_mailbox, release_callback.Pass()); 254 texture_layer->SetTextureMailbox(texture_mailbox,
255 release_callback_impl.Pass());
254 needs_set_mailbox_ = false; 256 needs_set_mailbox_ = false;
255 } 257 }
256 } 258 }
257 259
258 SimpleEnclosedRegion TextureLayer::VisibleContentOpaqueRegion() const { 260 SimpleEnclosedRegion TextureLayer::VisibleContentOpaqueRegion() const {
259 if (contents_opaque()) 261 if (contents_opaque())
260 return SimpleEnclosedRegion(visible_content_rect()); 262 return SimpleEnclosedRegion(visible_content_rect());
261 263
262 if (blend_background_color_ && (SkColorGetA(background_color()) == 0xFF)) 264 if (blend_background_color_ && (SkColorGetA(background_color()) == 0xFF))
263 return SimpleEnclosedRegion(visible_content_rect()); 265 return SimpleEnclosedRegion(visible_content_rect());
264 266
265 return SimpleEnclosedRegion(); 267 return SimpleEnclosedRegion();
266 } 268 }
267 269
268 TextureLayer::TextureMailboxHolder::MainThreadReference::MainThreadReference( 270 TextureLayer::TextureMailboxHolder::MainThreadReference::MainThreadReference(
269 TextureMailboxHolder* holder) 271 TextureMailboxHolder* holder)
270 : holder_(holder) { 272 : holder_(holder) {
271 holder_->InternalAddRef(); 273 holder_->InternalAddRef();
272 } 274 }
273 275
274 TextureLayer::TextureMailboxHolder::MainThreadReference:: 276 TextureLayer::TextureMailboxHolder::MainThreadReference::
275 ~MainThreadReference() { 277 ~MainThreadReference() {
276 holder_->InternalRelease(); 278 holder_->InternalRelease();
277 } 279 }
278 280
279 TextureLayer::TextureMailboxHolder::TextureMailboxHolder( 281 TextureLayer::TextureMailboxHolder::TextureMailboxHolder(
280 const TextureMailbox& mailbox, 282 const TextureMailbox& mailbox,
281 scoped_ptr<SingleReleaseCallback> release_callback) 283 scoped_ptr<SingleReleaseCallback> release_callback)
282 : message_loop_(BlockingTaskRunner::current()), 284 : internal_references_(0),
283 internal_references_(0),
284 mailbox_(mailbox), 285 mailbox_(mailbox),
285 release_callback_(release_callback.Pass()), 286 release_callback_(release_callback.Pass()),
286 sync_point_(mailbox.sync_point()), 287 sync_point_(mailbox.sync_point()),
287 is_lost_(false) {} 288 is_lost_(false) {
danakj 2014/09/03 16:09:36 can you CalledOnValidThread() here, so we show Int
Sami 2014/09/03 17:59:12 Looks like the ThreadCheckerImpl constructor locks
danakj 2014/09/03 19:47:41 Ohh, ya it does!
289 }
288 290
289 TextureLayer::TextureMailboxHolder::~TextureMailboxHolder() { 291 TextureLayer::TextureMailboxHolder::~TextureMailboxHolder() {
290 DCHECK_EQ(0u, internal_references_); 292 DCHECK_EQ(0u, internal_references_);
291 } 293 }
292 294
293 scoped_ptr<TextureLayer::TextureMailboxHolder::MainThreadReference> 295 scoped_ptr<TextureLayer::TextureMailboxHolder::MainThreadReference>
294 TextureLayer::TextureMailboxHolder::Create( 296 TextureLayer::TextureMailboxHolder::Create(
295 const TextureMailbox& mailbox, 297 const TextureMailbox& mailbox,
296 scoped_ptr<SingleReleaseCallback> release_callback) { 298 scoped_ptr<SingleReleaseCallback> release_callback) {
297 return scoped_ptr<MainThreadReference>(new MainThreadReference( 299 return scoped_ptr<MainThreadReference>(new MainThreadReference(
298 new TextureMailboxHolder(mailbox, release_callback.Pass()))); 300 new TextureMailboxHolder(mailbox, release_callback.Pass())));
299 } 301 }
300 302
301 void TextureLayer::TextureMailboxHolder::Return(uint32 sync_point, 303 void TextureLayer::TextureMailboxHolder::Return(uint32 sync_point,
302 bool is_lost) { 304 bool is_lost) {
303 base::AutoLock lock(arguments_lock_); 305 base::AutoLock lock(arguments_lock_);
304 sync_point_ = sync_point; 306 sync_point_ = sync_point;
305 is_lost_ = is_lost; 307 is_lost_ = is_lost;
306 } 308 }
307 309
308 scoped_ptr<SingleReleaseCallback> 310 scoped_ptr<SingleReleaseCallbackImpl>
309 TextureLayer::TextureMailboxHolder::GetCallbackForImplThread() { 311 TextureLayer::TextureMailboxHolder::GetCallbackForImplThread() {
310 // We can't call GetCallbackForImplThread if we released the main thread 312 // We can't call GetCallbackForImplThread if we released the main thread
311 // reference. 313 // reference.
312 DCHECK_GT(internal_references_, 0u); 314 DCHECK_GT(internal_references_, 0u);
313 InternalAddRef(); 315 InternalAddRef();
314 return SingleReleaseCallback::Create( 316 return SingleReleaseCallbackImpl::Create(
315 base::Bind(&TextureMailboxHolder::ReturnAndReleaseOnImplThread, this)); 317 base::Bind(&TextureMailboxHolder::ReturnAndReleaseOnImplThread, this));
316 } 318 }
317 319
318 void TextureLayer::TextureMailboxHolder::InternalAddRef() { 320 void TextureLayer::TextureMailboxHolder::InternalAddRef() {
319 ++internal_references_; 321 ++internal_references_;
320 } 322 }
321 323
322 void TextureLayer::TextureMailboxHolder::InternalRelease() { 324 void TextureLayer::TextureMailboxHolder::InternalRelease() {
323 DCHECK(message_loop_->BelongsToCurrentThread()); 325 DCHECK(main_thread_checker_.CalledOnValidThread());
324 if (!--internal_references_) { 326 if (!--internal_references_) {
325 release_callback_->Run(sync_point_, is_lost_); 327 release_callback_->Run(sync_point_, is_lost_);
326 mailbox_ = TextureMailbox(); 328 mailbox_ = TextureMailbox();
327 release_callback_.reset(); 329 release_callback_.reset();
328 } 330 }
329 } 331 }
330 332
331 void TextureLayer::TextureMailboxHolder::ReturnAndReleaseOnImplThread( 333 void TextureLayer::TextureMailboxHolder::ReturnAndReleaseOnImplThread(
332 uint32 sync_point, 334 uint32 sync_point,
333 bool is_lost) { 335 bool is_lost,
336 BlockingTaskRunner* main_thread_task_runner) {
334 Return(sync_point, is_lost); 337 Return(sync_point, is_lost);
335 message_loop_->PostTask( 338 main_thread_task_runner->PostTask(
336 FROM_HERE, base::Bind(&TextureMailboxHolder::InternalRelease, this)); 339 FROM_HERE, base::Bind(&TextureMailboxHolder::InternalRelease, this));
337 } 340 }
338 341
339 } // namespace cc 342 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698