summaryrefslogtreecommitdiffstats
path: root/content/common
diff options
context:
space:
mode:
authorpkotwicz@chromium.org <pkotwicz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-17 02:15:58 +0000
committerpkotwicz@chromium.org <pkotwicz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-17 02:15:58 +0000
commitddecaea368754bd40d5bf18cb46a737a21ab089d (patch)
treea5d7dd6c1d6e1f4069275313cf924bef0278c04e /content/common
parent07effdb513a6dd2700a5647b10280787925cabee (diff)
downloadchromium_src-ddecaea368754bd40d5bf18cb46a737a21ab089d.zip
chromium_src-ddecaea368754bd40d5bf18cb46a737a21ab089d.tar.gz
chromium_src-ddecaea368754bd40d5bf18cb46a737a21ab089d.tar.bz2
Implements partial swaps for osmesa
BUG=None TEST=None Review URL: http://codereview.chromium.org/8821030 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@114890 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/common')
-rw-r--r--content/common/gpu/image_transport_surface_linux.cc32
1 files changed, 28 insertions, 4 deletions
diff --git a/content/common/gpu/image_transport_surface_linux.cc b/content/common/gpu/image_transport_surface_linux.cc
index c4b789d..95903ef 100644
--- a/content/common/gpu/image_transport_surface_linux.cc
+++ b/content/common/gpu/image_transport_surface_linux.cc
@@ -739,14 +739,38 @@ bool OSMesaImageTransportSurface::SwapBuffers() {
bool OSMesaImageTransportSurface::PostSubBuffer(
int x, int y, int width, int height) {
- NOTREACHED();
- return false;
+ DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL));
+
+ // Copy the OSMesa buffer to the shared memory
+ glFinish();
+
+ int flipped_y = GetSize().height() - y - height;
+
+ for (int row = 0; row < height; ++row) {
+ int mem_offset = ((flipped_y + row) * size_.width() + x);
+ int32* dest_address = static_cast<int32*>(shared_mem_->memory()) +
+ mem_offset;
+ int32* src_address = static_cast<int32*>(GetHandle()) + mem_offset;
+ memcpy(dest_address, src_address, width * 4);
+ }
+
+ GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params;
+ params.surface_id = shared_id_;
+ params.x = x;
+ params.y = y;
+ params.width = width;
+ params.height = height;
+ helper_->SendAcceleratedSurfacePostSubBuffer(params);
+
+ helper_->SetScheduled(false);
+ return true;
}
std::string OSMesaImageTransportSurface::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;
}
@@ -755,7 +779,7 @@ void OSMesaImageTransportSurface::OnBuffersSwappedACK() {
}
void OSMesaImageTransportSurface::OnPostSubBufferACK() {
- NOTREACHED();
+ helper_->SetScheduled(true);
}
gfx::Size OSMesaImageTransportSurface::GetSize() {