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/service/gpu_scheduler.cc

Issue 8060045: Use shared D3D9 texture to transport the compositor's backing buffer to the browser... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 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/gpu_scheduler.cc
===================================================================
--- gpu/command_buffer/service/gpu_scheduler.cc (revision 106500)
+++ gpu/command_buffer/service/gpu_scheduler.cc (working copy)
@@ -4,6 +4,7 @@
#include "gpu/command_buffer/service/gpu_scheduler.h"
+#include "base/bind.h"
#include "base/callback.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
@@ -18,6 +19,9 @@
using ::base::SharedMemory;
namespace gpu {
+namespace {
+const uint64 kPollFencePeriod = 4;
+}
GpuScheduler::GpuScheduler(CommandBuffer* command_buffer,
gles2::GLES2Decoder* decoder,
@@ -56,8 +60,31 @@
if (state.error != error::kNoError)
return;
+ // Check that the GPU has passed all fences.
+ while (!unschedule_fences_.empty()) {
+ if (glTestFenceNV(unschedule_fences_.front().fence)) {
+ glDeleteFencesNV(1, &unschedule_fences_.front().fence);
+ unschedule_fences_.front().task.Run();
+ unschedule_fences_.pop();
+ } else {
+ SetScheduled(false);
+ MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&GpuScheduler::SetScheduled, AsWeakPtr(), true),
+ kPollFencePeriod);
+ return;
+ }
+ }
+
+ // One of the unschedule fence tasks might have unscheduled us.
+ if (!IsScheduled())
+ return;
+
error::Error error = error::kNoError;
while (!parser_->IsEmpty()) {
+ DCHECK(IsScheduled());
+ DCHECK(unschedule_fences_.empty());
+
error = parser_->ProcessCommand();
// TODO(piman): various classes duplicate various pieces of state, leading
@@ -127,4 +154,21 @@
command_processed_callback_.reset(callback);
}
+void GpuScheduler::DeferToFence(base::Closure task) {
+ UnscheduleFence fence;
+
+ glGenFencesNV(1, &fence.fence);
+ glSetFenceNV(fence.fence, GL_ALL_COMPLETED_NV);
+
+ fence.task = task;
+
+ unschedule_fences_.push(fence);
+}
+
+GpuScheduler::UnscheduleFence::UnscheduleFence() : fence(0) {
+}
+
+GpuScheduler::UnscheduleFence::~UnscheduleFence() {
+}
+
} // namespace gpu

Powered by Google App Engine
This is Rietveld 408576698