- add sources.
[platform/framework/web/crosswalk.git] / src / gpu / command_buffer / service / command_buffer_service.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_COMMAND_BUFFER_SERVICE_H_
6 #define GPU_COMMAND_BUFFER_SERVICE_COMMAND_BUFFER_SERVICE_H_
7
8 #include "base/callback.h"
9 #include "base/memory/shared_memory.h"
10 #include "gpu/command_buffer/common/command_buffer.h"
11 #include "gpu/command_buffer/common/command_buffer_shared.h"
12
13 namespace gpu {
14
15 class TransferBufferManagerInterface;
16
17 // An object that implements a shared memory command buffer and a synchronous
18 // API to manage the put and get pointers.
19 class GPU_EXPORT CommandBufferService : public CommandBuffer {
20  public:
21   typedef base::Callback<bool(int32)> GetBufferChangedCallback;
22   explicit CommandBufferService(
23       TransferBufferManagerInterface* transfer_buffer_manager);
24   virtual ~CommandBufferService();
25
26   // CommandBuffer implementation:
27   virtual bool Initialize() OVERRIDE;
28   virtual State GetState() OVERRIDE;
29   virtual State GetLastState() OVERRIDE;
30   virtual int32 GetLastToken() OVERRIDE;
31   virtual void Flush(int32 put_offset) OVERRIDE;
32   virtual State FlushSync(int32 put_offset, int32 last_known_get) OVERRIDE;
33   virtual void SetGetBuffer(int32 transfer_buffer_id) OVERRIDE;
34   virtual void SetGetOffset(int32 get_offset) OVERRIDE;
35   virtual Buffer CreateTransferBuffer(size_t size, int32* id) OVERRIDE;
36   virtual void DestroyTransferBuffer(int32 id) OVERRIDE;
37   virtual Buffer GetTransferBuffer(int32 id) OVERRIDE;
38   virtual void SetToken(int32 token) OVERRIDE;
39   virtual void SetParseError(error::Error error) OVERRIDE;
40   virtual void SetContextLostReason(error::ContextLostReason) OVERRIDE;
41
42   // Sets a callback that is called whenever the put offset is changed. When
43   // called with sync==true, the callback must not return until some progress
44   // has been made (unless the command buffer is empty), i.e. the get offset
45   // must have changed. It need not process the entire command buffer though.
46   // This allows concurrency between the writer and the reader while giving the
47   // writer a means of waiting for the reader to make some progress before
48   // attempting to write more to the command buffer. Takes ownership of
49   // callback.
50   virtual void SetPutOffsetChangeCallback(const base::Closure& callback);
51   // Sets a callback that is called whenever the get buffer is changed.
52   virtual void SetGetBufferChangeCallback(
53       const GetBufferChangedCallback& callback);
54   virtual void SetParseErrorCallback(const base::Closure& callback);
55
56   // Setup the shared memory that shared state should be copied into.
57   bool SetSharedStateBuffer(scoped_ptr<base::SharedMemory> shared_state_shm);
58
59   // Copy the current state into the shared state transfer buffer.
60   void UpdateState();
61
62   // Register an existing shared memory object and get an ID that can be used
63   // to identify it in the command buffer. Callee dups the handle until
64   // DestroyTransferBuffer is called.
65   bool RegisterTransferBuffer(int32 id,
66                               base::SharedMemory* shared_memory,
67                               size_t size);
68
69  private:
70   int32 ring_buffer_id_;
71   Buffer ring_buffer_;
72   scoped_ptr<base::SharedMemory> shared_state_shm_;
73   CommandBufferSharedState* shared_state_;
74   int32 num_entries_;
75   int32 get_offset_;
76   int32 put_offset_;
77   base::Closure put_offset_change_callback_;
78   GetBufferChangedCallback get_buffer_change_callback_;
79   base::Closure parse_error_callback_;
80   TransferBufferManagerInterface* transfer_buffer_manager_;
81   int32 token_;
82   uint32 generation_;
83   error::Error error_;
84   error::ContextLostReason context_lost_reason_;
85
86   DISALLOW_COPY_AND_ASSIGN(CommandBufferService);
87 };
88
89 }  // namespace gpu
90
91 #endif  // GPU_COMMAND_BUFFER_SERVICE_COMMAND_BUFFER_SERVICE_H_