Index: chrome/browser/renderer_host/accelerated_surface_container_mac.cc |
=================================================================== |
--- chrome/browser/renderer_host/accelerated_surface_container_mac.cc (revision 56221) |
+++ chrome/browser/renderer_host/accelerated_surface_container_mac.cc (working copy) |
@@ -18,11 +18,11 @@ |
width_(0), |
height_(0), |
texture_(0), |
- texture_needs_upload_(true) { |
+ texture_needs_upload_(true), |
+ texture_pending_deletion_(0) { |
} |
AcceleratedSurfaceContainerMac::~AcceleratedSurfaceContainerMac() { |
- EnqueueTextureForDeletion(); |
ReleaseIOSurface(); |
} |
@@ -60,7 +60,7 @@ |
} |
} |
-void AcceleratedSurfaceContainerMac::MoveTo( |
+void AcceleratedSurfaceContainerMac::SetGeometry( |
const webkit_glue::WebPluginGeometry& geom) { |
// TODO(kbr): may need to pay attention to cutout rects. |
if (geom.visible) |
@@ -72,6 +72,19 @@ |
void AcceleratedSurfaceContainerMac::Draw(CGLContextObj context) { |
IOSurfaceSupport* io_surface_support = IOSurfaceSupport::Initialize(); |
GLenum target = GL_TEXTURE_RECTANGLE_ARB; |
+ if (texture_pending_deletion_) { |
+ // Clean up an old texture object. This is essentially a pre-emptive |
+ // cleanup, as the resources will be released when the OpenGL context |
+ // associated with our containing NSView is destroyed. However, if we |
+ // resize a plugin often, we might generate a lot of textures, so we |
+ // should try to eagerly reclaim their resources. Note also that the |
+ // OpenGL context must be current when performing the deletion, and it |
+ // seems risky to make the OpenGL context current at an arbitrary point |
+ // in time, which is why the deletion does not occur in the container's |
+ // destructor. |
+ glDeleteTextures(1, &texture_pending_deletion_); |
+ texture_pending_deletion_ = 0; |
+ } |
if (!texture_) { |
if ((io_surface_support && !surface_) || |
(!io_surface_support && !transport_dib_.get())) |
@@ -191,7 +204,8 @@ |
void AcceleratedSurfaceContainerMac::EnqueueTextureForDeletion() { |
if (texture_) { |
- manager_->EnqueueTextureForDeletion(texture_); |
+ DCHECK(texture_pending_deletion_ == 0); |
+ texture_pending_deletion_ = texture_; |
texture_ = 0; |
} |
} |