| 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 1f9d233f7916966bc201699250c6a4e208d79f5c..db2684f1b5666bcc75c6688c4fd4694639bfef9f 100644
|
| --- a/gpu/command_buffer/service/in_process_command_buffer.cc
|
| +++ b/gpu/command_buffer/service/in_process_command_buffer.cc
|
| @@ -24,14 +24,13 @@
|
| #include "base/sequence_checker.h"
|
| #include "base/synchronization/condition_variable.h"
|
| #include "base/threading/thread.h"
|
| -#include "gpu/command_buffer/client/gpu_memory_buffer_factory.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/mailbox_manager.h"
|
| +#include "gpu/command_buffer/service/query_manager.h"
|
| #include "gpu/command_buffer/service/transfer_buffer_manager.h"
|
| #include "ui/gfx/size.h"
|
| #include "ui/gl/gl_context.h"
|
| @@ -47,7 +46,7 @@ namespace gpu {
|
|
|
| namespace {
|
|
|
| -static GpuMemoryBufferFactory* g_gpu_memory_buffer_factory = NULL;
|
| +static InProcessGpuMemoryBufferFactory* g_gpu_memory_buffer_factory = NULL;
|
|
|
| template <typename T>
|
| static void RunTaskWithResult(base::Callback<T(void)> task,
|
| @@ -343,7 +342,6 @@ bool InProcessCommandBuffer::InitializeOnGpuThread(
|
| ? params.context_group->decoder_->GetContextGroup()
|
| : new gles2::ContextGroup(NULL,
|
| NULL,
|
| - NULL,
|
| service_->shader_translator_cache(),
|
| NULL,
|
| bind_generates_resource)));
|
| @@ -415,10 +413,6 @@ bool InProcessCommandBuffer::InitializeOnGpuThread(
|
| }
|
| *params.capabilities = decoder_->GetCapabilities();
|
|
|
| - gpu_control_.reset(
|
| - new GpuControlService(decoder_->GetContextGroup()->image_manager(),
|
| - decoder_->GetQueryManager()));
|
| -
|
| if (!params.is_offscreen) {
|
| decoder_->SetResizeCallback(base::Bind(
|
| &InProcessCommandBuffer::OnResizeView, gpu_thread_weak_ptr_));
|
| @@ -587,14 +581,14 @@ scoped_refptr<Buffer> InProcessCommandBuffer::CreateTransferBuffer(size_t size,
|
| void InProcessCommandBuffer::DestroyTransferBuffer(int32 id) {
|
| CheckSequencedThread();
|
| base::Closure task =
|
| - base::Bind(&InProcessCommandBuffer::DestroyTransferBufferOnGputhread,
|
| + base::Bind(&InProcessCommandBuffer::DestroyTransferBufferOnGpuThread,
|
| base::Unretained(this),
|
| id);
|
|
|
| QueueTask(task);
|
| }
|
|
|
| -void InProcessCommandBuffer::DestroyTransferBufferOnGputhread(int32 id) {
|
| +void InProcessCommandBuffer::DestroyTransferBufferOnGpuThread(int32 id) {
|
| base::AutoLock lock(command_buffer_lock_);
|
| command_buffer_->DestroyTransferBuffer(id);
|
| }
|
| @@ -612,39 +606,75 @@ gfx::GpuMemoryBuffer* InProcessCommandBuffer::CreateGpuMemoryBuffer(
|
| CheckSequencedThread();
|
|
|
| *id = -1;
|
| - linked_ptr<gfx::GpuMemoryBuffer> buffer =
|
| - make_linked_ptr(g_gpu_memory_buffer_factory->CreateGpuMemoryBuffer(
|
| - width, height, internalformat, usage));
|
| +
|
| + scoped_ptr<gfx::GpuMemoryBuffer> buffer =
|
| + g_gpu_memory_buffer_factory->AllocateGpuMemoryBuffer(
|
| + width, height, internalformat, usage);
|
| if (!buffer.get())
|
| return NULL;
|
|
|
| static int32 next_id = 1;
|
| - *id = next_id++;
|
| + int32 new_id = next_id++;
|
|
|
| - base::Closure task = base::Bind(&GpuControlService::RegisterGpuMemoryBuffer,
|
| - base::Unretained(gpu_control_.get()),
|
| - *id,
|
| - buffer->GetHandle(),
|
| - width,
|
| - height,
|
| - internalformat);
|
| + base::Closure task =
|
| + base::Bind(&InProcessCommandBuffer::RegisterGpuMemoryBufferOnGpuThread,
|
| + base::Unretained(this),
|
| + new_id,
|
| + buffer->GetHandle(),
|
| + width,
|
| + height,
|
| + internalformat);
|
|
|
| QueueTask(task);
|
|
|
| - gpu_memory_buffers_[*id] = buffer;
|
| - return buffer.get();
|
| + *id = new_id;
|
| + DCHECK(gpu_memory_buffers_.find(new_id) == gpu_memory_buffers_.end());
|
| + return gpu_memory_buffers_.add(new_id, buffer.Pass()).first->second;
|
| +}
|
| +
|
| +void InProcessCommandBuffer::RegisterGpuMemoryBufferOnGpuThread(
|
| + int32 id,
|
| + const gfx::GpuMemoryBufferHandle& handle,
|
| + size_t width,
|
| + size_t height,
|
| + unsigned internalformat) {
|
| + scoped_refptr<gfx::GLImage> image =
|
| + g_gpu_memory_buffer_factory->CreateImageForGpuMemoryBuffer(
|
| + handle, gfx::Size(width, height), internalformat);
|
| + if (!image)
|
| + return;
|
| +
|
| + // For Android specific workaround.
|
| + gles2::ContextGroup* context_group = decoder_->GetContextGroup();
|
| + if (context_group->feature_info()->workarounds().release_image_after_use)
|
| + image->SetReleaseAfterUse();
|
| +
|
| + if (decoder_) {
|
| + gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager();
|
| + DCHECK(image_manager);
|
| + image_manager->AddImage(image.get(), id);
|
| + }
|
| }
|
|
|
| void InProcessCommandBuffer::DestroyGpuMemoryBuffer(int32 id) {
|
| CheckSequencedThread();
|
| - GpuMemoryBufferMap::iterator it = gpu_memory_buffers_.find(id);
|
| - if (it != gpu_memory_buffers_.end())
|
| - gpu_memory_buffers_.erase(it);
|
| - base::Closure task = base::Bind(&GpuControlService::UnregisterGpuMemoryBuffer,
|
| - base::Unretained(gpu_control_.get()),
|
| - id);
|
| +
|
| + base::Closure task =
|
| + base::Bind(&InProcessCommandBuffer::UnregisterGpuMemoryBufferOnGpuThread,
|
| + base::Unretained(this),
|
| + id);
|
|
|
| QueueTask(task);
|
| +
|
| + gpu_memory_buffers_.erase(id);
|
| +}
|
| +
|
| +void InProcessCommandBuffer::UnregisterGpuMemoryBufferOnGpuThread(int32 id) {
|
| + if (decoder_) {
|
| + gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager();
|
| + DCHECK(image_manager);
|
| + image_manager->RemoveImage(id);
|
| + }
|
| }
|
|
|
| uint32 InProcessCommandBuffer::InsertSyncPoint() {
|
| @@ -696,15 +726,28 @@ void InProcessCommandBuffer::SignalSyncPointOnGpuThread(
|
| }
|
| }
|
|
|
| -void InProcessCommandBuffer::SignalQuery(unsigned query,
|
| +void InProcessCommandBuffer::SignalQuery(unsigned query_id,
|
| const base::Closure& callback) {
|
| CheckSequencedThread();
|
| - QueueTask(base::Bind(&GpuControlService::SignalQuery,
|
| - base::Unretained(gpu_control_.get()),
|
| - query,
|
| + QueueTask(base::Bind(&InProcessCommandBuffer::SignalQueryOnGpuThread,
|
| + base::Unretained(this),
|
| + query_id,
|
| WrapCallback(callback)));
|
| }
|
|
|
| +void InProcessCommandBuffer::SignalQueryOnGpuThread(
|
| + unsigned query_id,
|
| + const base::Closure& callback) {
|
| + gles2::QueryManager* query_manager_ = decoder_->GetQueryManager();
|
| + DCHECK(query_manager_);
|
| +
|
| + gles2::QueryManager::Query* query = query_manager_->GetQuery(query_id);
|
| + if (!query)
|
| + callback.Run();
|
| + else
|
| + query->AddCallback(callback);
|
| +}
|
| +
|
| void InProcessCommandBuffer::SetSurfaceVisible(bool visible) {}
|
|
|
| void InProcessCommandBuffer::Echo(const base::Closure& callback) {
|
| @@ -785,7 +828,7 @@ InProcessCommandBuffer::GetSurfaceTexture(uint32 stream_id) {
|
|
|
| // static
|
| void InProcessCommandBuffer::SetGpuMemoryBufferFactory(
|
| - GpuMemoryBufferFactory* factory) {
|
| + InProcessGpuMemoryBufferFactory* factory) {
|
| g_gpu_memory_buffer_factory = factory;
|
| }
|
|
|
|
|