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.
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_COMMAND_BUFFER_SERVICE_H_
6 #define GPU_COMMAND_BUFFER_SERVICE_COMMAND_BUFFER_SERVICE_H_
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"
15 class TransferBufferManagerInterface;
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 {
21 typedef base::Callback<bool(int32)> GetBufferChangedCallback;
22 explicit CommandBufferService(
23 TransferBufferManagerInterface* transfer_buffer_manager);
24 virtual ~CommandBufferService();
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;
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
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);
56 // Setup the shared memory that shared state should be copied into.
57 bool SetSharedStateBuffer(scoped_ptr<base::SharedMemory> shared_state_shm);
59 // Copy the current state into the shared state transfer buffer.
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,
70 int32 ring_buffer_id_;
72 scoped_ptr<base::SharedMemory> shared_state_shm_;
73 CommandBufferSharedState* shared_state_;
77 base::Closure put_offset_change_callback_;
78 GetBufferChangedCallback get_buffer_change_callback_;
79 base::Closure parse_error_callback_;
80 TransferBufferManagerInterface* transfer_buffer_manager_;
84 error::ContextLostReason context_lost_reason_;
86 DISALLOW_COPY_AND_ASSIGN(CommandBufferService);
91 #endif // GPU_COMMAND_BUFFER_SERVICE_COMMAND_BUFFER_SERVICE_H_