diff options
author | pkotwicz@chromium.org <pkotwicz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-17 02:15:58 +0000 |
---|---|---|
committer | pkotwicz@chromium.org <pkotwicz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-17 02:15:58 +0000 |
commit | ddecaea368754bd40d5bf18cb46a737a21ab089d (patch) | |
tree | a5d7dd6c1d6e1f4069275313cf924bef0278c04e /content/common | |
parent | 07effdb513a6dd2700a5647b10280787925cabee (diff) | |
download | chromium_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.cc | 32 |
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() { |