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)
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#ifndef CONTENT_RENDERER_PEPPER_PPB_GRAPHICS_3D_IMPL_H_
6bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#define CONTENT_RENDERER_PEPPER_PPB_GRAPHICS_3D_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/shared_memory.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/common/mailbox.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_graphics_3d_shared.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content {
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class CommandBufferProxyImpl;
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class GpuChannelHost;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass PPB_Graphics3D_Impl : public ppapi::PPB_Graphics3D_Shared {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static PP_Resource Create(PP_Instance instance,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            PP_Resource share_context,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const int32_t* attrib_list);
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static PP_Resource CreateRaw(
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PP_Instance instance,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PP_Resource share_context,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const int32_t* attrib_list,
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::SharedMemoryHandle* shared_state_handle);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PPB_Graphics3D_API trusted implementation.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Bool SetGetBuffer(int32_t transfer_buffer_id) OVERRIDE;
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual scoped_refptr<gpu::Buffer> CreateTransferBuffer(uint32_t size,
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                                          int32* id) OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Bool DestroyTransferBuffer(int32_t id) OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Bool Flush(int32_t put_offset) OVERRIDE;
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual gpu::CommandBuffer::State WaitForTokenInRange(int32_t start,
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                        int32_t end) OVERRIDE;
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual gpu::CommandBuffer::State WaitForGetOffsetInRange(int32_t start,
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                            int32_t end)
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      OVERRIDE;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32_t InsertSyncPoint() OVERRIDE;
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual uint32_t InsertFutureSyncPoint() OVERRIDE;
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void RetireSyncPoint(uint32_t) OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Binds/unbinds the graphics of this context with the associated instance.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if binding/unbinding is successful.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool BindToInstance(bool bind);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the backing texture is always opaque.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsOpaque();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifications about the view's progress painting.  See PluginInstance.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These messages are used to send Flush callbacks to the plugin.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ViewInitiatedPaint();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ViewFlushedPaint();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void GetBackingMailbox(gpu::Mailbox* mailbox, uint32* sync_point) {
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    *mailbox = mailbox_;
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    *sync_point = sync_point_;
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int GetCommandBufferRouteId();
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GpuChannelHost* channel() { return channel_.get(); }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
66bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  virtual ~PPB_Graphics3D_Impl();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ppapi::PPB_Graphics3D_Shared overrides.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gpu::CommandBuffer* GetCommandBuffer() OVERRIDE;
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual gpu::GpuControl* GetGpuControl() OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32 DoSwapBuffers() OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PPB_Graphics3D_Impl(PP_Instance instance);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool Init(PPB_Graphics3D_API* share_context, const int32_t* attrib_list);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool InitRaw(PPB_Graphics3D_API* share_context,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const int32_t* attrib_list,
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               base::SharedMemoryHandle* shared_state_handle);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifications received from the GPU process.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSwapBuffers();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnContextLost();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnConsoleMessage(const std::string& msg, int id);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifications sent to plugin.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendContextLost();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if context is bound to instance.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bound_to_instance_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True when waiting for compositor to commit our backing texture.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool commit_pending_;
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gpu::Mailbox mailbox_;
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32 sync_point_;
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool has_alpha_;
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<GpuChannelHost> channel_;
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CommandBufferProxyImpl* command_buffer_;
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<PPB_Graphics3D_Impl> weak_ptr_factory_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PPB_Graphics3D_Impl);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}  // namespace content
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif  // CONTENT_RENDERER_PEPPER_PPB_GRAPHICS_3D_IMPL_H_
106