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

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 2096503002: Implement new behavior for DescheduleUntilFinishedCHROMIUM. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@temp95
Patch Set: Rebase. Created 4 years, 6 months 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/service/gles2_cmd_decoder.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 5c0866da3b976a781b2c4c53f024f508d0eb763e..47988a833363682977458a3df2fc7e49312682df 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -2191,10 +2191,10 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
std::queue<linked_ptr<FenceCallback> > pending_readpixel_fences_;
- // After this fence is inserted, both the GpuChannelMessageQueue and
- // CommandExecutor are descheduled. Once the fence has completed, both get
- // rescheduled.
- std::unique_ptr<gl::GLFence> deschedule_until_finished_fence_;
+ // After a second fence is inserted, both the GpuChannelMessageQueue and
+ // CommandExecutor are descheduled. Once the first fence has completed, both
+ // get rescheduled.
+ std::vector<std::unique_ptr<gl::GLFence>> deschedule_until_finished_fences_;
// Used to validate multisample renderbuffers if needed
GLuint validation_texture_;
@@ -13674,10 +13674,16 @@ error::Error GLES2DecoderImpl::HandleDescheduleUntilFinishedCHROMIUM(
return error::kNoError;
}
- deschedule_until_finished_fence_.reset(gl::GLFence::Create());
- DCHECK(deschedule_until_finished_fence_);
- if (deschedule_until_finished_fence_->HasCompleted()) {
- deschedule_until_finished_fence_.reset();
+ std::unique_ptr<gl::GLFence> fence(gl::GLFence::Create());
+ deschedule_until_finished_fences_.push_back(std::move(fence));
+
+ if (deschedule_until_finished_fences_.size() == 1)
+ return error::kNoError;
+
+ DCHECK_EQ(2u, deschedule_until_finished_fences_.size());
+ if (deschedule_until_finished_fences_[0]->HasCompleted()) {
+ deschedule_until_finished_fences_.erase(
+ deschedule_until_finished_fences_.begin());
return error::kNoError;
}
@@ -13814,15 +13820,17 @@ void GLES2DecoderImpl::ProcessPendingReadPixels(bool did_finish) {
}
void GLES2DecoderImpl::ProcessDescheduleUntilFinished() {
- if (!deschedule_until_finished_fence_)
+ if (deschedule_until_finished_fences_.size() < 2)
return;
+ DCHECK_EQ(2u, deschedule_until_finished_fences_.size());
- if (!deschedule_until_finished_fence_->HasCompleted())
+ if (!deschedule_until_finished_fences_[0]->HasCompleted())
return;
TRACE_EVENT_ASYNC_END0("cc", "GLES2DecoderImpl::DescheduleUntilFinished",
this);
- deschedule_until_finished_fence_.reset();
+ deschedule_until_finished_fences_.erase(
+ deschedule_until_finished_fences_.begin());
reschedule_after_finished_callback_.Run();
}
@@ -13837,7 +13845,7 @@ void GLES2DecoderImpl::PerformIdleWork() {
}
bool GLES2DecoderImpl::HasPollingWork() const {
- return !!deschedule_until_finished_fence_.get();
+ return deschedule_until_finished_fences_.size() >= 2;
}
void GLES2DecoderImpl::PerformPollingWork() {
« no previous file with comments | « gpu/GLES2/extensions/CHROMIUM/CHROMIUM_deschedule.txt ('k') | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698