Index: content/common/gpu/client/command_buffer_proxy_impl.cc |
diff --git a/content/common/gpu/client/command_buffer_proxy_impl.cc b/content/common/gpu/client/command_buffer_proxy_impl.cc |
index 94abbe1f4fec261c6df14da355b5069e2ee9e7e3..3fbe537d3401b9dbad302b44f9b00b43747ad908 100644 |
--- a/content/common/gpu/client/command_buffer_proxy_impl.cc |
+++ b/content/common/gpu/client/command_buffer_proxy_impl.cc |
@@ -367,7 +367,7 @@ void CommandBufferProxyImpl::SetContextLostReason( |
} |
bool CommandBufferProxyImpl::SupportsGpuMemoryBuffer() { |
- return false; |
+ return true; |
} |
gfx::GpuMemoryBuffer* CommandBufferProxyImpl::CreateGpuMemoryBuffer( |
@@ -375,12 +375,58 @@ gfx::GpuMemoryBuffer* CommandBufferProxyImpl::CreateGpuMemoryBuffer( |
size_t height, |
unsigned internalformat, |
int32* id) { |
- NOTREACHED(); |
- return NULL; |
+ *id = -1; |
+ |
+ if (last_state_.error != gpu::error::kNoError) |
+ return NULL; |
+ |
+ int32 new_id = channel_->ReserveGpuMemoryBufferId(); |
+ DCHECK(gpu_memory_buffers_.find(new_id) == gpu_memory_buffers_.end()); |
+ |
+ scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer( |
+ channel_->factory()->AllocateGpuMemoryBuffer(width, |
+ height, |
+ internalformat)); |
+ if (!gpu_memory_buffer) |
+ return NULL; |
+ |
+ DCHECK(GpuChannelHost::IsValidGpuMemoryBuffer( |
+ gpu_memory_buffer->GetHandle())); |
+ |
+ // This handle is owned by the GPU process and must be passed to it or it |
+ // will leak. In otherwords, do not early out on error between here and the |
+ // sending of the RegisterGpuMemoryBuffer IPC below. |
+ gfx::GpuMemoryBufferHandle handle = |
+ channel_->ShareGpuMemoryBufferToGpuProcess( |
+ gpu_memory_buffer->GetHandle()); |
+ |
+ if (!Send(new GpuCommandBufferMsg_RegisterGpuMemoryBuffer( |
+ route_id_, |
+ new_id, |
+ handle, |
+ width, |
+ height, |
+ internalformat))) { |
+ return NULL; |
+ } |
+ |
+ *id = new_id; |
+ gpu_memory_buffers_[new_id] = gpu_memory_buffer.release(); |
+ return gpu_memory_buffers_[new_id]; |
} |
void CommandBufferProxyImpl::DestroyGpuMemoryBuffer(int32 id) { |
- NOTREACHED(); |
+ if (last_state_.error != gpu::error::kNoError) |
+ return; |
+ |
+ // Remove the gpu memory buffer from the client side cache. |
+ GpuMemoryBufferMap::iterator it = gpu_memory_buffers_.find(id); |
+ if (it != gpu_memory_buffers_.end()) { |
+ delete it->second; |
+ gpu_memory_buffers_.erase(it); |
+ } |
+ |
+ Send(new GpuCommandBufferMsg_DestroyGpuMemoryBuffer(route_id_, id)); |
} |
int CommandBufferProxyImpl::GetRouteID() const { |