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 // This file contains the command parser class. 6 7 #ifndef GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_ 8 #define GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_ 9 10 #include "gpu/command_buffer/common/constants.h" 11 #include "gpu/command_buffer/common/cmd_buffer_common.h" 12 #include "gpu/gpu_export.h" 13 14 namespace gpu { 15 16 class AsyncAPIInterface; 17 18 // Command parser class. This class parses commands from a shared memory 19 // buffer, to implement some asynchronous RPC mechanism. 20 class GPU_EXPORT CommandParser { 21 public: 22 explicit CommandParser(AsyncAPIInterface* handler); 23 24 // Sets the buffer to read commands from. 25 void SetBuffer( 26 void* shm_address, 27 size_t shm_size, 28 ptrdiff_t offset, 29 size_t size); 30 31 // Gets the "get" pointer. The get pointer is an index into the command 32 // buffer considered as an array of CommandBufferEntry. 33 CommandBufferOffset get() const { return get_; } 34 35 // Sets the "get" pointer. The get pointer is an index into the command buffer 36 // considered as an array of CommandBufferEntry. 37 bool set_get(CommandBufferOffset get) { 38 if (get >= 0 && get < entry_count_) { 39 get_ = get; 40 return true; 41 } 42 return false; 43 } 44 45 // Sets the "put" pointer. The put pointer is an index into the command 46 // buffer considered as an array of CommandBufferEntry. 47 void set_put(CommandBufferOffset put) { put_ = put; } 48 49 // Gets the "put" pointer. The put pointer is an index into the command 50 // buffer considered as an array of CommandBufferEntry. 51 CommandBufferOffset put() const { return put_; } 52 53 // Checks whether there are commands to process. 54 bool IsEmpty() const { return put_ == get_; } 55 56 // Processes one command, updating the get pointer. This will return an error 57 // if there are no commands in the buffer. 58 error::Error ProcessCommand(); 59 60 // Processes all commands until get == put. 61 error::Error ProcessAllCommands(); 62 63 // Reports an error. 64 void ReportError(unsigned int command_id, error::Error result); 65 66 private: 67 CommandBufferOffset get_; 68 CommandBufferOffset put_; 69 CommandBufferEntry* buffer_; 70 int32 entry_count_; 71 AsyncAPIInterface* handler_; 72 }; 73 74 // This class defines the interface for an asynchronous API handler, that 75 // is responsible for de-multiplexing commands and their arguments. 76 class AsyncAPIInterface { 77 public: 78 AsyncAPIInterface() {} 79 virtual ~AsyncAPIInterface() {} 80 81 // Executes a command. 82 // Parameters: 83 // command: the command index. 84 // arg_count: the number of CommandBufferEntry arguments. 85 // cmd_data: the command data. 86 // Returns: 87 // error::kNoError if no error was found, one of 88 // error::Error otherwise. 89 virtual error::Error DoCommand( 90 unsigned int command, 91 unsigned int arg_count, 92 const void* cmd_data) = 0; 93 94 // Returns a name for a command. Useful for logging / debuging. 95 virtual const char* GetCommandName(unsigned int command_id) const = 0; 96 }; 97 98 } // namespace gpu 99 100 #endif // GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_ 101