| Index: gpu/command_buffer/service/common_decoder.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/common_decoder.cc (revision 37239)
|
| +++ gpu/command_buffer/service/common_decoder.cc (working copy)
|
| @@ -45,6 +45,17 @@
|
| return static_cast<int8*>(buffer.ptr) + offset;
|
| }
|
|
|
| +bool CommonDecoder::PushAddress(uint32 offset) {
|
| + if (call_stack_.size() < kMaxStackDepth) {
|
| + CommandAddress return_address(engine_->GetGetOffset());
|
| + if (engine_->SetGetOffset(offset)) {
|
| + call_stack_.push(return_address);
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| const char* CommonDecoder::GetCommonCommandName(
|
| cmd::CommandId command_id) const {
|
| return cmd::GetCommandName(command_id);
|
| @@ -138,35 +149,50 @@
|
| parse_error::ParseError CommonDecoder::HandleJump(
|
| uint32 immediate_data_size,
|
| const cmd::Jump& args) {
|
| - DCHECK(false); // TODO(gman): Implement.
|
| + if (!engine_->SetGetOffset(args.offset)) {
|
| + return parse_error::kParseInvalidArguments;
|
| + }
|
| return parse_error::kParseNoError;
|
| }
|
|
|
| parse_error::ParseError CommonDecoder::HandleJumpRelative(
|
| uint32 immediate_data_size,
|
| const cmd::JumpRelative& args) {
|
| - DCHECK(false); // TODO(gman): Implement.
|
| + if (!engine_->SetGetOffset(engine_->GetGetOffset() + args.offset)) {
|
| + return parse_error::kParseInvalidArguments;
|
| + }
|
| return parse_error::kParseNoError;
|
| }
|
|
|
| parse_error::ParseError CommonDecoder::HandleCall(
|
| uint32 immediate_data_size,
|
| const cmd::Call& args) {
|
| - DCHECK(false); // TODO(gman): Implement.
|
| + if (!PushAddress(args.offset)) {
|
| + return parse_error::kParseInvalidArguments;
|
| + }
|
| return parse_error::kParseNoError;
|
| }
|
|
|
| parse_error::ParseError CommonDecoder::HandleCallRelative(
|
| uint32 immediate_data_size,
|
| const cmd::CallRelative& args) {
|
| - DCHECK(false); // TODO(gman): Implement.
|
| + if (!PushAddress(engine_->GetGetOffset() + args.offset)) {
|
| + return parse_error::kParseInvalidArguments;
|
| + }
|
| return parse_error::kParseNoError;
|
| }
|
|
|
| parse_error::ParseError CommonDecoder::HandleReturn(
|
| uint32 immediate_data_size,
|
| const cmd::Return& args) {
|
| - DCHECK(false); // TODO(gman): Implement.
|
| + if (call_stack_.empty()) {
|
| + return parse_error::kParseInvalidArguments;
|
| + }
|
| + CommandAddress return_address = call_stack_.top();
|
| + call_stack_.pop();
|
| + if (!engine_->SetGetOffset(return_address.offset)) {
|
| + return parse_error::kParseInvalidArguments;
|
| + }
|
| return parse_error::kParseNoError;
|
| }
|
|
|
|
|