Index: gpu/command_buffer/service/in_process_command_buffer.cc |
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc |
index d50405415b44bb540b25d14f2ba18b1cc2315d23..c85ef0db950fee3607a95580b05b094c97ae7593 100644 |
--- a/gpu/command_buffer/service/in_process_command_buffer.cc |
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc |
@@ -17,7 +17,6 @@ |
#include "base/sequence_checker.h" |
#include "base/single_thread_task_runner.h" |
#include "base/thread_task_runner_handle.h" |
-#include "base/threading/thread.h" |
#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" |
#include "gpu/command_buffer/common/value_state.h" |
#include "gpu/command_buffer/service/command_buffer_service.h" |
@@ -60,61 +59,11 @@ static void RunTaskWithResult(base::Callback<T(void)> task, |
completion->Signal(); |
} |
-class GpuInProcessThread |
- : public base::Thread, |
- public InProcessCommandBuffer::Service, |
- public base::RefCountedThreadSafe<GpuInProcessThread> { |
- public: |
- GpuInProcessThread(); |
- |
- void AddRef() const override { |
- base::RefCountedThreadSafe<GpuInProcessThread>::AddRef(); |
- } |
- void Release() const override { |
- base::RefCountedThreadSafe<GpuInProcessThread>::Release(); |
- } |
- |
- void ScheduleTask(const base::Closure& task) override; |
- void ScheduleIdleWork(const base::Closure& callback) override; |
- bool UseVirtualizedGLContexts() override { return false; } |
- scoped_refptr<gles2::ShaderTranslatorCache> shader_translator_cache() |
- override; |
- |
- private: |
- ~GpuInProcessThread() override; |
- friend class base::RefCountedThreadSafe<GpuInProcessThread>; |
- |
- scoped_refptr<gpu::gles2::ShaderTranslatorCache> shader_translator_cache_; |
- DISALLOW_COPY_AND_ASSIGN(GpuInProcessThread); |
-}; |
- |
-GpuInProcessThread::GpuInProcessThread() : base::Thread("GpuThread") { |
- Start(); |
-} |
- |
-GpuInProcessThread::~GpuInProcessThread() { |
- Stop(); |
-} |
- |
-void GpuInProcessThread::ScheduleTask(const base::Closure& task) { |
- task_runner()->PostTask(FROM_HERE, task); |
-} |
- |
-void GpuInProcessThread::ScheduleIdleWork(const base::Closure& callback) { |
- // Match delay with GpuCommandBufferStub. |
- task_runner()->PostDelayedTask(FROM_HERE, callback, |
- base::TimeDelta::FromMilliseconds(2)); |
-} |
- |
-scoped_refptr<gles2::ShaderTranslatorCache> |
-GpuInProcessThread::shader_translator_cache() { |
- if (!shader_translator_cache_.get()) |
- shader_translator_cache_ = new gpu::gles2::ShaderTranslatorCache; |
- return shader_translator_cache_; |
-} |
- |
struct GpuInProcessThreadHolder { |
- GpuInProcessThreadHolder() : gpu_thread(new GpuInProcessThread) {} |
+ GpuInProcessThreadHolder() |
+ : sync_point_manager(new SyncPointManager(false)), |
+ gpu_thread(new GpuInProcessThread(sync_point_manager.get())) {} |
+ scoped_ptr<SyncPointManager> sync_point_manager; |
scoped_refptr<InProcessCommandBuffer::Service> gpu_thread; |
}; |
@@ -130,16 +79,6 @@ class ScopedEvent { |
base::WaitableEvent* event_; |
}; |
-// This wrapper adds the WaitSyncPoint which allows waiting on a sync point |
-// on the service thread, implemented using a condition variable. |
-struct SyncPointManagerWrapper { |
- SyncPointManagerWrapper() : manager(SyncPointManager::Create(true)) {} |
- const scoped_refptr<SyncPointManager> manager; |
-}; |
- |
-base::LazyInstance<SyncPointManagerWrapper> g_sync_point_manager = |
- LAZY_INSTANCE_INITIALIZER; |
- |
base::SharedMemoryHandle ShareToGpuThread( |
base::SharedMemoryHandle source_handle) { |
return base::SharedMemory::DuplicateHandle(source_handle); |
@@ -784,7 +723,7 @@ int32 InProcessCommandBuffer::CreateGpuMemoryBufferImage( |
} |
uint32 InProcessCommandBuffer::InsertSyncPoint() { |
- uint32 sync_point = g_sync_point_manager.Get().manager->GenerateSyncPoint(); |
+ uint32 sync_point = service_->sync_point_manager()->GenerateSyncPoint(); |
QueueTask(base::Bind(&InProcessCommandBuffer::RetireSyncPointOnGpuThread, |
base::Unretained(this), |
sync_point)); |
@@ -792,7 +731,7 @@ uint32 InProcessCommandBuffer::InsertSyncPoint() { |
} |
uint32 InProcessCommandBuffer::InsertFutureSyncPoint() { |
- return g_sync_point_manager.Get().manager->GenerateSyncPoint(); |
+ return service_->sync_point_manager()->GenerateSyncPoint(); |
} |
void InProcessCommandBuffer::RetireSyncPoint(uint32 sync_point) { |
@@ -813,7 +752,7 @@ void InProcessCommandBuffer::RetireSyncPointOnGpuThread(uint32 sync_point) { |
if (make_current_success) |
mailbox_manager->PushTextureUpdates(sync_point); |
} |
- g_sync_point_manager.Get().manager->RetireSyncPoint(sync_point); |
+ service_->sync_point_manager()->RetireSyncPoint(sync_point); |
} |
void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, |
@@ -826,7 +765,7 @@ void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, |
} |
bool InProcessCommandBuffer::WaitSyncPointOnGpuThread(unsigned sync_point) { |
- g_sync_point_manager.Get().manager->ThreadedWaitSyncPoint(sync_point); |
+ service_->sync_point_manager()->WaitSyncPoint(sync_point); |
gles2::MailboxManager* mailbox_manager = |
decoder_->GetContextGroup()->mailbox_manager(); |
mailbox_manager->PullTextureUpdates(sync_point); |
@@ -836,8 +775,7 @@ bool InProcessCommandBuffer::WaitSyncPointOnGpuThread(unsigned sync_point) { |
void InProcessCommandBuffer::SignalSyncPointOnGpuThread( |
unsigned sync_point, |
const base::Closure& callback) { |
- g_sync_point_manager.Get().manager->AddSyncPointCallback(sync_point, |
- callback); |
+ service_->sync_point_manager()->AddSyncPointCallback(sync_point, callback); |
} |
void InProcessCommandBuffer::SignalQuery(unsigned query_id, |
@@ -950,4 +888,45 @@ InProcessCommandBuffer::GetSurfaceTexture(uint32 stream_id) { |
} |
#endif |
+GpuInProcessThread::GpuInProcessThread(SyncPointManager* sync_point_manager) |
+ : base::Thread("GpuThread"), sync_point_manager_(sync_point_manager) { |
+ Start(); |
+} |
+ |
+GpuInProcessThread::~GpuInProcessThread() { |
+ Stop(); |
+} |
+ |
+void GpuInProcessThread::AddRef() const { |
+ base::RefCountedThreadSafe<GpuInProcessThread>::AddRef(); |
+} |
+void GpuInProcessThread::Release() const { |
+ base::RefCountedThreadSafe<GpuInProcessThread>::Release(); |
+} |
+ |
+void GpuInProcessThread::ScheduleTask(const base::Closure& task) { |
+ task_runner()->PostTask(FROM_HERE, task); |
+} |
+ |
+void GpuInProcessThread::ScheduleIdleWork(const base::Closure& callback) { |
+ // Match delay with GpuCommandBufferStub. |
+ task_runner()->PostDelayedTask(FROM_HERE, callback, |
+ base::TimeDelta::FromMilliseconds(2)); |
+} |
+ |
+bool GpuInProcessThread::UseVirtualizedGLContexts() { |
+ return false; |
+} |
+ |
+scoped_refptr<gles2::ShaderTranslatorCache> |
+GpuInProcessThread::shader_translator_cache() { |
+ if (!shader_translator_cache_.get()) |
+ shader_translator_cache_ = new gpu::gles2::ShaderTranslatorCache; |
+ return shader_translator_cache_; |
+} |
+ |
+SyncPointManager* GpuInProcessThread::sync_point_manager() { |
+ return sync_point_manager_; |
+} |
+ |
} // namespace gpu |