• 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   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.
get()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.
set_get(CommandBufferOffset get)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.
set_put(CommandBufferOffset put)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.
put()53   CommandBufferOffset put() const { return put_; }
54 
55   // Checks whether there are commands to process.
IsEmpty()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:
AsyncAPIInterface()77   AsyncAPIInterface() {}
~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