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 GPU_COMMAND_BUFFER_SERVICE_COMMAND_BUFFER_SERVICE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_COMMAND_BUFFER_SERVICE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/shared_memory.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/command_buffer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/command_buffer_shared.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransferBufferManagerInterface;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass GPU_EXPORT CommandBufferServiceBase : public CommandBuffer {
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public:
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Sets the current get offset. This can be called from any thread.
20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void SetGetOffset(int32 get_offset) = 0;
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Get the transfer buffer associated with an ID. Returns a null buffer for
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // ID 0.
24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual scoped_refptr<gpu::Buffer> GetTransferBuffer(int32 id) = 0;
25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Allows the reader to update the current token value.
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void SetToken(int32 token) = 0;
28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Allows the reader to set the current parse error.
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void SetParseError(error::Error) = 0;
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Allows the reader to set the current context lost reason.
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // NOTE: if calling this in conjunction with SetParseError,
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // call this first.
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void SetContextLostReason(error::ContextLostReason) = 0;
36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch};
37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An object that implements a shared memory command buffer and a synchronous
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API to manage the put and get pointers.
40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass GPU_EXPORT CommandBufferService : public CommandBufferServiceBase {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<bool(int32)> GetBufferChangedCallback;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit CommandBufferService(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TransferBufferManagerInterface* transfer_buffer_manager);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~CommandBufferService();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CommandBuffer implementation:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Initialize() OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual State GetLastState() OVERRIDE;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int32 GetLastToken() OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Flush(int32 put_offset) OVERRIDE;
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void WaitForTokenInRange(int32 start, int32 end) OVERRIDE;
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void WaitForGetOffsetInRange(int32 start, int32 end) OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetGetBuffer(int32 transfer_buffer_id) OVERRIDE;
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual scoped_refptr<Buffer> CreateTransferBuffer(size_t size,
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                     int32* id) OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyTransferBuffer(int32 id) OVERRIDE;
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // CommandBufferServiceBase implementation:
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void SetGetOffset(int32 get_offset) OVERRIDE;
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual scoped_refptr<Buffer> GetTransferBuffer(int32 id) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetToken(int32 token) OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetParseError(error::Error error) OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetContextLostReason(error::ContextLostReason) OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a callback that is called whenever the put offset is changed. When
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called with sync==true, the callback must not return until some progress
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has been made (unless the command buffer is empty), i.e. the get offset
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must have changed. It need not process the entire command buffer though.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This allows concurrency between the writer and the reader while giving the
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // writer a means of waiting for the reader to make some progress before
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // attempting to write more to the command buffer. Takes ownership of
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetPutOffsetChangeCallback(const base::Closure& callback);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a callback that is called whenever the get buffer is changed.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetGetBufferChangeCallback(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetBufferChangedCallback& callback);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetParseErrorCallback(const base::Closure& callback);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setup the shared memory that shared state should be copied into.
81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void SetSharedStateBuffer(scoped_ptr<BufferBacking> shared_state_buffer);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy the current state into the shared state transfer buffer.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateState();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Registers an existing shared memory object and get an ID that can be used
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // to identify it in the command buffer.
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool RegisterTransferBuffer(int32 id, scoped_ptr<BufferBacking> buffer);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 ring_buffer_id_;
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<Buffer> ring_buffer_;
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<BufferBacking> shared_state_buffer_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferSharedState* shared_state_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 num_entries_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 get_offset_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 put_offset_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure put_offset_change_callback_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetBufferChangedCallback get_buffer_change_callback_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure parse_error_callback_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransferBufferManagerInterface* transfer_buffer_manager_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 token_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 generation_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error::Error error_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error::ContextLostReason context_lost_reason_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CommandBufferService);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_COMMAND_BUFFER_SERVICE_H_
113