ppapi_command_buffer_proxy.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_command_buffer_proxy.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/proxy_channel.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/api_id.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/host_resource.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PpapiCommandBufferProxy::PpapiCommandBufferProxy( 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ppapi::HostResource& resource, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyChannel* channel) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : resource_(resource), 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_(channel) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PpapiCommandBufferProxy::~PpapiCommandBufferProxy() { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete all the locally cached shared memory objects, closing the handle 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in this process. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (TransferBufferMap::iterator it = transfer_buffers_.begin(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != transfer_buffers_.end(); ++it) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete it->second.shared_memory; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->second.shared_memory = NULL; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::ReportChannelError() { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!channel_error_callback_.is_null()) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_error_callback_.Run(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_error_callback_.Reset(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PpapiCommandBufferProxy::GetRouteID() const { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PpapiCommandBufferProxy::Echo(const base::Closure& callback) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PpapiCommandBufferProxy::SetParent( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBufferProxy* parent_command_buffer, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 parent_texture_id) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(fsamuel): Need a proper implementation of this to support offscreen 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // contexts in the guest renderer (WebGL, canvas, etc). 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::SetChannelErrorCallback( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_error_callback_ = callback; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PpapiCommandBufferProxy::Initialize() { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Send(new PpapiHostMsg_PPBGraphics3D_InitCommandBuffer( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::API_ID_PPB_GRAPHICS_3D, resource_)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::CommandBuffer::State PpapiCommandBufferProxy::GetState() { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send will flag state with lost context if IPC fails. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_state_.error == gpu::error::kNoError) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::CommandBuffer::State state; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Send(new PpapiHostMsg_PPBGraphics3D_GetState( 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::API_ID_PPB_GRAPHICS_3D, resource_, &state, &success))) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateState(state, success); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_state_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::CommandBuffer::State PpapiCommandBufferProxy::GetLastState() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: The locking command buffer wrapper does not take a global lock before 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calling this function. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_state_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::Flush(int32 put_offset) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_state_.error != gpu::error::kNoError) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* message = new PpapiHostMsg_PPBGraphics3D_AsyncFlush( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::API_ID_PPB_GRAPHICS_3D, resource_, put_offset); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not let a synchronous flush hold up this message. If this handler is 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deferred until after the synchronous flush completes, it will overwrite the 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cached last_state_ with out-of-date data. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message->set_unblock(true); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(message); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::CommandBuffer::State PpapiCommandBufferProxy::FlushSync(int32 put_offset, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 last_known_get) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_known_get == last_state_.get_offset) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send will flag state with lost context if IPC fails. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_state_.error == gpu::error::kNoError) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::CommandBuffer::State state; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Send(new PpapiHostMsg_PPBGraphics3D_Flush( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::API_ID_PPB_GRAPHICS_3D, resource_, put_offset, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_known_get, &state, &success))) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateState(state, success); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Flush(put_offset); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_state_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::SetGetBuffer(int32 transfer_buffer_id) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_state_.error == gpu::error::kNoError) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new PpapiHostMsg_PPBGraphics3D_SetGetBuffer( 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::API_ID_PPB_GRAPHICS_3D, resource_, transfer_buffer_id)); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::SetGetOffset(int32 get_offset) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not implemented in proxy. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 PpapiCommandBufferProxy::CreateTransferBuffer( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id_request) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_state_.error == gpu::error::kNoError) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Send(new PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::API_ID_PPB_GRAPHICS_3D, resource_, size, &id))) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return id; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 PpapiCommandBufferProxy::RegisterTransferBuffer( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemory* shared_memory, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id_request) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not implemented in proxy. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::DestroyTransferBuffer(int32 id) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_state_.error != gpu::error::kNoError) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the transfer buffer from the client side4 cache. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransferBufferMap::iterator it = transfer_buffers_.find(id); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != transfer_buffers_.end()) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the shared memory object, closing the handle in this process. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete it->second.shared_memory; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffers_.erase(it); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new PpapiHostMsg_PPBGraphics3D_DestroyTransferBuffer( 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::API_ID_PPB_GRAPHICS_3D, resource_, id)); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::Buffer PpapiCommandBufferProxy::GetTransferBuffer(int32 id) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_state_.error != gpu::error::kNoError) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gpu::Buffer(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check local cache to see if there is already a client side shared memory 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // object for this id. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransferBufferMap::iterator it = transfer_buffers_.find(id); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != transfer_buffers_.end()) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it->second; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assuming we are in the renderer process, the service is responsible for 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // duplicating the handle. This might not be true for NaCl. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::proxy::SerializedHandle handle( 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::proxy::SerializedHandle::SHARED_MEMORY); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Send(new PpapiHostMsg_PPBGraphics3D_GetTransferBuffer( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::API_ID_PPB_GRAPHICS_3D, resource_, id, &handle))) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gpu::Buffer(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!handle.is_shmem()) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gpu::Buffer(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cache the transfer buffer shared memory object client side. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::SharedMemory> shared_memory( 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::SharedMemory(handle.shmem(), false)); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map the shared memory on demand. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!shared_memory->memory()) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!shared_memory->Map(handle.size())) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gpu::Buffer(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::Buffer buffer; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.ptr = shared_memory->memory(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.size = handle.size(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.shared_memory = shared_memory.release(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffers_[id] = buffer; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buffer; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::SetToken(int32 token) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::SetParseError(gpu::error::Error error) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::SetContextLostReason( 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::error::ContextLostReason reason) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PpapiCommandBufferProxy::Send(IPC::Message* msg) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(last_state_.error == gpu::error::kNoError); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel_->Send(msg)) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_state_.error = gpu::error::kLostContext; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::UpdateState( 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gpu::CommandBuffer::State& state, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle wraparound. It works as long as we don't have more than 2B state 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updates in flight across which reordering occurs. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (success) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state.generation - last_state_.generation < 0x80000000U) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_state_ = state; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_state_.error = gpu::error::kLostContext; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++last_state_.generation; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 254