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