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)#ifndef PPAPI_PROXY_COMMAND_BUFFER_PROXY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_PROXY_COMMAND_BUFFER_PROXY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/client/gpu_control.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/command_buffer.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gpu/command_buffer/common/command_buffer_shared.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_export.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/host_resource.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Message;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyChannel;
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SerializedHandle;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class PPAPI_PROXY_EXPORT PpapiCommandBufferProxy : public gpu::CommandBuffer,
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                   public gpu::GpuControl {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiCommandBufferProxy(const HostResource& resource,
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          ProxyChannel* channel,
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          const SerializedHandle& shared_state);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PpapiCommandBufferProxy();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gpu::CommandBuffer implementation:
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool Initialize() OVERRIDE;
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual State GetLastState() OVERRIDE;
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual int32 GetLastToken() OVERRIDE;
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void Flush(int32 put_offset) OVERRIDE;
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void WaitForTokenInRange(int32 start, int32 end) OVERRIDE;
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void WaitForGetOffsetInRange(int32 start, int32 end) OVERRIDE;
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetGetBuffer(int32 transfer_buffer_id) OVERRIDE;
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual scoped_refptr<gpu::Buffer> CreateTransferBuffer(size_t size,
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                          int32* id) OVERRIDE;
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DestroyTransferBuffer(int32 id) OVERRIDE;
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // gpu::GpuControl implementation:
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual gpu::Capabilities GetCapabilities() OVERRIDE;
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual gfx::GpuMemoryBuffer* CreateGpuMemoryBuffer(size_t width,
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      size_t height,
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      unsigned internalformat,
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      unsigned usage,
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      int32* id) OVERRIDE;
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DestroyGpuMemoryBuffer(int32 id) OVERRIDE;
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual uint32 InsertSyncPoint() OVERRIDE;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual uint32 InsertFutureSyncPoint() OVERRIDE;
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void RetireSyncPoint(uint32 sync_point) OVERRIDE;
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SignalSyncPoint(uint32 sync_point,
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                               const base::Closure& callback) OVERRIDE;
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SignalQuery(uint32 query,
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           const base::Closure& callback) OVERRIDE;
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetSurfaceVisible(bool visible) OVERRIDE;
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void Echo(const base::Closure& callback) OVERRIDE;
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual uint32 CreateStreamTexture(uint32 texture_id) OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Send(IPC::Message* msg);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateState(const gpu::CommandBuffer::State& state, bool success);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Try to read an updated copy of the state from shared memory.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void TryUpdateState();
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The shared memory area used to update state.
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gpu::CommandBufferSharedState* shared_state() const;
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State last_state_;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::SharedMemory> shared_state_shm_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResource resource_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyChannel* channel_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure channel_error_callback_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PpapiCommandBufferProxy);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // PPAPI_PROXY_COMMAND_BUFFER_PROXY_H_
91