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; |
- } |
-} |
- |