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)// This file contains the command parser class. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/constants.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/cmd_buffer_common.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AsyncAPIInterface; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Command parser class. This class parses commands from a shared memory 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// buffer, to implement some asynchronous RPC mechanism. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPU_EXPORT CommandParser { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const int kParseCommandsSlice = 20; 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CommandParser(AsyncAPIInterface* handler); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the buffer to read commands from. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetBuffer( 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* shm_address, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t shm_size, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptrdiff_t offset, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the "get" pointer. The get pointer is an index into the command 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buffer considered as an array of CommandBufferEntry. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBufferOffset get() const { return get_; } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the "get" pointer. The get pointer is an index into the command buffer 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // considered as an array of CommandBufferEntry. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool set_get(CommandBufferOffset get) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get >= 0 && get < entry_count_) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_ = get; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the "put" pointer. The put pointer is an index into the command 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buffer considered as an array of CommandBufferEntry. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_put(CommandBufferOffset put) { put_ = put; } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the "put" pointer. The put pointer is an index into the command 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buffer considered as an array of CommandBufferEntry. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBufferOffset put() const { return put_; } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks whether there are commands to process. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsEmpty() const { return put_ == get_; } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes one command, updating the get pointer. This will return an error 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if there are no commands in the buffer. 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error::Error ProcessCommands(int num_commands); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes all commands until get == put. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error::Error ProcessAllCommands(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBufferOffset get_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBufferOffset put_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBufferEntry* buffer_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 entry_count_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AsyncAPIInterface* handler_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class defines the interface for an asynchronous API handler, that 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is responsible for de-multiplexing commands and their arguments. 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass GPU_EXPORT AsyncAPIInterface { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AsyncAPIInterface() {} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AsyncAPIInterface() {} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Executes a single command. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parameters: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // command: the command index. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // arg_count: the number of CommandBufferEntry arguments. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cmd_data: the command data. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error::kNoError if no error was found, one of 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error::Error otherwise. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual error::Error DoCommand( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int command, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int arg_count, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* cmd_data) = 0; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Executes multiple commands. 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Parameters: 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // num_commands: maximum number of commands to execute from buffer. 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // buffer: pointer to first command entry to process. 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // num_entries: number of sequential command buffer entries in buffer. 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // entries_processed: if not 0, is set to the number of entries processed. 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual error::Error DoCommands(unsigned int num_commands, 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const void* buffer, 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int num_entries, 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int* entries_processed); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a name for a command. Useful for logging / debuging. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const char* GetCommandName(unsigned int command_id) const = 0; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_ 111