OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2009, Google Inc. | 2 * Copyright 2009, Google Inc. |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 18 matching lines...) Expand all Loading... |
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 */ | 30 */ |
31 | 31 |
32 | 32 |
33 // This class contains the implementation of the GAPI decoder class, decoding | 33 // This class contains the implementation of the GAPI decoder class, decoding |
34 // GAPI commands into calls to a GAPIInterface class. | 34 // GAPI commands into calls to a GAPIInterface class. |
35 | 35 |
36 #include "base/cross/bits.h" | 36 #include "base/cross/bits.h" |
37 #include "command_buffer/common/cross/gapi_interface.h" | 37 #include "command_buffer/common/cross/gapi_interface.h" |
38 #include "command_buffer/service/cross/gapi_decoder.h" | 38 #include "command_buffer/service/cross/gapi_decoder.h" |
39 #include "command_buffer/service/cross/cmd_buffer_engine.h" | |
40 | 39 |
41 namespace o3d { | 40 namespace o3d { |
42 namespace command_buffer { | 41 namespace command_buffer { |
43 namespace o3d { | 42 namespace o3d { |
44 | 43 |
45 namespace { | 44 namespace { |
46 | 45 |
47 // Returns the address of the first byte after a struct. | 46 // Returns the address of the first byte after a struct. |
48 template <typename T> | 47 template <typename T> |
49 const void* AddressAfterStruct(const T& pod) { | 48 const void* AddressAfterStruct(const T& pod) { |
(...skipping 21 matching lines...) Expand all Loading... |
71 name::kArgFlags, \ | 70 name::kArgFlags, \ |
72 sizeof(name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ \ | 71 sizeof(name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ \ |
73 | 72 |
74 O3D_COMMAND_BUFFER_CMDS(O3D_COMMAND_BUFFER_CMD_OP) | 73 O3D_COMMAND_BUFFER_CMDS(O3D_COMMAND_BUFFER_CMD_OP) |
75 | 74 |
76 #undef O3D_COMMAND_BUFFER_CMD_OP | 75 #undef O3D_COMMAND_BUFFER_CMD_OP |
77 }; | 76 }; |
78 | 77 |
79 } // anonymous namespace. | 78 } // anonymous namespace. |
80 | 79 |
81 // Decode command with its arguments, and call the corresponding GAPIInterface | 80 // Decode command with its arguments, and call the corresponding method. |
82 // method. | |
83 // Note: args is a pointer to the command buffer. As such, it could be changed | 81 // Note: args is a pointer to the command buffer. As such, it could be changed |
84 // by a (malicious) client at any time, so if validation has to happen, it | 82 // by a (malicious) client at any time, so if validation has to happen, it |
85 // should operate on a copy of them. | 83 // should operate on a copy of them. |
86 parse_error::ParseError GAPIDecoder::DoCommand( | 84 parse_error::ParseError GAPIDecoder::DoCommand( |
87 unsigned int command, | 85 unsigned int command, |
88 unsigned int arg_count, | 86 unsigned int arg_count, |
89 const void* cmd_data) { | 87 const void* cmd_data) { |
90 if (command < arraysize(g_command_info)) { | 88 unsigned int command_index = command - kStartPoint - 1; |
91 const CommandInfo& info = g_command_info[command]; | 89 if (command_index < arraysize(g_command_info)) { |
92 unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count); | 90 const CommandInfo& info = g_command_info[command_index]; |
| 91 unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count); |
93 if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) || | 92 if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) || |
94 (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) { | 93 (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) { |
95 switch (command) { | 94 switch (command) { |
96 #define O3D_COMMAND_BUFFER_CMD_OP(name) \ | 95 #define O3D_COMMAND_BUFFER_CMD_OP(name) \ |
97 case name::kCmdId: \ | 96 case name::kCmdId: \ |
98 return Handle ## name( \ | 97 return Handle ## name( \ |
99 arg_count, \ | 98 arg_count, \ |
100 *static_cast<const name*>(cmd_data)); \ | 99 *static_cast<const name*>(cmd_data)); \ |
101 | 100 |
102 O3D_COMMAND_BUFFER_CMDS(O3D_COMMAND_BUFFER_CMD_OP) | 101 O3D_COMMAND_BUFFER_CMDS(O3D_COMMAND_BUFFER_CMD_OP) |
103 | 102 |
104 #undef O3D_COMMAND_BUFFER_CMD_OP | 103 #undef O3D_COMMAND_BUFFER_CMD_OP |
105 } | 104 } |
106 } else { | 105 } else { |
107 return parse_error::kParseInvalidArguments; | 106 return parse_error::kParseInvalidArguments; |
108 } | 107 } |
109 } | 108 } |
| 109 return DoCommonCommand(command, arg_count, cmd_data); |
110 return parse_error::kParseUnknownCommand; | 110 return parse_error::kParseUnknownCommand; |
111 } | 111 } |
112 | 112 |
113 void *GAPIDecoder::GetAddressAndCheckSize(unsigned int shm_id, | 113 // Overridden from AsyncAPIInterface. |
114 unsigned int offset, | 114 const char* GAPIDecoder::GetCommandName(unsigned int command_id) const { |
115 unsigned int size) { | 115 if (command_id > kStartPoint && command_id < kNumCommands) { |
116 void * shm_addr = engine_->GetSharedMemoryAddress(shm_id); | 116 return o3d::GetCommandName(static_cast<CommandId>(command_id)); |
117 if (!shm_addr) return NULL; | 117 } |
118 size_t shm_size = engine_->GetSharedMemorySize(shm_id); | 118 return GetCommonCommandName(static_cast<cmd::CommandId>(command_id)); |
119 if (offset + size > shm_size) return NULL; | |
120 return static_cast<char *>(shm_addr) + offset; | |
121 } | |
122 | |
123 parse_error::ParseError GAPIDecoder::HandleNoop( | |
124 uint32 arg_count, | |
125 const Noop& args) { | |
126 return parse_error::kParseNoError; | |
127 } | |
128 | |
129 parse_error::ParseError GAPIDecoder::HandleSetToken( | |
130 uint32 arg_count, | |
131 const SetToken& args) { | |
132 engine_->set_token(args.token); | |
133 return parse_error::kParseNoError; | |
134 } | 119 } |
135 | 120 |
136 parse_error::ParseError GAPIDecoder::HandleBeginFrame( | 121 parse_error::ParseError GAPIDecoder::HandleBeginFrame( |
137 uint32 arg_count, | 122 uint32 arg_count, |
138 const BeginFrame& args) { | 123 const BeginFrame& args) { |
139 gapi_->BeginFrame(); | 124 gapi_->BeginFrame(); |
140 return parse_error::kParseNoError; | 125 return parse_error::kParseNoError; |
141 } | 126 } |
142 | 127 |
143 parse_error::ParseError GAPIDecoder::HandleEndFrame( | 128 parse_error::ParseError GAPIDecoder::HandleEndFrame( |
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
946 parse_error::ParseError GAPIDecoder::HandleSetBackSurfaces( | 931 parse_error::ParseError GAPIDecoder::HandleSetBackSurfaces( |
947 uint32 arg_count, | 932 uint32 arg_count, |
948 const SetBackSurfaces& args) { | 933 const SetBackSurfaces& args) { |
949 gapi_->SetBackSurfaces(); | 934 gapi_->SetBackSurfaces(); |
950 return parse_error::kParseNoError; | 935 return parse_error::kParseNoError; |
951 } | 936 } |
952 | 937 |
953 } // namespace o3d | 938 } // namespace o3d |
954 } // namespace command_buffer | 939 } // namespace command_buffer |
955 } // namespace o3d | 940 } // namespace o3d |
OLD | NEW |