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

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

Issue 8953006: Free the command buffer when tabs are switched (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 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
« no previous file with comments | « gpu/command_buffer/client/cmd_buffer_helper.h ('k') | gpu/command_buffer/client/cmd_buffer_helper_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 d43efc343cbea3fcd4a8348c11d57cb097a7bc65..22af6db434a0547b7b9be1fdff55ccdd90362598 100644
--- a/gpu/command_buffer/client/cmd_buffer_helper.cc
+++ b/gpu/command_buffer/client/cmd_buffer_helper.cc
@@ -30,6 +30,10 @@ CommandBufferHelper::CommandBufferHelper(CommandBuffer* command_buffer)
}
bool CommandBufferHelper::AllocateRingBuffer() {
+ if (HaveRingBuffer()) {
+ return true;
+ }
+
int32 id = command_buffer_->CreateTransferBuffer(ring_buffer_size_, -1);
if (id < 0) {
return false;
@@ -61,6 +65,14 @@ bool CommandBufferHelper::AllocateRingBuffer() {
return true;
}
+void CommandBufferHelper::FreeRingBuffer() {
+ GPU_CHECK_EQ(put_, get_offset());
+ if (HaveRingBuffer()) {
+ command_buffer_->DestroyTransferBuffer(ring_buffer_id_);
+ ring_buffer_id_ = -1;
+ }
+}
+
bool CommandBufferHelper::Initialize(int32 ring_buffer_size) {
ring_buffer_size_ = ring_buffer_size;
return AllocateRingBuffer();
@@ -70,6 +82,7 @@ CommandBufferHelper::~CommandBufferHelper() {
}
bool CommandBufferHelper::FlushSync() {
+ GPU_DCHECK(HaveRingBuffer());
last_flush_time_ = clock();
last_put_sent_ = put_;
CommandBuffer::State state = command_buffer_->FlushSync(put_, get_offset());
@@ -77,6 +90,7 @@ bool CommandBufferHelper::FlushSync() {
}
void CommandBufferHelper::Flush() {
+ GPU_DCHECK(HaveRingBuffer());
last_flush_time_ = clock();
last_put_sent_ = put_;
command_buffer_->Flush(put_);
@@ -86,6 +100,7 @@ void CommandBufferHelper::Flush() {
// error is set.
bool CommandBufferHelper::Finish() {
TRACE_EVENT0("gpu", "CommandBufferHelper::Finish");
+ GPU_DCHECK(HaveRingBuffer());
do {
// Do not loop forever if the flush fails, meaning the command buffer reader
// has shutdown.
@@ -101,6 +116,8 @@ bool CommandBufferHelper::Finish() {
// value is higher than that token). Calls Finish() if the token value wraps,
// which will be rare.
int32 CommandBufferHelper::InsertToken() {
+ AllocateRingBuffer();
+ GPU_DCHECK(HaveRingBuffer());
// Increment token as 31-bit integer. Negative values are used to signal an
// error.
token_ = (token_ + 1) & 0x7FFFFFFF;
@@ -118,6 +135,7 @@ int32 CommandBufferHelper::InsertToken() {
// Waits until the current token value is greater or equal to the value passed
// in argument.
void CommandBufferHelper::WaitForToken(int32 token) {
+ GPU_DCHECK(HaveRingBuffer());
TRACE_EVENT_IF_LONGER_THAN0(50, "gpu", "CommandBufferHelper::WaitForToken");
// Return immediately if corresponding InsertToken failed.
if (token < 0)
@@ -141,6 +159,8 @@ void CommandBufferHelper::WaitForToken(int32 token) {
// function will return early if an error occurs, in which case the available
// space may not be available.
void CommandBufferHelper::WaitForAvailableEntries(int32 count) {
+ AllocateRingBuffer();
+ GPU_DCHECK(HaveRingBuffer());
GPU_DCHECK(count < usable_entry_count_);
if (put_ + count > usable_entry_count_) {
// There's not enough room between the current put and the end of the
@@ -188,6 +208,8 @@ void CommandBufferHelper::WaitForAvailableEntries(int32 count) {
}
CommandBufferEntry* CommandBufferHelper::GetSpace(uint32 entries) {
+ AllocateRingBuffer();
+ GPU_DCHECK(HaveRingBuffer());
++commands_issued_;
WaitForAvailableEntries(entries);
CommandBufferEntry* space = &entries_[put_];
« no previous file with comments | « gpu/command_buffer/client/cmd_buffer_helper.h ('k') | gpu/command_buffer/client/cmd_buffer_helper_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698