Home | History | Annotate | Download | only in service
      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   static const int kParseCommandsSlice = 20;
     23 
     24   explicit CommandParser(AsyncAPIInterface* handler);
     25 
     26   // Sets the buffer to read commands from.
     27   void SetBuffer(
     28       void* shm_address,
     29       size_t shm_size,
     30       ptrdiff_t offset,
     31       size_t size);
     32 
     33   // Gets the "get" pointer. The get pointer is an index into the command
     34   // buffer considered as an array of CommandBufferEntry.
     35   CommandBufferOffset get() const { return get_; }
     36 
     37   // Sets the "get" pointer. The get pointer is an index into the command buffer
     38   // considered as an array of CommandBufferEntry.
     39   bool set_get(CommandBufferOffset get) {
     40     if (get >= 0 && get < entry_count_) {
     41       get_ = get;
     42       return true;
     43     }
     44     return false;
     45   }
     46 
     47   // Sets the "put" pointer. The put pointer is an index into the command
     48   // buffer considered as an array of CommandBufferEntry.
     49   void set_put(CommandBufferOffset put) { put_ = put; }
     50 
     51   // Gets the "put" pointer. The put pointer is an index into the command
     52   // buffer considered as an array of CommandBufferEntry.
     53   CommandBufferOffset put() const { return put_; }
     54 
     55   // Checks whether there are commands to process.
     56   bool IsEmpty() const { return put_ == get_; }
     57 
     58   // Processes one command, updating the get pointer. This will return an error
     59   // if there are no commands in the buffer.
     60   error::Error ProcessCommands(int num_commands);
     61 
     62   // Processes all commands until get == put.
     63   error::Error ProcessAllCommands();
     64 
     65  private:
     66   CommandBufferOffset get_;
     67   CommandBufferOffset put_;
     68   CommandBufferEntry* buffer_;
     69   int32 entry_count_;
     70   AsyncAPIInterface* handler_;
     71 };
     72 
     73 // This class defines the interface for an asynchronous API handler, that
     74 // is responsible for de-multiplexing commands and their arguments.
     75 class GPU_EXPORT AsyncAPIInterface {
     76  public:
     77   AsyncAPIInterface() {}
     78   virtual ~AsyncAPIInterface() {}
     79 
     80   // Executes a single command.
     81   // Parameters:
     82   //    command: the command index.
     83   //    arg_count: the number of CommandBufferEntry arguments.
     84   //    cmd_data: the command data.
     85   // Returns:
     86   //   error::kNoError if no error was found, one of
     87   //   error::Error otherwise.
     88   virtual error::Error DoCommand(
     89       unsigned int command,
     90       unsigned int arg_count,
     91       const void* cmd_data) = 0;
     92 
     93   // Executes multiple commands.
     94   // Parameters:
     95   //    num_commands: maximum number of commands to execute from buffer.
     96   //    buffer: pointer to first command entry to process.
     97   //    num_entries: number of sequential command buffer entries in buffer.
     98   //    entries_processed: if not 0, is set to the number of entries processed.
     99   virtual error::Error DoCommands(unsigned int num_commands,
    100                                   const void* buffer,
    101                                   int num_entries,
    102                                   int* entries_processed);
    103 
    104   // Returns a name for a command. Useful for logging / debuging.
    105   virtual const char* GetCommandName(unsigned int command_id) const = 0;
    106 };
    107 
    108 }  // namespace gpu
    109 
    110 #endif  // GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_
    111