| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This file contains the implementation of the command buffer helper class. | 5 // This file contains the implementation of the command buffer helper class. |
| 6 | 6 |
| 7 #include "../client/cmd_buffer_helper.h" | 7 #include "../client/cmd_buffer_helper.h" |
| 8 #include "../common/command_buffer.h" | 8 #include "../common/command_buffer.h" |
| 9 #include "gpu/common/gpu_trace_event.h" | 9 #include "../common/trace_event.h" |
| 10 | 10 |
| 11 namespace gpu { | 11 namespace gpu { |
| 12 | 12 |
| 13 CommandBufferHelper::CommandBufferHelper(CommandBuffer* command_buffer) | 13 CommandBufferHelper::CommandBufferHelper(CommandBuffer* command_buffer) |
| 14 : command_buffer_(command_buffer), | 14 : command_buffer_(command_buffer), |
| 15 entries_(NULL), | 15 entries_(NULL), |
| 16 total_entry_count_(0), | 16 total_entry_count_(0), |
| 17 usable_entry_count_(0), | 17 usable_entry_count_(0), |
| 18 token_(0), | 18 token_(0), |
| 19 last_token_read_(-1), | 19 last_token_read_(-1), |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 } | 55 } |
| 56 | 56 |
| 57 void CommandBufferHelper::Flush() { | 57 void CommandBufferHelper::Flush() { |
| 58 last_put_sent_ = put_; | 58 last_put_sent_ = put_; |
| 59 command_buffer_->Flush(put_); | 59 command_buffer_->Flush(put_); |
| 60 } | 60 } |
| 61 | 61 |
| 62 // Calls Flush() and then waits until the buffer is empty. Break early if the | 62 // Calls Flush() and then waits until the buffer is empty. Break early if the |
| 63 // error is set. | 63 // error is set. |
| 64 bool CommandBufferHelper::Finish() { | 64 bool CommandBufferHelper::Finish() { |
| 65 GPU_TRACE_EVENT0("gpu", "CommandBufferHelper::Finish"); | 65 TRACE_EVENT0("gpu", "CommandBufferHelper::Finish"); |
| 66 do { | 66 do { |
| 67 // Do not loop forever if the flush fails, meaning the command buffer reader | 67 // Do not loop forever if the flush fails, meaning the command buffer reader |
| 68 // has shutdown. | 68 // has shutdown. |
| 69 if (!FlushSync()) | 69 if (!FlushSync()) |
| 70 return false; | 70 return false; |
| 71 } while (put_ != get_); | 71 } while (put_ != get_); |
| 72 | 72 |
| 73 return true; | 73 return true; |
| 74 } | 74 } |
| 75 | 75 |
| 76 // Inserts a new token into the command stream. It uses an increasing value | 76 // Inserts a new token into the command stream. It uses an increasing value |
| 77 // scheme so that we don't lose tokens (a token has passed if the current token | 77 // scheme so that we don't lose tokens (a token has passed if the current token |
| 78 // value is higher than that token). Calls Finish() if the token value wraps, | 78 // value is higher than that token). Calls Finish() if the token value wraps, |
| 79 // which will be rare. | 79 // which will be rare. |
| 80 int32 CommandBufferHelper::InsertToken() { | 80 int32 CommandBufferHelper::InsertToken() { |
| 81 // Increment token as 31-bit integer. Negative values are used to signal an | 81 // Increment token as 31-bit integer. Negative values are used to signal an |
| 82 // error. | 82 // error. |
| 83 token_ = (token_ + 1) & 0x7FFFFFFF; | 83 token_ = (token_ + 1) & 0x7FFFFFFF; |
| 84 cmd::SetToken& cmd = GetCmdSpace<cmd::SetToken>(); | 84 cmd::SetToken& cmd = GetCmdSpace<cmd::SetToken>(); |
| 85 cmd.Init(token_); | 85 cmd.Init(token_); |
| 86 if (token_ == 0) { | 86 if (token_ == 0) { |
| 87 GPU_TRACE_EVENT0("gpu", "CommandBufferHelper::InsertToken(wrapped)"); | 87 TRACE_EVENT0("gpu", "CommandBufferHelper::InsertToken(wrapped)"); |
| 88 // we wrapped | 88 // we wrapped |
| 89 Finish(); | 89 Finish(); |
| 90 GPU_DCHECK_EQ(token_, last_token_read_); | 90 GPU_DCHECK_EQ(token_, last_token_read_); |
| 91 } | 91 } |
| 92 return token_; | 92 return token_; |
| 93 } | 93 } |
| 94 | 94 |
| 95 // Waits until the current token value is greater or equal to the value passed | 95 // Waits until the current token value is greater or equal to the value passed |
| 96 // in argument. | 96 // in argument. |
| 97 void CommandBufferHelper::WaitForToken(int32 token) { | 97 void CommandBufferHelper::WaitForToken(int32 token) { |
| 98 GPU_TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForToken"); | 98 TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForToken"); |
| 99 // Return immediately if corresponding InsertToken failed. | 99 // Return immediately if corresponding InsertToken failed. |
| 100 if (token < 0) | 100 if (token < 0) |
| 101 return; | 101 return; |
| 102 if (token > token_) return; // we wrapped | 102 if (token > token_) return; // we wrapped |
| 103 while (last_token_read_ < token) { | 103 while (last_token_read_ < token) { |
| 104 if (get_ == put_) { | 104 if (get_ == put_) { |
| 105 GPU_LOG(FATAL) << "Empty command buffer while waiting on a token."; | 105 GPU_LOG(FATAL) << "Empty command buffer while waiting on a token."; |
| 106 return; | 106 return; |
| 107 } | 107 } |
| 108 // Do not loop forever if the flush fails, meaning the command buffer reader | 108 // Do not loop forever if the flush fails, meaning the command buffer reader |
| (...skipping 15 matching lines...) Expand all Loading... |
| 124 // space may not be available. | 124 // space may not be available. |
| 125 void CommandBufferHelper::WaitForAvailableEntries(int32 count) { | 125 void CommandBufferHelper::WaitForAvailableEntries(int32 count) { |
| 126 GPU_CHECK(count < usable_entry_count_); | 126 GPU_CHECK(count < usable_entry_count_); |
| 127 if (put_ + count > usable_entry_count_) { | 127 if (put_ + count > usable_entry_count_) { |
| 128 // There's not enough room between the current put and the end of the | 128 // There's not enough room between the current put and the end of the |
| 129 // buffer, so we need to wrap. We will add a jump back to the start, but we | 129 // buffer, so we need to wrap. We will add a jump back to the start, but we |
| 130 // need to make sure get wraps first, actually that get is 1 or more (since | 130 // need to make sure get wraps first, actually that get is 1 or more (since |
| 131 // put will wrap to 0 after we add the jump). | 131 // put will wrap to 0 after we add the jump). |
| 132 GPU_DCHECK_LE(1, put_); | 132 GPU_DCHECK_LE(1, put_); |
| 133 if (get_ > put_ || get_ == 0) { | 133 if (get_ > put_ || get_ == 0) { |
| 134 GPU_TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForAvailableEntries"); | 134 TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForAvailableEntries"); |
| 135 while (get_ > put_ || get_ == 0) { | 135 while (get_ > put_ || get_ == 0) { |
| 136 // Do not loop forever if the flush fails, meaning the command buffer | 136 // Do not loop forever if the flush fails, meaning the command buffer |
| 137 // reader has shutdown. | 137 // reader has shutdown. |
| 138 if (!FlushSync()) | 138 if (!FlushSync()) |
| 139 return; | 139 return; |
| 140 } | 140 } |
| 141 } | 141 } |
| 142 // Insert a jump back to the beginning. | 142 // Insert a jump back to the beginning. |
| 143 cmd::Jump::Set(&entries_[put_], 0); | 143 cmd::Jump::Set(&entries_[put_], 0); |
| 144 put_ = 0; | 144 put_ = 0; |
| 145 } | 145 } |
| 146 if (AvailableEntries() < count) { | 146 if (AvailableEntries() < count) { |
| 147 GPU_TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForAvailableEntries1"); | 147 TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForAvailableEntries1"); |
| 148 while (AvailableEntries() < count) { | 148 while (AvailableEntries() < count) { |
| 149 // Do not loop forever if the flush fails, meaning the command buffer | 149 // Do not loop forever if the flush fails, meaning the command buffer |
| 150 // reader has shutdown. | 150 // reader has shutdown. |
| 151 if (!FlushSync()) | 151 if (!FlushSync()) |
| 152 return; | 152 return; |
| 153 } | 153 } |
| 154 } | 154 } |
| 155 // Force a flush if the buffer is getting half full, or even earlier if the | 155 // Force a flush if the buffer is getting half full, or even earlier if the |
| 156 // reader is known to be idle. | 156 // reader is known to be idle. |
| 157 int32 pending = | 157 int32 pending = |
| (...skipping 21 matching lines...) Expand all Loading... |
| 179 SynchronizeState(state); | 179 SynchronizeState(state); |
| 180 return static_cast<error::Error>(state.error); | 180 return static_cast<error::Error>(state.error); |
| 181 } | 181 } |
| 182 | 182 |
| 183 void CommandBufferHelper::SynchronizeState(CommandBuffer::State state) { | 183 void CommandBufferHelper::SynchronizeState(CommandBuffer::State state) { |
| 184 get_ = state.get_offset; | 184 get_ = state.get_offset; |
| 185 last_token_read_ = state.token; | 185 last_token_read_ = state.token; |
| 186 } | 186 } |
| 187 | 187 |
| 188 } // namespace gpu | 188 } // namespace gpu |
| OLD | NEW |