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