• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
get()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.
set_get(CommandBufferOffset get)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.
set_put(CommandBufferOffset put)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.
put()51   CommandBufferOffset put() const { return put_; }
52 
53   // Checks whether there are commands to process.
IsEmpty()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:
AsyncAPIInterface()78   AsyncAPIInterface() {}
~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