| OLD | NEW |
| 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" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 client_ = NULL; | 48 client_ = NULL; |
| 49 ClearTexture(); | 49 ClearTexture(); |
| 50 UpdateDrawsContent(HasDrawableContent()); | 50 UpdateDrawsContent(HasDrawableContent()); |
| 51 } | 51 } |
| 52 | 52 |
| 53 void TextureLayer::ClearTexture() { | 53 void TextureLayer::ClearTexture() { |
| 54 SetTextureMailbox(TextureMailbox(), scoped_ptr<SingleReleaseCallback>()); | 54 SetTextureMailbox(TextureMailbox(), scoped_ptr<SingleReleaseCallback>()); |
| 55 } | 55 } |
| 56 | 56 |
| 57 scoped_ptr<LayerImpl> TextureLayer::CreateLayerImpl(LayerTreeImpl* tree_impl) { | 57 scoped_ptr<LayerImpl> TextureLayer::CreateLayerImpl(LayerTreeImpl* tree_impl) { |
| 58 return TextureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); | 58 return TextureLayerImpl::Create(tree_impl, id()); |
| 59 } | 59 } |
| 60 | 60 |
| 61 void TextureLayer::SetFlipped(bool flipped) { | 61 void TextureLayer::SetFlipped(bool flipped) { |
| 62 if (flipped_ == flipped) | 62 if (flipped_ == flipped) |
| 63 return; | 63 return; |
| 64 flipped_ = flipped; | 64 flipped_ = flipped; |
| 65 SetNeedsCommit(); | 65 SetNeedsCommit(); |
| 66 } | 66 } |
| 67 | 67 |
| 68 void TextureLayer::SetUV(const gfx::PointF& top_left, | 68 void TextureLayer::SetUV(const gfx::PointF& top_left, |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 DCHECK(!mailbox.IsValid() || !holder_ref_ || | 123 DCHECK(!mailbox.IsValid() || !holder_ref_ || |
| 124 !mailbox.Equals(holder_ref_->holder()->mailbox()) || | 124 !mailbox.Equals(holder_ref_->holder()->mailbox()) || |
| 125 allow_mailbox_reuse); | 125 allow_mailbox_reuse); |
| 126 DCHECK_EQ(mailbox.IsValid(), !!release_callback); | 126 DCHECK_EQ(mailbox.IsValid(), !!release_callback); |
| 127 | 127 |
| 128 // If we never commited the mailbox, we need to release it here. | 128 // If we never commited the mailbox, we need to release it here. |
| 129 if (mailbox.IsValid()) { | 129 if (mailbox.IsValid()) { |
| 130 holder_ref_ = | 130 holder_ref_ = |
| 131 TextureMailboxHolder::Create(mailbox, release_callback.Pass()); | 131 TextureMailboxHolder::Create(mailbox, release_callback.Pass()); |
| 132 } else { | 132 } else { |
| 133 holder_ref_.reset(); | 133 holder_ref_ = nullptr; |
| 134 } | 134 } |
| 135 needs_set_mailbox_ = true; | 135 needs_set_mailbox_ = true; |
| 136 // If we are within a commit, no need to do it again immediately after. | 136 // If we are within a commit, no need to do it again immediately after. |
| 137 if (requires_commit) | 137 if (requires_commit) |
| 138 SetNeedsCommit(); | 138 SetNeedsCommit(); |
| 139 else | 139 else |
| 140 SetNeedsPushProperties(); | 140 SetNeedsPushProperties(); |
| 141 | 141 |
| 142 UpdateDrawsContent(HasDrawableContent()); | 142 UpdateDrawsContent(HasDrawableContent()); |
| 143 // The active frame needs to be replaced and the mailbox returned before the | 143 // The active frame needs to be replaced and the mailbox returned before the |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 } | 289 } |
| 290 | 290 |
| 291 TextureLayer::TextureMailboxHolder::~TextureMailboxHolder() { | 291 TextureLayer::TextureMailboxHolder::~TextureMailboxHolder() { |
| 292 DCHECK_EQ(0u, internal_references_); | 292 DCHECK_EQ(0u, internal_references_); |
| 293 } | 293 } |
| 294 | 294 |
| 295 scoped_ptr<TextureLayer::TextureMailboxHolder::MainThreadReference> | 295 scoped_ptr<TextureLayer::TextureMailboxHolder::MainThreadReference> |
| 296 TextureLayer::TextureMailboxHolder::Create( | 296 TextureLayer::TextureMailboxHolder::Create( |
| 297 const TextureMailbox& mailbox, | 297 const TextureMailbox& mailbox, |
| 298 scoped_ptr<SingleReleaseCallback> release_callback) { | 298 scoped_ptr<SingleReleaseCallback> release_callback) { |
| 299 return scoped_ptr<MainThreadReference>(new MainThreadReference( | 299 return make_scoped_ptr(new MainThreadReference( |
| 300 new TextureMailboxHolder(mailbox, release_callback.Pass()))); | 300 new TextureMailboxHolder(mailbox, release_callback.Pass()))); |
| 301 } | 301 } |
| 302 | 302 |
| 303 void TextureLayer::TextureMailboxHolder::Return(uint32 sync_point, | 303 void TextureLayer::TextureMailboxHolder::Return(uint32 sync_point, |
| 304 bool is_lost) { | 304 bool is_lost) { |
| 305 base::AutoLock lock(arguments_lock_); | 305 base::AutoLock lock(arguments_lock_); |
| 306 sync_point_ = sync_point; | 306 sync_point_ = sync_point; |
| 307 is_lost_ = is_lost; | 307 is_lost_ = is_lost; |
| 308 } | 308 } |
| 309 | 309 |
| 310 scoped_ptr<SingleReleaseCallbackImpl> | 310 scoped_ptr<SingleReleaseCallbackImpl> |
| 311 TextureLayer::TextureMailboxHolder::GetCallbackForImplThread() { | 311 TextureLayer::TextureMailboxHolder::GetCallbackForImplThread() { |
| 312 // We can't call GetCallbackForImplThread if we released the main thread | 312 // We can't call GetCallbackForImplThread if we released the main thread |
| 313 // reference. | 313 // reference. |
| 314 DCHECK_GT(internal_references_, 0u); | 314 DCHECK_GT(internal_references_, 0u); |
| 315 InternalAddRef(); | 315 InternalAddRef(); |
| 316 return SingleReleaseCallbackImpl::Create( | 316 return SingleReleaseCallbackImpl::Create( |
| 317 base::Bind(&TextureMailboxHolder::ReturnAndReleaseOnImplThread, this)); | 317 base::Bind(&TextureMailboxHolder::ReturnAndReleaseOnImplThread, this)); |
| 318 } | 318 } |
| 319 | 319 |
| 320 void TextureLayer::TextureMailboxHolder::InternalAddRef() { | 320 void TextureLayer::TextureMailboxHolder::InternalAddRef() { |
| 321 ++internal_references_; | 321 ++internal_references_; |
| 322 } | 322 } |
| 323 | 323 |
| 324 void TextureLayer::TextureMailboxHolder::InternalRelease() { | 324 void TextureLayer::TextureMailboxHolder::InternalRelease() { |
| 325 DCHECK(main_thread_checker_.CalledOnValidThread()); | 325 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 326 if (!--internal_references_) { | 326 if (!--internal_references_) { |
| 327 release_callback_->Run(sync_point_, is_lost_); | 327 release_callback_->Run(sync_point_, is_lost_); |
| 328 mailbox_ = TextureMailbox(); | 328 mailbox_ = TextureMailbox(); |
| 329 release_callback_.reset(); | 329 release_callback_ = nullptr; |
| 330 } | 330 } |
| 331 } | 331 } |
| 332 | 332 |
| 333 void TextureLayer::TextureMailboxHolder::ReturnAndReleaseOnImplThread( | 333 void TextureLayer::TextureMailboxHolder::ReturnAndReleaseOnImplThread( |
| 334 uint32 sync_point, | 334 uint32 sync_point, |
| 335 bool is_lost, | 335 bool is_lost, |
| 336 BlockingTaskRunner* main_thread_task_runner) { | 336 BlockingTaskRunner* main_thread_task_runner) { |
| 337 Return(sync_point, is_lost); | 337 Return(sync_point, is_lost); |
| 338 main_thread_task_runner->PostTask( | 338 main_thread_task_runner->PostTask( |
| 339 FROM_HERE, base::Bind(&TextureMailboxHolder::InternalRelease, this)); | 339 FROM_HERE, base::Bind(&TextureMailboxHolder::InternalRelease, this)); |
| 340 } | 340 } |
| 341 | 341 |
| 342 } // namespace cc | 342 } // namespace cc |
| OLD | NEW |