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/ppb_graphics_3d_proxy.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/command_buffer.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/enter_proxy.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_dispatcher.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_command_buffer_proxy.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/resource_creation_api.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResourceNoLock; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics3D_API; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::ResourceCreationAPI; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kCommandBufferSize = 1024 * 1024; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kTransferBufferSize = 1024 * 1024; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::SharedMemoryHandle TransportSHMHandle( 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Dispatcher* dispatcher, 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::SharedMemoryHandle& handle) { 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::PlatformFile source = IPC::PlatformFileForTransitToPlatformFile(handle); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't close the handle, it doesn't belong to us. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dispatcher->ShareHandleWithRemote(source, false); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gpu::CommandBuffer::State GetErrorState() { 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gpu::CommandBuffer::State error_state; 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) error_state.error = gpu::error::kGenericError; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error_state; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Graphics3D::Graphics3D(const HostResource& resource) 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : PPB_Graphics3D_Shared(resource) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Graphics3D::~Graphics3D() { 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DestroyGLES2Impl(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Graphics3D::Init(gpu::gles2::GLES2Implementation* share_gles2, 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const SerializedHandle& shared_state) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDispatcher* dispatcher = PluginDispatcher::GetForResource(this); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_.reset( 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new PpapiCommandBufferProxy(host_resource(), dispatcher, shared_state)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateGLES2Impl(kCommandBufferSize, kTransferBufferSize, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) share_gles2); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool Graphics3D::SetGetBuffer(int32_t /* transfer_buffer_id */) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool Graphics3D::Flush(int32_t put_offset) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochscoped_refptr<gpu::Buffer> Graphics3D::CreateTransferBuffer( 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch uint32_t size, 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int32_t* id) { 79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch *id = -1; 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return NULL; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool Graphics3D::DestroyTransferBuffer(int32_t id) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)gpu::CommandBuffer::State Graphics3D::WaitForTokenInRange(int32_t start, 8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int32_t end) { 8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return GetErrorState(); 9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)gpu::CommandBuffer::State Graphics3D::WaitForGetOffsetInRange(int32_t start, 9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int32_t end) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetErrorState(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32_t Graphics3D::InsertSyncPoint() { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdochuint32_t Graphics3D::InsertFutureSyncPoint() { 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 0; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid Graphics3D::RetireSyncPoint(uint32_t sync_point) { 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::CommandBuffer* Graphics3D::GetCommandBuffer() { 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return command_buffer_.get(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)gpu::GpuControl* Graphics3D::GetGpuControl() { 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return command_buffer_.get(); 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)int32 Graphics3D::DoSwapBuffers() { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_impl()->SwapBuffers(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* msg = new PpapiHostMsg_PPBGraphics3D_SwapBuffers( 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_GRAPHICS_3D, host_resource()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg->set_unblock(true); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDispatcher::GetForResource(this)->Send(msg); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Graphics3D_Proxy::PPB_Graphics3D_Proxy(Dispatcher* dispatcher) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : InterfaceProxy(dispatcher), 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_factory_(this) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Graphics3D_Proxy::~PPB_Graphics3D_Proxy() { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource PPB_Graphics3D_Proxy::CreateProxyResource( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource share_context, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int32_t* attrib_list) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_BADARGUMENT; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostResource share_host; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::gles2::GLES2Implementation* share_gles2 = NULL; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (share_context != 0) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResourceNoLock<PPB_Graphics3D_API> enter(share_context, true); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_BADARGUMENT; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_Graphics3D_Shared* share_graphics = 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PPB_Graphics3D_Shared*>(enter.object()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) share_host = share_graphics->host_resource(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) share_gles2 = share_graphics->gles2_impl(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int32_t> attribs; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attrib_list) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (const int32_t* attr = attrib_list; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr[0] != PP_GRAPHICS3DATTRIB_NONE; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr += 2) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attribs.push_back(attr[0]); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attribs.push_back(attr[1]); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attribs.push_back(PP_GRAPHICS3DATTRIB_NONE); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostResource result; 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ppapi::proxy::SerializedHandle shared_state; 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dispatcher->Send(new PpapiHostMsg_PPBGraphics3D_Create(API_ID_PPB_GRAPHICS_3D, 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance, share_host, attribs, &result, &shared_state)); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result.is_null()) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Graphics3D> graphics_3d(new Graphics3D(result)); 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!graphics_3d->Init(share_gles2, shared_state)) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return graphics_3d->GetReference(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPB_Graphics3D_Proxy::OnMessageReceived(const IPC::Message& msg) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PPB_Graphics3D_Proxy, msg) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_NACL) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_Create, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgCreate) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_SetGetBuffer, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgSetGetBuffer) 19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_WaitForTokenInRange, 19323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) OnMsgWaitForTokenInRange) 19423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_WaitForGetOffsetInRange, 19523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) OnMsgWaitForGetOffsetInRange) 19623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_AsyncFlush, OnMsgAsyncFlush) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgCreateTransferBuffer) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_DestroyTransferBuffer, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgDestroyTransferBuffer) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_SwapBuffers, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgSwapBuffers) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_InsertSyncPoint, 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnMsgInsertSyncPoint) 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_InsertFutureSyncPoint, 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnMsgInsertFutureSyncPoint) 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_RetireSyncPoint, 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnMsgRetireSyncPoint) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // !defined(OS_NACL) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPBGraphics3D_SwapBuffersACK, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgSwapBuffersACK) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME(brettw) handle bad messages! 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_NACL) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgCreate(PP_Instance instance, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostResource share_context, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<int32_t>& attribs, 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostResource* result, 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SerializedHandle* shared_state) { 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shared_state->set_null_shmem(); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (attribs.empty() || 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attribs.back() != PP_GRAPHICS3DATTRIB_NONE || 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !(attribs.size() & 1)) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Bad message. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thunk::EnterResourceCreation enter(instance); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!enter.succeeded()) 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::SharedMemoryHandle handle = IPC::InvalidPlatformFileForTransit(); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result->SetHostResource( 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.functions()->CreateGraphics3DRaw(instance, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) share_context.host_resource(), 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &attribs.front(), 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &handle)); 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!result->is_null()) { 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shared_state->set_shmem(TransportSHMHandle(dispatcher(), handle), 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(gpu::CommandBuffer::State)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgSetGetBuffer( 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostResource& context, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 transfer_buffer_id) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.succeeded()) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.object()->SetGetBuffer(transfer_buffer_id); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgWaitForTokenInRange( 25923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const HostResource& context, 26023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int32 start, 26123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int32 end, 26223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) gpu::CommandBuffer::State* state, 26323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool* success) { 26423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 26523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (enter.failed()) { 26623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) *success = false; 26723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return; 26823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 26923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) *state = enter.object()->WaitForTokenInRange(start, end); 27023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) *success = true; 27123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 27223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 27323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgWaitForGetOffsetInRange( 27423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const HostResource& context, 27523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int32 start, 27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int32 end, 27723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) gpu::CommandBuffer::State* state, 27823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool* success) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *success = false; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) *state = enter.object()->WaitForGetOffsetInRange(start, end); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *success = true; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgAsyncFlush(const HostResource& context, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 put_offset) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.succeeded()) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.object()->Flush(put_offset); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgCreateTransferBuffer( 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostResource& context, 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 size, 298e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int32* id, 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SerializedHandle* transfer_buffer) { 300e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch transfer_buffer->set_null_shmem(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 302e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (enter.succeeded()) { 303e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<gpu::Buffer> buffer = 304e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch enter.object()->CreateTransferBuffer(size, id); 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!buffer.get()) 306e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 307e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gpu::SharedMemoryBufferBacking* backing = 308e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static_cast<gpu::SharedMemoryBufferBacking*>(buffer->backing()); 309e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(backing && backing->shared_memory()); 310e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch transfer_buffer->set_shmem( 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSHMHandle(dispatcher(), backing->shared_memory()->handle()), 312e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch buffer->size()); 313e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } else { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *id = -1; 315e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgDestroyTransferBuffer( 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostResource& context, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.succeeded()) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.object()->DestroyTransferBuffer(id); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgSwapBuffers(const HostResource& context) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterHostFromHostResourceForceCallback<PPB_Graphics3D_API> enter( 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context, callback_factory_, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &PPB_Graphics3D_Proxy::SendSwapBuffersACKToPlugin, context); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.succeeded()) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.SetResult(enter.object()->SwapBuffers(enter.callback())); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgInsertSyncPoint(const HostResource& context, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32* sync_point) { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *sync_point = 0; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.succeeded()) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *sync_point = enter.object()->InsertSyncPoint(); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 342116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PPB_Graphics3D_Proxy::OnMsgInsertFutureSyncPoint( 343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const HostResource& context, 344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32* sync_point) { 345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *sync_point = 0; 346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (enter.succeeded()) 348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *sync_point = enter.object()->InsertFutureSyncPoint(); 349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 351116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PPB_Graphics3D_Proxy::OnMsgRetireSyncPoint(const HostResource& context, 352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32 sync_point) { 353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (enter.succeeded()) 355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enter.object()->RetireSyncPoint(sync_point); 356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // !defined(OS_NACL) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgSwapBuffersACK(const HostResource& resource, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t pp_error) { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterPluginFromHostResource<PPB_Graphics3D_API> enter(resource); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.succeeded()) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<Graphics3D*>(enter.object())->SwapBuffersACK(pp_error); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_NACL) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::SendSwapBuffersACKToPlugin( 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostResource& context) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher()->Send(new PpapiMsg_PPBGraphics3D_SwapBuffersACK( 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_GRAPHICS_3D, context, result)); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // !defined(OS_NACL) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 378