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

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

Issue 105743004: Add gpu::MailboxHolder to hold state for a gpu::Mailbox (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: c301e01d Rebase. Created 6 years, 11 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"
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698