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 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 void TextureLayer::SetTextureMailboxInternal( | 134 void TextureLayer::SetTextureMailboxInternal( |
135 const TextureMailbox& mailbox, | 135 const TextureMailbox& mailbox, |
136 scoped_ptr<SingleReleaseCallback> release_callback, | 136 scoped_ptr<SingleReleaseCallback> release_callback, |
137 bool requires_commit) { | 137 bool requires_commit) { |
138 DCHECK(uses_mailbox_); | 138 DCHECK(uses_mailbox_); |
139 DCHECK(!mailbox.IsValid() || !holder_ref_ || | 139 DCHECK(!mailbox.IsValid() || !holder_ref_ || |
140 !mailbox.Equals(holder_ref_->holder()->mailbox())); | 140 !mailbox.Equals(holder_ref_->holder()->mailbox())); |
141 DCHECK_EQ(mailbox.IsValid(), !!release_callback); | 141 DCHECK_EQ(mailbox.IsValid(), !!release_callback); |
142 | 142 |
143 // If we never commited the mailbox, we need to release it here. | 143 // If we never commited the mailbox, we need to release it here. |
144 if (mailbox.IsValid()) | 144 if (mailbox.IsValid()) { |
145 holder_ref_ = MailboxHolder::Create(mailbox, release_callback.Pass()); | 145 holder_ref_ = |
146 else | 146 TextureMailboxHolder::Create(mailbox, release_callback.Pass()); |
| 147 } else { |
147 holder_ref_.reset(); | 148 holder_ref_.reset(); |
| 149 } |
148 needs_set_mailbox_ = true; | 150 needs_set_mailbox_ = true; |
149 // If we are within a commit, no need to do it again immediately after. | 151 // If we are within a commit, no need to do it again immediately after. |
150 if (requires_commit) | 152 if (requires_commit) |
151 SetNeedsCommit(); | 153 SetNeedsCommit(); |
152 else | 154 else |
153 SetNeedsPushProperties(); | 155 SetNeedsPushProperties(); |
154 | 156 |
155 // The active frame needs to be replaced and the mailbox returned before the | 157 // The active frame needs to be replaced and the mailbox returned before the |
156 // commit is called complete. | 158 // commit is called complete. |
157 SetNextCommitWaitsForActivation(); | 159 SetNextCommitWaitsForActivation(); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 texture_layer->set_flipped(flipped_); | 256 texture_layer->set_flipped(flipped_); |
255 texture_layer->set_uv_top_left(uv_top_left_); | 257 texture_layer->set_uv_top_left(uv_top_left_); |
256 texture_layer->set_uv_bottom_right(uv_bottom_right_); | 258 texture_layer->set_uv_bottom_right(uv_bottom_right_); |
257 texture_layer->set_vertex_opacity(vertex_opacity_); | 259 texture_layer->set_vertex_opacity(vertex_opacity_); |
258 texture_layer->set_premultiplied_alpha(premultiplied_alpha_); | 260 texture_layer->set_premultiplied_alpha(premultiplied_alpha_); |
259 texture_layer->set_blend_background_color(blend_background_color_); | 261 texture_layer->set_blend_background_color(blend_background_color_); |
260 if (uses_mailbox_ && needs_set_mailbox_) { | 262 if (uses_mailbox_ && needs_set_mailbox_) { |
261 TextureMailbox texture_mailbox; | 263 TextureMailbox texture_mailbox; |
262 scoped_ptr<SingleReleaseCallback> release_callback; | 264 scoped_ptr<SingleReleaseCallback> release_callback; |
263 if (holder_ref_) { | 265 if (holder_ref_) { |
264 MailboxHolder* holder = holder_ref_->holder(); | 266 TextureMailboxHolder* holder = holder_ref_->holder(); |
265 texture_mailbox = holder->mailbox(); | 267 texture_mailbox = holder->mailbox(); |
266 release_callback = holder->GetCallbackForImplThread(); | 268 release_callback = holder->GetCallbackForImplThread(); |
267 } | 269 } |
268 texture_layer->SetTextureMailbox(texture_mailbox, release_callback.Pass()); | 270 texture_layer->SetTextureMailbox(texture_mailbox, release_callback.Pass()); |
269 needs_set_mailbox_ = false; | 271 needs_set_mailbox_ = false; |
270 } else { | 272 } else { |
271 texture_layer->set_texture_id(texture_id_); | 273 texture_layer->set_texture_id(texture_id_); |
272 content_committed_ = DrawsContent(); | 274 content_committed_ = DrawsContent(); |
273 } | 275 } |
274 } | 276 } |
275 | 277 |
276 Region TextureLayer::VisibleContentOpaqueRegion() const { | 278 Region TextureLayer::VisibleContentOpaqueRegion() const { |
277 if (contents_opaque()) | 279 if (contents_opaque()) |
278 return visible_content_rect(); | 280 return visible_content_rect(); |
279 | 281 |
280 if (blend_background_color_ && (SkColorGetA(background_color()) == 0xFF)) | 282 if (blend_background_color_ && (SkColorGetA(background_color()) == 0xFF)) |
281 return visible_content_rect(); | 283 return visible_content_rect(); |
282 | 284 |
283 return Region(); | 285 return Region(); |
284 } | 286 } |
285 | 287 |
286 TextureLayer::MailboxHolder::MainThreadReference::MainThreadReference( | 288 TextureLayer::TextureMailboxHolder::MainThreadReference::MainThreadReference( |
287 MailboxHolder* holder) | 289 TextureMailboxHolder* holder) |
288 : holder_(holder) { | 290 : holder_(holder) { |
289 holder_->InternalAddRef(); | 291 holder_->InternalAddRef(); |
290 } | 292 } |
291 | 293 |
292 TextureLayer::MailboxHolder::MainThreadReference::~MainThreadReference() { | 294 TextureLayer::TextureMailboxHolder::MainThreadReference:: |
| 295 ~MainThreadReference() { |
293 holder_->InternalRelease(); | 296 holder_->InternalRelease(); |
294 } | 297 } |
295 | 298 |
296 TextureLayer::MailboxHolder::MailboxHolder( | 299 TextureLayer::TextureMailboxHolder::TextureMailboxHolder( |
297 const TextureMailbox& mailbox, | 300 const TextureMailbox& mailbox, |
298 scoped_ptr<SingleReleaseCallback> release_callback) | 301 scoped_ptr<SingleReleaseCallback> release_callback) |
299 : message_loop_(BlockingTaskRunner::current()), | 302 : message_loop_(BlockingTaskRunner::current()), |
300 internal_references_(0), | 303 internal_references_(0), |
301 mailbox_(mailbox), | 304 mailbox_(mailbox), |
302 release_callback_(release_callback.Pass()), | 305 release_callback_(release_callback.Pass()), |
303 sync_point_(mailbox.sync_point()), | 306 sync_point_(mailbox.sync_point()), |
304 is_lost_(false) { | 307 is_lost_(false) {} |
305 } | |
306 | 308 |
307 TextureLayer::MailboxHolder::~MailboxHolder() { | 309 TextureLayer::TextureMailboxHolder::~TextureMailboxHolder() { |
308 DCHECK_EQ(0u, internal_references_); | 310 DCHECK_EQ(0u, internal_references_); |
309 } | 311 } |
310 | 312 |
311 scoped_ptr<TextureLayer::MailboxHolder::MainThreadReference> | 313 scoped_ptr<TextureLayer::TextureMailboxHolder::MainThreadReference> |
312 TextureLayer::MailboxHolder::Create( | 314 TextureLayer::TextureMailboxHolder::Create( |
313 const TextureMailbox& mailbox, | 315 const TextureMailbox& mailbox, |
314 scoped_ptr<SingleReleaseCallback> release_callback) { | 316 scoped_ptr<SingleReleaseCallback> release_callback) { |
315 return scoped_ptr<MainThreadReference>(new MainThreadReference( | 317 return scoped_ptr<MainThreadReference>(new MainThreadReference( |
316 new MailboxHolder(mailbox, release_callback.Pass()))); | 318 new TextureMailboxHolder(mailbox, release_callback.Pass()))); |
317 } | 319 } |
318 | 320 |
319 void TextureLayer::MailboxHolder::Return(unsigned sync_point, bool is_lost) { | 321 void TextureLayer::TextureMailboxHolder::Return(uint32 sync_point, |
| 322 bool is_lost) { |
320 base::AutoLock lock(arguments_lock_); | 323 base::AutoLock lock(arguments_lock_); |
321 sync_point_ = sync_point; | 324 sync_point_ = sync_point; |
322 is_lost_ = is_lost; | 325 is_lost_ = is_lost; |
323 } | 326 } |
324 | 327 |
325 scoped_ptr<SingleReleaseCallback> | 328 scoped_ptr<SingleReleaseCallback> |
326 TextureLayer::MailboxHolder::GetCallbackForImplThread() { | 329 TextureLayer::TextureMailboxHolder::GetCallbackForImplThread() { |
327 // We can't call GetCallbackForImplThread if we released the main thread | 330 // We can't call GetCallbackForImplThread if we released the main thread |
328 // reference. | 331 // reference. |
329 DCHECK_GT(internal_references_, 0u); | 332 DCHECK_GT(internal_references_, 0u); |
330 InternalAddRef(); | 333 InternalAddRef(); |
331 return SingleReleaseCallback::Create( | 334 return SingleReleaseCallback::Create( |
332 base::Bind(&MailboxHolder::ReturnAndReleaseOnImplThread, this)); | 335 base::Bind(&TextureMailboxHolder::ReturnAndReleaseOnImplThread, this)); |
333 } | 336 } |
334 | 337 |
335 void TextureLayer::MailboxHolder::InternalAddRef() { | 338 void TextureLayer::TextureMailboxHolder::InternalAddRef() { |
336 ++internal_references_; | 339 ++internal_references_; |
337 } | 340 } |
338 | 341 |
339 void TextureLayer::MailboxHolder::InternalRelease() { | 342 void TextureLayer::TextureMailboxHolder::InternalRelease() { |
340 DCHECK(message_loop_->BelongsToCurrentThread()); | 343 DCHECK(message_loop_->BelongsToCurrentThread()); |
341 if (!--internal_references_) { | 344 if (!--internal_references_) { |
342 release_callback_->Run(sync_point_, is_lost_); | 345 release_callback_->Run(sync_point_, is_lost_); |
343 mailbox_ = TextureMailbox(); | 346 mailbox_ = TextureMailbox(); |
344 release_callback_.reset(); | 347 release_callback_.reset(); |
345 } | 348 } |
346 } | 349 } |
347 | 350 |
348 void TextureLayer::MailboxHolder::ReturnAndReleaseOnImplThread( | 351 void TextureLayer::TextureMailboxHolder::ReturnAndReleaseOnImplThread( |
349 unsigned sync_point, bool is_lost) { | 352 uint32 sync_point, |
| 353 bool is_lost) { |
350 Return(sync_point, is_lost); | 354 Return(sync_point, is_lost); |
351 message_loop_->PostTask(FROM_HERE, | 355 message_loop_->PostTask( |
352 base::Bind(&MailboxHolder::InternalRelease, this)); | 356 FROM_HERE, base::Bind(&TextureMailboxHolder::InternalRelease, this)); |
353 } | 357 } |
354 | 358 |
355 } // namespace cc | 359 } // namespace cc |
OLD | NEW |