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 ccbfb32a50455f2eed340f03c0a4739e9a22e503..2f949c901c2fb9be37a3d82973766fe96dfe525c 100644 |
--- a/gpu/command_buffer/service/in_process_command_buffer.cc |
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc |
@@ -22,10 +22,10 @@ |
#include "base/message_loop/message_loop_proxy.h" |
#include "base/sequence_checker.h" |
#include "base/threading/thread.h" |
-#include "gpu/command_buffer/common/id_allocator.h" |
#include "gpu/command_buffer/service/command_buffer_service.h" |
#include "gpu/command_buffer/service/context_group.h" |
#include "gpu/command_buffer/service/gl_context_virtual.h" |
+#include "gpu/command_buffer/service/gpu_control_service.h" |
#include "gpu/command_buffer/service/gpu_scheduler.h" |
#include "gpu/command_buffer/service/image_manager.h" |
#include "gpu/command_buffer/service/transfer_buffer_manager.h" |
@@ -43,6 +43,7 @@ static base::LazyInstance<std::set<InProcessCommandBuffer*> > |
static bool g_use_virtualized_gl_context = false; |
static bool g_uses_explicit_scheduling = false; |
+static GpuMemoryBufferFactory* g_gpu_memory_buffer_factory = NULL; |
template <typename T> |
static void RunTaskWithResult(base::Callback<T(void)> task, |
@@ -390,6 +391,10 @@ bool InProcessCommandBuffer::InitializeOnGpuThread( |
&GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get()))); |
command_buffer_ = command_buffer.Pass(); |
+ gpu_control_.reset( |
+ new GpuControlService(decoder_->GetContextGroup()->image_manager(), |
+ g_gpu_memory_buffer_factory)); |
+ |
decoder_->set_engine(gpu_scheduler_.get()); |
if (!surface_) { |
@@ -496,55 +501,6 @@ void InProcessCommandBuffer::CheckSequencedThread() { |
sequence_checker_->CalledOnValidSequencedThread()); |
} |
-unsigned int InProcessCommandBuffer::CreateImageForGpuMemoryBuffer( |
- gfx::GpuMemoryBufferHandle buffer, |
- gfx::Size size) { |
- CheckSequencedThread(); |
- unsigned int image_id; |
- { |
- // TODO: ID allocation should go through CommandBuffer |
- base::AutoLock lock(command_buffer_lock_); |
- gles2::ContextGroup* group = decoder_->GetContextGroup(); |
- image_id = |
- group->GetIdAllocator(gles2::id_namespaces::kImages)->AllocateID(); |
- } |
- base::Closure image_task = |
- base::Bind(&InProcessCommandBuffer::CreateImageOnGpuThread, |
- base::Unretained(this), buffer, size, image_id); |
- QueueTask(image_task); |
- return image_id; |
-} |
- |
-void InProcessCommandBuffer::CreateImageOnGpuThread( |
- gfx::GpuMemoryBufferHandle buffer, |
- gfx::Size size, |
- unsigned int image_id) { |
- CheckSequencedThread(); |
- scoped_refptr<gfx::GLImage> gl_image = |
- gfx::GLImage::CreateGLImageForGpuMemoryBuffer(buffer, size); |
- decoder_->GetContextGroup()->image_manager()->AddImage(gl_image, image_id); |
-} |
- |
-void InProcessCommandBuffer::RemoveImage(unsigned int image_id) { |
- CheckSequencedThread(); |
- { |
- // TODO: ID allocation should go through CommandBuffer |
- base::AutoLock lock(command_buffer_lock_); |
- gles2::ContextGroup* group = decoder_->GetContextGroup(); |
- group->GetIdAllocator(gles2::id_namespaces::kImages)->FreeID(image_id); |
- } |
- base::Closure image_manager_task = |
- base::Bind(&InProcessCommandBuffer::RemoveImageOnGpuThread, |
- base::Unretained(this), |
- image_id); |
- QueueTask(image_manager_task); |
-} |
- |
-void InProcessCommandBuffer::RemoveImageOnGpuThread(unsigned int image_id) { |
- CheckSequencedThread(); |
- decoder_->GetContextGroup()->image_manager()->RemoveImage(image_id); |
-} |
- |
void InProcessCommandBuffer::OnContextLost() { |
CheckSequencedThread(); |
if (!context_lost_callback_.is_null()) { |
@@ -680,6 +636,28 @@ void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, |
QueueTask(WrapCallback(callback)); |
} |
+gfx::GpuMemoryBuffer* InProcessCommandBuffer::CreateGpuMemoryBuffer( |
+ size_t width, |
+ size_t height, |
+ unsigned internalformat, |
+ int32* id) { |
+ CheckSequencedThread(); |
+ base::AutoLock lock(command_buffer_lock_); |
+ return gpu_control_->CreateGpuMemoryBuffer(width, |
+ height, |
+ internalformat, |
+ id); |
+} |
+ |
+void InProcessCommandBuffer::DestroyGpuMemoryBuffer(int32 id) { |
+ CheckSequencedThread(); |
+ base::Closure task = base::Bind(&GpuControl::DestroyGpuMemoryBuffer, |
+ base::Unretained(gpu_control_.get()), |
+ id); |
+ |
+ QueueTask(task); |
+} |
+ |
gpu::error::Error InProcessCommandBuffer::GetLastError() { |
CheckSequencedThread(); |
return last_state_.error; |
@@ -753,4 +731,10 @@ void InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread() { |
g_gpu_queue.Get().RunTasks(); |
} |
+// static |
+void InProcessCommandBuffer::SetGpuMemoryBufferFactory( |
+ GpuMemoryBufferFactory* factory) { |
+ g_gpu_memory_buffer_factory = factory; |
+} |
+ |
} // namespace gpu |