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

Unified Diff: gpu/command_buffer/client/cmd_buffer_helper.cc

Issue 2550583002: gpu: Thread-safe command buffer state lookup. (Closed)
Patch Set: Created 4 years 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
Index: gpu/command_buffer/client/cmd_buffer_helper.cc
diff --git a/gpu/command_buffer/client/cmd_buffer_helper.cc b/gpu/command_buffer/client/cmd_buffer_helper.cc
index 0304b8f7e5d1ae6d4322bdd889729477746a822c..9a424ffa7576740a4d316edeb9c655f38180b865 100644
--- a/gpu/command_buffer/client/cmd_buffer_helper.cc
+++ b/gpu/command_buffer/client/cmd_buffer_helper.cc
@@ -32,6 +32,7 @@ CommandBufferHelper::CommandBufferHelper(CommandBuffer* command_buffer)
immediate_entry_count_(0),
token_(0),
put_(0),
+ last_get_(0),
last_put_sent_(0),
#if defined(CMD_HELPER_PERIODIC_FLUSH_CHECK)
commands_issued_(0),
@@ -71,7 +72,7 @@ void CommandBufferHelper::CalcImmediateEntries(int waiting_count) {
}
// Get maximum safe contiguous entries.
- const int32_t curr_get = get_offset();
+ const int32_t curr_get = last_get_;
if (curr_get > put_) {
immediate_entry_count_ = curr_get - put_ - 1;
} else {
@@ -128,6 +129,7 @@ bool CommandBufferHelper::AllocateRingBuffer() {
// Call to SetGetBuffer(id) above resets get and put offsets to 0.
// No need to query it through IPC.
put_ = 0;
+ last_get_ = 0;
CalcImmediateEntries(0);
return true;
}
@@ -143,8 +145,8 @@ void CommandBufferHelper::FreeResources() {
}
void CommandBufferHelper::FreeRingBuffer() {
- CHECK((put_ == get_offset()) ||
- error::IsError(command_buffer_->GetLastState().error));
+ CHECK((put_ == last_get_) ||
+ error::IsError(command_buffer_->GetLastState().error));
FreeResources();
}
@@ -165,8 +167,10 @@ bool CommandBufferHelper::WaitForGetOffsetInRange(int32_t start, int32_t end) {
if (!usable()) {
return false;
}
- command_buffer_->WaitForGetOffsetInRange(start, end);
- return command_buffer_->GetLastError() == gpu::error::kNoError;
+ CommandBuffer::State last_state =
+ command_buffer_->WaitForGetOffsetInRange(start, end);
+ last_get_ = last_state.get_offset;
+ return last_state.error == gpu::error::kNoError;
}
void CommandBufferHelper::Flush() {
@@ -213,7 +217,7 @@ bool CommandBufferHelper::Finish() {
return false;
}
// If there is no work just exit.
- if (put_ == get_offset()) {
+ if (put_ == last_get_) {
return true;
}
DCHECK(HaveRingBuffer() ||
@@ -221,7 +225,7 @@ bool CommandBufferHelper::Finish() {
Flush();
if (!WaitForGetOffsetInRange(put_, put_))
return false;
- DCHECK_EQ(get_offset(), put_);
+ DCHECK_EQ(last_get_, put_);
CalcImmediateEntries(0);
@@ -263,7 +267,8 @@ void CommandBufferHelper::WaitForToken(int32_t token) {
// Return immediately if corresponding InsertToken failed.
if (token < 0)
return;
- if (token > token_) return; // we wrapped
+ if (token > token_)
+ return; // we wrapped
if (last_token_read() >= token)
return;
Flush();
@@ -288,13 +293,13 @@ void CommandBufferHelper::WaitForAvailableEntries(int32_t count) {
// but we need to make sure get wraps first, actually that get is 1 or
// more (since put will wrap to 0 after we add the noops).
DCHECK_LE(1, put_);
- int32_t curr_get = get_offset();
+ int32_t curr_get = last_get_;
if (curr_get > put_ || curr_get == 0) {
TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForAvailableEntries");
Flush();
if (!WaitForGetOffsetInRange(1, put_))
return;
- curr_get = get_offset();
+ curr_get = last_get_;
DCHECK_LE(curr_get, put_);
DCHECK_NE(0, curr_get);
}
@@ -328,7 +333,7 @@ void CommandBufferHelper::WaitForAvailableEntries(int32_t count) {
}
int32_t CommandBufferHelper::GetTotalFreeEntriesNoWaiting() const {
- int32_t current_get_offset = get_offset();
+ int32_t current_get_offset = last_get_;
if (current_get_offset > put_) {
return current_get_offset - put_ - 1;
} else {

Powered by Google App Engine
This is Rietveld 408576698