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" |
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 Loading... | |
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) { |
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()); | |
danakj
2014/08/28 17:10:46
can we use a ThreadChecker to verify this is on th
Sami
2014/08/28 18:21:16
Oo, good idea.
| |
324 if (!--internal_references_) { | 325 if (!--internal_references_) { |
325 release_callback_->Run(sync_point_, is_lost_); | 326 release_callback_->Run(sync_point_, is_lost_); |
326 mailbox_ = TextureMailbox(); | 327 mailbox_ = TextureMailbox(); |
327 release_callback_.reset(); | 328 release_callback_.reset(); |
328 } | 329 } |
329 } | 330 } |
330 | 331 |
331 void TextureLayer::TextureMailboxHolder::ReturnAndReleaseOnImplThread( | 332 void TextureLayer::TextureMailboxHolder::ReturnAndReleaseOnImplThread( |
332 uint32 sync_point, | 333 uint32 sync_point, |
333 bool is_lost) { | 334 bool is_lost, |
335 scoped_refptr<BlockingTaskRunner> main_thread_task_runner) { | |
334 Return(sync_point, is_lost); | 336 Return(sync_point, is_lost); |
335 message_loop_->PostTask( | 337 main_thread_task_runner->PostTask( |
336 FROM_HERE, base::Bind(&TextureMailboxHolder::InternalRelease, this)); | 338 FROM_HERE, base::Bind(&TextureMailboxHolder::InternalRelease, this)); |
337 } | 339 } |
338 | 340 |
339 } // namespace cc | 341 } // namespace cc |
OLD | NEW |