| Index: content/browser/renderer_host/accelerated_surface_container_mac.cc | 
| diff --git a/content/browser/renderer_host/accelerated_surface_container_mac.cc b/content/browser/renderer_host/accelerated_surface_container_mac.cc | 
| index e76103ce5711492fadee3e1187da071ad1b23139..86875f3c09f36179fd3cd92db4ac6f37dc49a0fa 100644 | 
| --- a/content/browser/renderer_host/accelerated_surface_container_mac.cc | 
| +++ b/content/browser/renderer_host/accelerated_surface_container_mac.cc | 
| @@ -118,21 +118,38 @@ void AcceleratedSurfaceContainerMac::Draw(CGLContextObj context) { | 
| } | 
| // If using TransportDIBs, the texture needs to be uploaded every frame. | 
| if (transport_dib_.get() != NULL) { | 
| -    void* pixel_memory = transport_dib_->memory(); | 
| +    unsigned char* pixel_memory = | 
| +        static_cast<unsigned char*>(transport_dib_->memory()); | 
| if (pixel_memory) { | 
| glBindTexture(target, texture_); | 
| glPixelStorei(GL_UNPACK_ALIGNMENT, 1);  // Needed for NPOT textures. | 
| -      glTexSubImage2D(target, | 
| -                      0,  // mipmap level 0 | 
| -                      0,  // x-offset | 
| -                      0,  // y-offset | 
| -                      width_, | 
| -                      height_, | 
| -                      GL_BGRA,  // The GPU plugin gave us BGRA pixels | 
| -                      GL_UNSIGNED_INT_8_8_8_8_REV, | 
| -                      pixel_memory); | 
| +      if (update_rect_.IsEmpty()) { | 
| +        glTexSubImage2D(target, | 
| +                        0,  // mipmap level 0 | 
| +                        0,  // x-offset | 
| +                        0,  // y-offset | 
| +                        width_, | 
| +                        height_, | 
| +                        GL_BGRA,  // The GPU plugin gave us BGRA pixels | 
| +                        GL_UNSIGNED_INT_8_8_8_8_REV, | 
| +                        pixel_memory); | 
| +      } else { | 
| +        glPixelStorei(GL_UNPACK_ROW_LENGTH, width_); | 
| +        glTexSubImage2D(target, | 
| +                        0,  // mipmap level 0 | 
| +                        update_rect_.x(),  // x-offset | 
| +                        update_rect_.y(),  // y-offset | 
| +                        update_rect_.width(), | 
| +                        update_rect_.height(), | 
| +                        GL_BGRA,  // The GPU plugin gave us BGRA pixels | 
| +                        GL_UNSIGNED_INT_8_8_8_8_REV, | 
| +                        &pixel_memory[(update_rect_.x() + | 
| +                                       update_rect_.y() * width_) * 4]); | 
| +        glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); | 
| +      } | 
| } | 
| } | 
| +  update_rect_ = gfx::Rect(); | 
|  | 
| if (texture_) { | 
| int texture_width = io_surface_support ? surface_width_ : width_; | 
| @@ -203,6 +220,27 @@ bool AcceleratedSurfaceContainerMac::ShouldBeVisible() const { | 
| } | 
|  | 
| void AcceleratedSurfaceContainerMac::set_was_painted_to(uint64 surface_id) { | 
| +  set_was_painted_to_common(surface_id); | 
| +  update_rect_ = gfx::Rect(); | 
| +} | 
| + | 
| +void AcceleratedSurfaceContainerMac::set_was_painted_to( | 
| +   uint64 surface_id, | 
| +   const gfx::Rect& update_rect) { | 
| +  set_was_painted_to_common(surface_id); | 
| +  update_rect_ = update_rect_.Union(update_rect); | 
| +} | 
| + | 
| +void AcceleratedSurfaceContainerMac::EnqueueTextureForDeletion() { | 
| +  if (texture_) { | 
| +    DCHECK(texture_pending_deletion_ == 0); | 
| +    texture_pending_deletion_ = texture_; | 
| +    texture_ = 0; | 
| +  } | 
| +} | 
| + | 
| +void AcceleratedSurfaceContainerMac::set_was_painted_to_common( | 
| +    uint64 surface_id) { | 
| if (surface_id && (!surface_ || surface_id != surface_id_)) { | 
| // Keep the surface that was most recently painted to around. | 
| if (IOSurfaceSupport* io_surface_support = IOSurfaceSupport::Initialize()) { | 
| @@ -222,12 +260,3 @@ void AcceleratedSurfaceContainerMac::set_was_painted_to(uint64 surface_id) { | 
| } | 
| was_painted_to_ = true; | 
| } | 
| - | 
| -void AcceleratedSurfaceContainerMac::EnqueueTextureForDeletion() { | 
| -  if (texture_) { | 
| -    DCHECK(texture_pending_deletion_ == 0); | 
| -    texture_pending_deletion_ = texture_; | 
| -    texture_ = 0; | 
| -  } | 
| -} | 
| - | 
|  |