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