Index: components/viz/common/server_gpu_memory_buffer_manager.cc |
diff --git a/components/viz/common/server_gpu_memory_buffer_manager.cc b/components/viz/common/server_gpu_memory_buffer_manager.cc |
index f9f179080cd09749f2ae7bd96d05b2d40380b637..5c52f722971eb52c1511267b58e1a9fd2c16d962 100644 |
--- a/components/viz/common/server_gpu_memory_buffer_manager.cc |
+++ b/components/viz/common/server_gpu_memory_buffer_manager.cc |
@@ -5,7 +5,6 @@ |
#include "components/viz/common/server_gpu_memory_buffer_manager.h" |
#include "base/logging.h" |
-#include "base/threading/thread_task_runner_handle.h" |
#include "gpu/ipc/client/gpu_memory_buffer_impl.h" |
#include "gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.h" |
#include "gpu/ipc/common/gpu_memory_buffer_support.h" |
@@ -15,12 +14,12 @@ namespace viz { |
ServerGpuMemoryBufferManager::ServerGpuMemoryBufferManager( |
ui::mojom::GpuService* gpu_service, |
- int client_id) |
+ int client_id, |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
: gpu_service_(gpu_service), |
client_id_(client_id), |
native_configurations_(gpu::GetNativeGpuMemoryBufferConfigurations()), |
- task_runner_(base::ThreadTaskRunnerHandle::Get()), |
- weak_factory_(this) {} |
+ task_runner_(std::move(task_runner)) {} |
ServerGpuMemoryBufferManager::~ServerGpuMemoryBufferManager() {} |
@@ -41,8 +40,7 @@ void ServerGpuMemoryBufferManager::AllocateGpuMemoryBufferHandle( |
gpu_service_->CreateGpuMemoryBuffer( |
id, size, format, usage, client_id, surface_handle, |
base::Bind(&ServerGpuMemoryBufferManager::OnGpuMemoryBufferAllocated, |
- weak_factory_.GetWeakPtr(), client_id, |
- base::Passed(std::move(callback)))); |
+ this, client_id, base::Passed(std::move(callback)))); |
return; |
} |
} |
@@ -67,28 +65,23 @@ ServerGpuMemoryBufferManager::CreateGpuMemoryBuffer( |
gfx::BufferUsage usage, |
gpu::SurfaceHandle surface_handle) { |
gfx::GpuMemoryBufferId id(next_gpu_memory_id_++); |
- gfx::GpuMemoryBufferHandle handle; |
+ std::unique_ptr<gfx::GpuMemoryBuffer> buffer; |
base::WaitableEvent wait_event( |
base::WaitableEvent::ResetPolicy::MANUAL, |
base::WaitableEvent::InitialState::NOT_SIGNALED); |
// We block with a WaitableEvent until the callbacks are run. So using |
// base::Unretained() is safe here. |
auto reply_callback = base::BindOnce( |
- &ServerGpuMemoryBufferManager::SignalOnGpuMemoryBufferAllocated, |
- base::Unretained(this), &handle, &wait_event); |
- auto allocate_callback = base::BindOnce( |
- &ServerGpuMemoryBufferManager::AllocateGpuMemoryBufferHandle, |
- base::Unretained(this), id, client_id_, size, format, usage, |
- surface_handle, std::move(reply_callback)); |
- task_runner_->PostTask(FROM_HERE, std::move(allocate_callback)); |
+ &ServerGpuMemoryBufferManager::SignalOnGpuMemoryBufferAllocated, this, |
+ &buffer, &wait_event, size, format, usage); |
+ auto alloc_callback = base::BindOnce( |
+ &ServerGpuMemoryBufferManager::AllocateGpuMemoryBufferHandle, this, id, |
+ client_id_, size, format, usage, surface_handle, |
+ std::move(reply_callback)); |
+ task_runner_->PostTask(FROM_HERE, std::move(alloc_callback)); |
base::ThreadRestrictions::ScopedAllowWait allow_wait; |
wait_event.Wait(); |
- if (handle.is_null()) |
- return nullptr; |
- return gpu::GpuMemoryBufferImpl::CreateFromHandle( |
- handle, size, format, usage, |
- base::Bind(&ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer, |
- weak_factory_.GetWeakPtr(), id, client_id_)); |
+ return buffer; |
} |
void ServerGpuMemoryBufferManager::SetDestructionSyncToken( |
@@ -102,9 +95,15 @@ void ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer( |
gfx::GpuMemoryBufferId id, |
int client_id, |
const gpu::SyncToken& sync_token) { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
- if (native_buffers_[client_id].erase(id)) |
- gpu_service_->DestroyGpuMemoryBuffer(id, client_id, sync_token); |
+ if (task_runner_->BelongsToCurrentThread()) { |
+ if (native_buffers_[client_id].erase(id)) |
+ gpu_service_->DestroyGpuMemoryBuffer(id, client_id, sync_token); |
+ } else { |
+ task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer, this, |
+ id, client_id, sync_token)); |
+ } |
} |
void ServerGpuMemoryBufferManager::DestroyAllGpuMemoryBufferForClient( |
@@ -135,10 +134,18 @@ void ServerGpuMemoryBufferManager::OnGpuMemoryBufferAllocated( |
} |
void ServerGpuMemoryBufferManager::SignalOnGpuMemoryBufferAllocated( |
- gfx::GpuMemoryBufferHandle* handle, |
+ std::unique_ptr<gfx::GpuMemoryBuffer>* buffer, |
base::WaitableEvent* wait_event, |
- const gfx::GpuMemoryBufferHandle& allocated_handle) { |
- *handle = allocated_handle; |
+ const gfx::Size& size, |
+ gfx::BufferFormat format, |
+ gfx::BufferUsage usage, |
+ const gfx::GpuMemoryBufferHandle& handle) { |
+ if (!handle.is_null()) { |
+ *buffer = gpu::GpuMemoryBufferImpl::CreateFromHandle( |
+ handle, size, format, usage, |
+ base::Bind(&ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer, this, |
+ handle.id, client_id_)); |
+ } |
wait_event->Signal(); |
} |