Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Unified Diff: gpu/command_buffer/service/common_decoder.cc

Issue 855033002: command_buffer: Table based command dispatch for Common commands (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/common_decoder.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/common_decoder.cc
diff --git a/gpu/command_buffer/service/common_decoder.cc b/gpu/command_buffer/service/common_decoder.cc
index 86a37ba77e5fb8dd94c4c285ed0ce3351c46ac92..f40c7218ad12d8de2ed0af128c231774cb7a77b0 100644
--- a/gpu/command_buffer/service/common_decoder.cc
+++ b/gpu/command_buffer/service/common_decoder.cc
@@ -7,6 +7,19 @@
namespace gpu {
+const CommonDecoder::CommandInfo CommonDecoder::command_info[] = {
+#define COMMON_COMMAND_BUFFER_CMD_OP(name) \
+ { \
+ &CommonDecoder::Handle##name, cmd::name::kArgFlags, \
+ cmd::name::cmd_flags, \
+ sizeof(cmd::name) / sizeof(CommandBufferEntry) - 1, \
+ } \
+ , /* NOLINT */
+ COMMON_COMMAND_BUFFER_CMDS(COMMON_COMMAND_BUFFER_CMD_OP)
+ #undef COMMON_COMMAND_BUFFER_CMD_OP
+};
+
+
CommonDecoder::Bucket::Bucket() : size_(0) {}
CommonDecoder::Bucket::~Bucket() {}
@@ -108,29 +121,6 @@ RETURN_TYPE GetImmediateDataAs(const COMMAND_TYPE& pod) {
return static_cast<RETURN_TYPE>(const_cast<void*>(AddressAfterStruct(pod)));
}
-// TODO(vmiura): Looks like this g_command_info is duplicated in
-// common_decoder.cc
-// and gles2_cmd_decoder.cc. Fix it!
-
-// A struct to hold info about each command.
-struct CommandInfo {
- uint8 arg_flags; // How to handle the arguments for this command
- uint8 cmd_flags; // How to handle this command
- uint16 arg_count; // How many arguments are expected for this command.
-};
-
-// A table of CommandInfo for all the commands.
-const CommandInfo g_command_info[] = {
- #define COMMON_COMMAND_BUFFER_CMD_OP(name) { \
- cmd::name::kArgFlags, \
- cmd::name::cmd_flags, \
- sizeof(cmd::name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */
-
- COMMON_COMMAND_BUFFER_CMDS(COMMON_COMMAND_BUFFER_CMD_OP)
-
- #undef COMMON_COMMAND_BUFFER_CMD_OP
-};
-
} // anonymous namespace.
// Decode command with its arguments, and call the corresponding method.
@@ -141,24 +131,14 @@ error::Error CommonDecoder::DoCommonCommand(
unsigned int command,
unsigned int arg_count,
const void* cmd_data) {
- if (command < arraysize(g_command_info)) {
- const CommandInfo& info = g_command_info[command];
+ if (command < arraysize(command_info)) {
+ const CommandInfo& info = command_info[command];
unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count);
if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) ||
(info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) {
uint32 immediate_data_size =
(arg_count - info_arg_count) * sizeof(CommandBufferEntry); // NOLINT
- switch (command) {
- #define COMMON_COMMAND_BUFFER_CMD_OP(name) \
- case cmd::name::kCmdId: \
- return Handle ## name( \
- immediate_data_size, \
- *static_cast<const cmd::name*>(cmd_data)); \
-
- COMMON_COMMAND_BUFFER_CMDS(COMMON_COMMAND_BUFFER_CMD_OP)
-
- #undef COMMON_COMMAND_BUFFER_CMD_OP
- }
+ return (this->*info.cmd_handler)(immediate_data_size, cmd_data);
} else {
return error::kInvalidArguments;
}
@@ -168,20 +148,23 @@ error::Error CommonDecoder::DoCommonCommand(
error::Error CommonDecoder::HandleNoop(
uint32 immediate_data_size,
- const cmd::Noop& args) {
+ const void* cmd_data) {
return error::kNoError;
}
error::Error CommonDecoder::HandleSetToken(
uint32 immediate_data_size,
- const cmd::SetToken& args) {
+ const void* cmd_data) {
+ const cmd::SetToken& args = *static_cast<const cmd::SetToken*>(cmd_data);
engine_->set_token(args.token);
return error::kNoError;
}
error::Error CommonDecoder::HandleSetBucketSize(
uint32 immediate_data_size,
- const cmd::SetBucketSize& args) {
+ const void* cmd_data) {
+ const cmd::SetBucketSize& args =
+ *static_cast<const cmd::SetBucketSize*>(cmd_data);
uint32 bucket_id = args.bucket_id;
uint32 size = args.size;
@@ -192,7 +175,9 @@ error::Error CommonDecoder::HandleSetBucketSize(
error::Error CommonDecoder::HandleSetBucketData(
uint32 immediate_data_size,
- const cmd::SetBucketData& args) {
+ const void* cmd_data) {
+ const cmd::SetBucketData& args =
+ *static_cast<const cmd::SetBucketData*>(cmd_data);
uint32 bucket_id = args.bucket_id;
uint32 offset = args.offset;
uint32 size = args.size;
@@ -214,7 +199,9 @@ error::Error CommonDecoder::HandleSetBucketData(
error::Error CommonDecoder::HandleSetBucketDataImmediate(
uint32 immediate_data_size,
- const cmd::SetBucketDataImmediate& args) {
+ const void* cmd_data) {
+ const cmd::SetBucketDataImmediate& args =
+ *static_cast<const cmd::SetBucketDataImmediate*>(cmd_data);
const void* data = GetImmediateDataAs<const void*>(args);
uint32 bucket_id = args.bucket_id;
uint32 offset = args.offset;
@@ -234,7 +221,9 @@ error::Error CommonDecoder::HandleSetBucketDataImmediate(
error::Error CommonDecoder::HandleGetBucketStart(
uint32 immediate_data_size,
- const cmd::GetBucketStart& args) {
+ const void* cmd_data) {
+ const cmd::GetBucketStart& args =
+ *static_cast<const cmd::GetBucketStart*>(cmd_data);
uint32 bucket_id = args.bucket_id;
uint32* result = GetSharedMemoryAs<uint32*>(
args.result_memory_id, args.result_memory_offset, sizeof(*result));
@@ -271,7 +260,9 @@ error::Error CommonDecoder::HandleGetBucketStart(
error::Error CommonDecoder::HandleGetBucketData(
uint32 immediate_data_size,
- const cmd::GetBucketData& args) {
+ const void* cmd_data) {
+ const cmd::GetBucketData& args =
+ *static_cast<const cmd::GetBucketData*>(cmd_data);
uint32 bucket_id = args.bucket_id;
uint32 offset = args.offset;
uint32 size = args.size;
« no previous file with comments | « gpu/command_buffer/service/common_decoder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698