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

Unified Diff: content/common/gpu/image_transport_surface_mac.cc

Issue 8726046: Partial swaps on OSX (Closed) Base URL: backer@fancypants:chromium/src@master
Patch Set: Address reviewer comments. Created 9 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_mac.mm ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/image_transport_surface_mac.cc
diff --git a/content/common/gpu/image_transport_surface_mac.cc b/content/common/gpu/image_transport_surface_mac.cc
index 91af5887a6473a31c143a21d911f60d30d7ed712..21ca56482070fb644a476bc1bdfc20d372a38c3c 100644
--- a/content/common/gpu/image_transport_surface_mac.cc
+++ b/content/common/gpu/image_transport_surface_mac.cc
@@ -234,14 +234,25 @@ bool IOSurfaceImageTransportSurface::SwapBuffers() {
bool IOSurfaceImageTransportSurface::PostSubBuffer(
int x, int y, int width, int height) {
- NOTREACHED();
- return false;
+ glFlush();
+
+ GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params;
+ params.surface_id = io_surface_id_;
+ params.x = x;
+ params.y = y;
+ params.width = width;
+ params.height = height;
+ helper_->SendAcceleratedSurfacePostSubBuffer(params);
+
+ helper_->SetScheduled(false);
+ return true;
}
std::string IOSurfaceImageTransportSurface::GetExtensions() {
std::string extensions = gfx::GLSurface::GetExtensions();
extensions += extensions.empty() ? "" : " ";
- extensions += "GL_CHROMIUM_front_buffer_cached";
+ extensions += "GL_CHROMIUM_front_buffer_cached ";
+ extensions += "GL_CHROMIUM_post_sub_buffer";
return extensions;
}
@@ -254,7 +265,7 @@ void IOSurfaceImageTransportSurface::OnBuffersSwappedACK() {
}
void IOSurfaceImageTransportSurface::OnPostSubBufferACK() {
- NOTREACHED();
+ helper_->SetScheduled(true);
}
void IOSurfaceImageTransportSurface::OnNewSurfaceACK(
@@ -457,14 +468,50 @@ bool TransportDIBImageTransportSurface::SwapBuffers() {
bool TransportDIBImageTransportSurface::PostSubBuffer(
int x, int y, int width, int height) {
- NOTREACHED();
- return false;
+ DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL));
+
+ GLint previous_fbo_id = 0;
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &previous_fbo_id);
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_id_);
+
+ GLint current_alignment = 0, current_pack_row_length = 0;
+ glGetIntegerv(GL_PACK_ALIGNMENT, &current_alignment);
+ glGetIntegerv(GL_PACK_ROW_LENGTH, &current_pack_row_length);
+
+ glPixelStorei(GL_PACK_ALIGNMENT, 4);
+ glPixelStorei(GL_PACK_ROW_LENGTH, size_.width());
+
+ unsigned char* buffer =
+ static_cast<unsigned char*>(shared_mem_->memory());
+ glReadPixels(x, y,
+ width, height,
+ GL_BGRA, // This pixel format should have no conversion.
+ GL_UNSIGNED_INT_8_8_8_8_REV,
+ &buffer[(x + y * size_.width()) * 4]);
+
+ glPixelStorei(GL_PACK_ALIGNMENT, current_alignment);
+ glPixelStorei(GL_PACK_ROW_LENGTH, current_pack_row_length);
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, previous_fbo_id);
+
+ GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params;
+ params.surface_id = next_id_;
+ params.x = x;
+ params.y = y;
+ params.width = width;
+ params.height = height;
+ helper_->SendAcceleratedSurfacePostSubBuffer(params);
+
+ helper_->SetScheduled(false);
+ return true;
}
std::string TransportDIBImageTransportSurface::GetExtensions() {
std::string extensions = gfx::GLSurface::GetExtensions();
extensions += extensions.empty() ? "" : " ";
- extensions += "GL_CHROMIUM_front_buffer_cached";
+ extensions += "GL_CHROMIUM_front_buffer_cached ";
+ extensions += "GL_CHROMIUM_post_sub_buffer";
return extensions;
}
@@ -477,7 +524,7 @@ void TransportDIBImageTransportSurface::OnBuffersSwappedACK() {
}
void TransportDIBImageTransportSurface::OnPostSubBufferACK() {
- NOTREACHED();
+ helper_->SetScheduled(true);
}
void TransportDIBImageTransportSurface::OnNewSurfaceACK(
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_mac.mm ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698