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   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