| 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() {
|
|
|