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/shared_impl/proxy_lock.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/resource_creation_api.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResourceNoLock;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics3D_API;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::ResourceCreationAPI;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kCommandBufferSize = 1024 * 1024;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kTransferBufferSize = 1024 * 1024;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::SharedMemoryHandle TransportSHMHandleFromInt(Dispatcher* dispatcher,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int shm_handle) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(piman): Change trusted interface to return a PP_FileHandle, those
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // casts are ugly.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformFile source =
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<HANDLE>(static_cast<intptr_t>(shm_handle));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shm_handle;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #error Not implemented.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't close the handle, it doesn't belong to us.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dispatcher->ShareHandleWithRemote(source, false);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gpu::CommandBuffer::State GetErrorState() {
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gpu::CommandBuffer::State error_state;
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  error_state.error = gpu::error::kGenericError;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error_state;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class just wraps a CommandBuffer and optionally locks around every
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method. This is used to ensure that we have the Proxy lock any time we enter
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PpapiCommandBufferProxy.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note, for performance reasons, most of this code is not truly thread
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// safe in the sense of multiple threads concurrently rendering to the same
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Graphics3D context; this isn't allowed, and will likely either crash or
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// result in undefined behavior.  It is assumed that the thread which creates
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the Graphics3D context will be the thread on which subsequent gl rendering
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will be done.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(nfullagar): At some point, allow multiple threads to concurrently render
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// each to its own context.  First step is to allow a single thread (either main
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread or background thread) to render to a single Graphics3D context.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Graphics3D::LockingCommandBuffer : public gpu::CommandBuffer {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit LockingCommandBuffer(gpu::CommandBuffer* gpu_command_buffer)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : gpu_command_buffer_(gpu_command_buffer), need_to_lock_(true) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~LockingCommandBuffer() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_need_to_lock(bool need_to_lock) { need_to_lock_ = need_to_lock; }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool need_to_lock() const { return need_to_lock_; }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MaybeLock acquires the proxy lock on construction if and only if
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need_to_lock is true. If it acquired the lock, it releases it on
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destruction. If need_to_lock is false, then the lock must already be held.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MaybeLock {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit MaybeLock(bool need_to_lock) : locked_(need_to_lock) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (need_to_lock)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ppapi::ProxyLock::Acquire();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ppapi::ProxyLock::AssertAcquired();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~MaybeLock() {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (locked_)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ppapi::ProxyLock::Release();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool locked_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gpu::CommandBuffer implementation:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Initialize() OVERRIDE {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gpu_command_buffer_->Initialize();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual State GetState() OVERRIDE {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gpu_command_buffer_->GetState();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual State GetLastState() OVERRIDE {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // During a normal scene, the vast majority of calls are to GetLastState().
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't allow multi-threaded rendering on the same contex, so for
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // performance reasons, avoid the global lock for this entry point.  We can
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // get away with this here because the underlying implementation of
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GetLastState() is trivial and does not involve global or shared state
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // between other contexts.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(nfullagar): We can probably skip MaybeLock for other methods, but
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the performance gain may not be worth it.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // MaybeLock lock(need_to_lock_);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gpu_command_buffer_->GetLastState();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int32 GetLastToken() OVERRIDE {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return GetLastState().token;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Flush(int32 put_offset) OVERRIDE {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_command_buffer_->Flush(put_offset);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual State FlushSync(int32 put_offset, int32 last_known_get) OVERRIDE {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gpu_command_buffer_->FlushSync(put_offset, last_known_get);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetGetBuffer(int32 transfer_buffer_id) OVERRIDE {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_command_buffer_->SetGetBuffer(transfer_buffer_id);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetGetOffset(int32 get_offset) OVERRIDE {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_command_buffer_->SetGetOffset(get_offset);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gpu::Buffer CreateTransferBuffer(size_t size,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           int32* id) OVERRIDE {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gpu_command_buffer_->CreateTransferBuffer(size, id);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyTransferBuffer(int32 id) OVERRIDE {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_command_buffer_->DestroyTransferBuffer(id);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gpu::Buffer GetTransferBuffer(int32 id) OVERRIDE {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gpu_command_buffer_->GetTransferBuffer(id);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetToken(int32 token) OVERRIDE {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_command_buffer_->SetToken(token);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetParseError(gpu::error::Error error) OVERRIDE {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_command_buffer_->SetParseError(error);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetContextLostReason(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gpu::error::ContextLostReason reason) OVERRIDE {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MaybeLock lock(need_to_lock_);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_command_buffer_->SetContextLostReason(reason);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32 InsertSyncPoint() OVERRIDE {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MaybeLock lock(need_to_lock_);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gpu_command_buffer_->InsertSyncPoint();
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak pointer - see class Graphics3D for the scopted_ptr.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::CommandBuffer* gpu_command_buffer_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool need_to_lock_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Graphics3D::Graphics3D(const HostResource& resource)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : PPB_Graphics3D_Shared(resource),
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_already_locked_calls_(0) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Graphics3D::~Graphics3D() {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DestroyGLES2Impl();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Graphics3D::Init(gpu::gles2::GLES2Implementation* share_gles2) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginDispatcher* dispatcher = PluginDispatcher::GetForResource(this);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_.reset(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PpapiCommandBufferProxy(host_resource(), dispatcher));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  locking_command_buffer_.reset(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new LockingCommandBuffer(command_buffer_.get()));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedNoLocking already_locked(this);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateGLES2Impl(kCommandBufferSize, kTransferBufferSize,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         share_gles2);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool Graphics3D::SetGetBuffer(int32_t /* transfer_buffer_id */) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FALSE;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gpu::CommandBuffer::State Graphics3D::GetState() {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetErrorState();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool Graphics3D::Flush(int32_t put_offset) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FALSE;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gpu::CommandBuffer::State Graphics3D::FlushSync(int32_t put_offset) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetErrorState();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Graphics3D::CreateTransferBuffer(uint32_t size) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FALSE;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool Graphics3D::DestroyTransferBuffer(int32_t id) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FALSE;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool Graphics3D::GetTransferBuffer(int32_t id,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int* shm_handle,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      uint32_t* shm_size) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FALSE;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gpu::CommandBuffer::State Graphics3D::FlushSyncFast(int32_t put_offset,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    int32_t last_known_get) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetErrorState();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32_t Graphics3D::InsertSyncPoint() {
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 0;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::CommandBuffer* Graphics3D::GetCommandBuffer() {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return locking_command_buffer_.get();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 Graphics3D::DoSwapBuffers() {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gles2_impl()->SwapBuffers() results in CommandBuffer calls, and we already
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have the proxy lock.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedNoLocking already_locked(this);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gles2_impl()->SwapBuffers();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message* msg = new PpapiHostMsg_PPBGraphics3D_SwapBuffers(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      API_ID_PPB_GRAPHICS_3D, host_resource());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  msg->set_unblock(true);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginDispatcher::GetForResource(this)->Send(msg);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Graphics3D::PushAlreadyLocked() {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::ProxyLock::AssertAcquired();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (num_already_locked_calls_ == 0)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    locking_command_buffer_->set_need_to_lock(false);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++num_already_locked_calls_;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Graphics3D::PopAlreadyLocked() {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We must have Pushed before we can Pop.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!locking_command_buffer_->need_to_lock());
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(num_already_locked_calls_, 0);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::ProxyLock::AssertAcquired();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --num_already_locked_calls_;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (num_already_locked_calls_ == 0)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    locking_command_buffer_->set_need_to_lock(true);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Graphics3D_Proxy::PPB_Graphics3D_Proxy(Dispatcher* dispatcher)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : InterfaceProxy(dispatcher),
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      callback_factory_(this) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Graphics3D_Proxy::~PPB_Graphics3D_Proxy() {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource PPB_Graphics3D_Proxy::CreateProxyResource(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Resource share_context,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int32_t* attrib_list) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ERROR_BADARGUMENT;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResource share_host;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::GLES2Implementation* share_gles2 = NULL;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (share_context != 0) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnterResourceNoLock<PPB_Graphics3D_API> enter(share_context, true);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (enter.failed())
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_ERROR_BADARGUMENT;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PPB_Graphics3D_Shared* share_graphics =
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<PPB_Graphics3D_Shared*>(enter.object());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    share_host = share_graphics->host_resource();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    share_gles2 = share_graphics->gles2_impl();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32_t> attribs;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attrib_list) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (const int32_t* attr = attrib_list;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         attr[0] != PP_GRAPHICS3DATTRIB_NONE;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         attr += 2) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attribs.push_back(attr[0]);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attribs.push_back(attr[1]);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(PP_GRAPHICS3DATTRIB_NONE);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResource result;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->Send(new PpapiHostMsg_PPBGraphics3D_Create(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      API_ID_PPB_GRAPHICS_3D, instance, share_host, attribs, &result));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result.is_null())
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Graphics3D> graphics_3d(new Graphics3D(result));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!graphics_3d->Init(share_gles2))
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return graphics_3d->GetReference();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPB_Graphics3D_Proxy::OnMessageReceived(const IPC::Message& msg) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(PPB_Graphics3D_Proxy, msg)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_NACL)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_Create,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgCreate)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_SetGetBuffer,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgSetGetBuffer)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_GetState,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgGetState)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_Flush,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgFlush)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_AsyncFlush,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgAsyncFlush)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgCreateTransferBuffer)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_DestroyTransferBuffer,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgDestroyTransferBuffer)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_GetTransferBuffer,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgGetTransferBuffer)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_SwapBuffers,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgSwapBuffers)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_InsertSyncPoint,
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnMsgInsertSyncPoint)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // !defined(OS_NACL)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPBGraphics3D_SwapBuffersACK,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgSwapBuffersACK)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME(brettw) handle bad messages!
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_NACL)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgCreate(PP_Instance instance,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       HostResource share_context,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const std::vector<int32_t>& attribs,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       HostResource* result) {
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (attribs.empty() ||
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      attribs.back() != PP_GRAPHICS3DATTRIB_NONE ||
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !(attribs.size() & 1))
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // Bad message.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  thunk::EnterResourceCreation enter(instance);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded()) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetHostResource(
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enter.functions()->CreateGraphics3DRaw(instance,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             share_context.host_resource(),
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             &attribs.front()));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgSetGetBuffer(
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostResource& context,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 transfer_buffer_id) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enter.object()->SetGetBuffer(transfer_buffer_id);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgGetState(const HostResource& context,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         gpu::CommandBuffer::State* state,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool* success) {
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed()) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *success = false;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  *state = enter.object()->GetState();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *success = true;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgFlush(const HostResource& context,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int32 put_offset,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int32 last_known_get,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      gpu::CommandBuffer::State* state,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool* success) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed()) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *success = false;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  *state = enter.object()->FlushSyncFast(put_offset, last_known_get);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *success = true;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgAsyncFlush(const HostResource& context,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int32 put_offset) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enter.object()->Flush(put_offset);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgCreateTransferBuffer(
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostResource& context,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32 size,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32* id) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *id = enter.object()->CreateTransferBuffer(size);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *id = -1;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgDestroyTransferBuffer(
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostResource& context,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 id) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enter.object()->DestroyTransferBuffer(id);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgGetTransferBuffer(
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostResource& context,
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 id,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::proxy::SerializedHandle* transfer_buffer) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transfer_buffer->set_null_shmem();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int shm_handle = 0;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t shm_size = 0;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded() &&
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enter.object()->GetTransferBuffer(id, &shm_handle, &shm_size)) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    transfer_buffer->set_shmem(
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TransportSHMHandleFromInt(dispatcher(), shm_handle),
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        shm_size);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgSwapBuffers(const HostResource& context) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterHostFromHostResourceForceCallback<PPB_Graphics3D_API> enter(
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context, callback_factory_,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &PPB_Graphics3D_Proxy::SendSwapBuffersACKToPlugin, context);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enter.SetResult(enter.object()->SwapBuffers(enter.callback()));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgInsertSyncPoint(const HostResource& context,
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                uint32* sync_point) {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *sync_point = 0;
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (enter.succeeded())
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *sync_point = enter.object()->InsertSyncPoint();
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // !defined(OS_NACL)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::OnMsgSwapBuffersACK(const HostResource& resource,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int32_t pp_error) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterPluginFromHostResource<PPB_Graphics3D_API> enter(resource);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_cast<Graphics3D*>(enter.object())->SwapBuffersACK(pp_error);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_NACL)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Graphics3D_Proxy::SendSwapBuffersACKToPlugin(
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32_t result,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostResource& context) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher()->Send(new PpapiMsg_PPBGraphics3D_SwapBuffersACK(
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      API_ID_PPB_GRAPHICS_3D, context, result));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // !defined(OS_NACL)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
498