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.
5 // This file contains the command parser class.
7 #ifndef GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_
8 #define GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_
10 #include "gpu/command_buffer/common/constants.h"
11 #include "gpu/command_buffer/common/cmd_buffer_common.h"
12 #include "gpu/gpu_export.h"
16 class AsyncAPIInterface
;
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
{
22 explicit CommandParser(AsyncAPIInterface
* handler
);
24 // Sets the buffer to read commands from.
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_
; }
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_
) {
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
; }
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_
; }
53 // Checks whether there are commands to process.
54 bool IsEmpty() const { return put_
== get_
; }
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();
60 // Processes all commands until get == put.
61 error::Error
ProcessAllCommands();
64 void ReportError(unsigned int command_id
, error::Error result
);
67 CommandBufferOffset get_
;
68 CommandBufferOffset put_
;
69 CommandBufferEntry
* buffer_
;
71 AsyncAPIInterface
* handler_
;
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
{
78 AsyncAPIInterface() {}
79 virtual ~AsyncAPIInterface() {}
81 // Executes a command.
83 // command: the command index.
84 // arg_count: the number of CommandBufferEntry arguments.
85 // cmd_data: the command data.
87 // error::kNoError if no error was found, one of
88 // error::Error otherwise.
89 virtual error::Error
DoCommand(
91 unsigned int arg_count
,
92 const void* cmd_data
) = 0;
94 // Returns a name for a command. Useful for logging / debuging.
95 virtual const char* GetCommandName(unsigned int command_id
) const = 0;
100 #endif // GPU_COMMAND_BUFFER_SERVICE_CMD_PARSER_H_