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