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

Side by Side Diff: compositor/gl/opengl_visitor.cc

Issue 6691037: wm: Fix an uncommon memory leak in the compositor code. (Closed) Base URL: ssh://gitrw.chromium.org:9222/window_manager.git@master
Patch Set: update another arg to be a const ref Created 9 years, 8 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
« no previous file with comments | « compositor/gl/opengl_visitor.h ('k') | compositor/gles/opengles_visitor.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium OS 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 "window_manager/compositor/gl/opengl_visitor.h" 5 #include "window_manager/compositor/gl/opengl_visitor.h"
6 6
7 #include <sys/time.h> 7 #include <sys/time.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <ctime> 10 #include <ctime>
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 GL_TEXTURE_WRAP_S, 429 GL_TEXTURE_WRAP_S,
430 GL_CLAMP_TO_EDGE); 430 GL_CLAMP_TO_EDGE);
431 gl_interface_->TexParameterf(GL_TEXTURE_2D, 431 gl_interface_->TexParameterf(GL_TEXTURE_2D,
432 GL_TEXTURE_WRAP_T, 432 GL_TEXTURE_WRAP_T,
433 GL_CLAMP_TO_EDGE); 433 GL_CLAMP_TO_EDGE);
434 gl_interface_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 434 gl_interface_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
435 container->width(), container->height(), 435 container->width(), container->height(),
436 0, pixel_data_format, GL_UNSIGNED_BYTE, 436 0, pixel_data_format, GL_UNSIGNED_BYTE,
437 container->data()); 437 container->data());
438 CHECK_GL_ERROR(gl_interface_); 438 CHECK_GL_ERROR(gl_interface_);
439 OpenGlTextureData* data = new OpenGlTextureData(gl_interface_); 439 scoped_ptr<OpenGlTextureData> data(new OpenGlTextureData(gl_interface_));
440 data->SetTexture(new_texture); 440 data->SetTexture(new_texture);
441 data->set_has_alpha(ImageFormatUsesAlpha(container->format())); 441 data->set_has_alpha(ImageFormatUsesAlpha(container->format()));
442 actor->set_texture_data(data); 442 actor->set_texture_data(data.release());
443 } 443 }
444 444
445 void OpenGlDrawVisitor::VisitImage(RealCompositor::ImageActor* actor) { 445 void OpenGlDrawVisitor::VisitImage(RealCompositor::ImageActor* actor) {
446 if (!actor->IsVisible()) 446 if (!actor->IsVisible())
447 return; 447 return;
448 448
449 PROFILER_MARKER_BEGIN(VisitImage); 449 PROFILER_MARKER_BEGIN(VisitImage);
450 450
451 // All ImageActors are also QuadActors, and so we let the 451 // All ImageActors are also QuadActors, and so we let the
452 // QuadActor do all the actual drawing. 452 // QuadActor do all the actual drawing.
453 VisitQuad(actor); 453 VisitQuad(actor);
454 PROFILER_MARKER_END(VisitImage); 454 PROFILER_MARKER_END(VisitImage);
455 } 455 }
456 456
457 void OpenGlDrawVisitor::VisitTexturePixmap( 457 void OpenGlDrawVisitor::VisitTexturePixmap(
458 RealCompositor::TexturePixmapActor* actor) { 458 RealCompositor::TexturePixmapActor* actor) {
459 if (!actor->IsVisible()) 459 if (!actor->IsVisible())
460 return; 460 return;
461 461
462 PROFILER_MARKER_BEGIN(VisitTexturePixmap); 462 PROFILER_MARKER_BEGIN(VisitTexturePixmap);
463 463
464 // Make sure there's a bound texture. 464 // Make sure there's a bound texture.
465 if (!actor->texture_data()) { 465 if (!actor->texture_data()) {
466 if (!actor->pixmap()) { 466 if (!actor->pixmap()) {
467 PROFILER_MARKER_END(VisitTexturePixmap); 467 PROFILER_MARKER_END(VisitTexturePixmap);
468 return; 468 return;
469 } 469 }
470 470
471 OpenGlPixmapData* data = new OpenGlPixmapData(this); 471 scoped_ptr<OpenGlPixmapData> data(new OpenGlPixmapData(this));
472 if (!data->Init(actor)) { 472 if (!data->Init(actor)) {
473 PROFILER_MARKER_END(VisitTexturePixmap); 473 PROFILER_MARKER_END(VisitTexturePixmap);
474 return; 474 return;
475 } 475 }
476 data->set_has_alpha(!actor->pixmap_is_opaque()); 476 data->set_has_alpha(!actor->pixmap_is_opaque());
477 actor->set_texture_data(data); 477 actor->set_texture_data(data.release());
478 } 478 }
479 479
480 // All texture pixmaps are also QuadActors, and so we let the 480 // All texture pixmaps are also QuadActors, and so we let the
481 // QuadActor do all the actual drawing. 481 // QuadActor do all the actual drawing.
482 VisitQuad(actor); 482 VisitQuad(actor);
483 PROFILER_MARKER_END(VisitTexturePixmap); 483 PROFILER_MARKER_END(VisitTexturePixmap);
484 } 484 }
485 485
486 void OpenGlDrawVisitor::VisitQuad(RealCompositor::QuadActor* actor) { 486 void OpenGlDrawVisitor::VisitQuad(RealCompositor::QuadActor* actor) {
487 if (!actor->IsVisible()) 487 if (!actor->IsVisible())
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 ++iterator) { 710 ++iterator) {
711 RealCompositor::Actor* child = *iterator; 711 RealCompositor::Actor* child = *iterator;
712 if (!child->IsVisible()) 712 if (!child->IsVisible())
713 continue; 713 continue;
714 #ifdef EXTRA_LOGGING 714 #ifdef EXTRA_LOGGING
715 DLOG(INFO) << "Drawing child " << child->name() 715 DLOG(INFO) << "Drawing child " << child->name()
716 << " (visible: " << child->IsVisible() 716 << " (visible: " << child->IsVisible()
717 << ", opacity: " << child->opacity() 717 << ", opacity: " << child->opacity()
718 << ", is_opaque: " << child->is_opaque() << ")"; 718 << ", is_opaque: " << child->is_opaque() << ")";
719 #endif 719 #endif
720 720
721 // TODO: move this down into the Visit* functions 721 // TODO: move this down into the Visit* functions
722 if (child->is_opaque() && child->opacity() * ancestor_opacity_ > 0.999) 722 if (child->is_opaque() && child->opacity() * ancestor_opacity_ > 0.999)
723 gl_interface_->Disable(GL_BLEND); 723 gl_interface_->Disable(GL_BLEND);
724 else 724 else
725 gl_interface_->Enable(GL_BLEND); 725 gl_interface_->Enable(GL_BLEND);
726 child->Accept(this); 726 child->Accept(this);
727 CHECK_GL_ERROR(gl_interface_); 727 CHECK_GL_ERROR(gl_interface_);
728 } 728 }
729 729
730 // Reset ancestor opacity. 730 // Reset ancestor opacity.
731 ancestor_opacity_ = original_opacity; 731 ancestor_opacity_ = original_opacity;
732 } 732 }
733 733
734 } // namespace window_manager 734 } // namespace window_manager
OLDNEW
« no previous file with comments | « compositor/gl/opengl_visitor.h ('k') | compositor/gles/opengles_visitor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698