| Index: content/browser/gpu/browser_gpu_channel_host_factory.cc
|
| diff --git a/content/browser/gpu/browser_gpu_channel_host_factory.cc b/content/browser/gpu/browser_gpu_channel_host_factory.cc
|
| index de4e791683b05fcc57f8184051c6a49ccacaee56..b35d64f3255ec73f58561e98a56edc4976159879 100644
|
| --- a/content/browser/gpu/browser_gpu_channel_host_factory.cc
|
| +++ b/content/browser/gpu/browser_gpu_channel_host_factory.cc
|
| @@ -26,8 +26,10 @@ namespace content {
|
| BrowserGpuChannelHostFactory* BrowserGpuChannelHostFactory::instance_ = NULL;
|
|
|
| struct BrowserGpuChannelHostFactory::CreateRequest {
|
| - CreateRequest()
|
| - : event(true, false), gpu_host_id(0), route_id(MSG_ROUTING_NONE),
|
| + CreateRequest(int32 route_id)
|
| + : event(true, false),
|
| + gpu_host_id(0),
|
| + route_id(route_id),
|
| result(CREATE_COMMAND_BUFFER_FAILED) {}
|
| ~CreateRequest() {}
|
| base::WaitableEvent event;
|
| @@ -36,6 +38,25 @@ struct BrowserGpuChannelHostFactory::CreateRequest {
|
| CreateCommandBufferResult result;
|
| };
|
|
|
| +struct BrowserGpuChannelHostFactory::AllocateGpuMemoryBufferRequest {
|
| + AllocateGpuMemoryBufferRequest(size_t width,
|
| + size_t height,
|
| + unsigned internalformat,
|
| + unsigned usage)
|
| + : event(true, false),
|
| + width(width),
|
| + height(height),
|
| + internalformat(internalformat),
|
| + usage(usage) {}
|
| + ~AllocateGpuMemoryBufferRequest() {}
|
| + base::WaitableEvent event;
|
| + size_t width;
|
| + size_t height;
|
| + unsigned internalformat;
|
| + unsigned usage;
|
| + scoped_ptr<gfx::GpuMemoryBuffer> result;
|
| +};
|
| +
|
| class BrowserGpuChannelHostFactory::EstablishRequest
|
| : public base::RefCountedThreadSafe<EstablishRequest> {
|
| public:
|
| @@ -278,8 +299,7 @@ CreateCommandBufferResult BrowserGpuChannelHostFactory::CreateViewCommandBuffer(
|
| int32 surface_id,
|
| const GPUCreateCommandBufferConfig& init_params,
|
| int32 route_id) {
|
| - CreateRequest request;
|
| - request.route_id = route_id;
|
| + CreateRequest request(route_id);
|
| GetIOLoopProxy()->PostTask(FROM_HERE, base::Bind(
|
| &BrowserGpuChannelHostFactory::CreateViewCommandBufferOnIO,
|
| base::Unretained(this),
|
| @@ -363,13 +383,69 @@ BrowserGpuChannelHostFactory::AllocateGpuMemoryBuffer(size_t width,
|
| size_t height,
|
| unsigned internalformat,
|
| unsigned usage) {
|
| - if (!GpuMemoryBufferImpl::IsFormatValid(internalformat) ||
|
| - !GpuMemoryBufferImpl::IsUsageValid(usage))
|
| - return scoped_ptr<gfx::GpuMemoryBuffer>();
|
| + DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + AllocateGpuMemoryBufferRequest request(width, height, internalformat, usage);
|
| + GetIOLoopProxy()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&BrowserGpuChannelHostFactory::AllocateGpuMemoryBufferOnIO,
|
| + base::Unretained(&request)));
|
| +
|
| + // We're blocking the UI thread, which is generally undesirable.
|
| + TRACE_EVENT0("browser",
|
| + "BrowserGpuChannelHostFactory::AllocateGpuMemoryBuffer");
|
| + base::ThreadRestrictions::ScopedAllowWait allow_wait;
|
| + request.event.Wait();
|
| + return request.result.Pass();
|
| +}
|
| +
|
| +void BrowserGpuChannelHostFactory::DeleteGpuMemoryBuffer(
|
| + scoped_ptr<gfx::GpuMemoryBuffer> buffer) {
|
| + DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + GetIOLoopProxy()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&BrowserGpuChannelHostFactory::DeleteGpuMemoryBufferOnIO,
|
| + base::Passed(&buffer)));
|
| +}
|
| +
|
| +void BrowserGpuChannelHostFactory::CreateGpuMemoryBuffer(
|
| + const gfx::GpuMemoryBufferHandle& handle,
|
| + const gfx::Size& size,
|
| + unsigned internalformat,
|
| + unsigned usage,
|
| + const CreateGpuMemoryBufferCallback& callback) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
|
| + if (!host) {
|
| + callback.Run(gfx::GpuMemoryBufferHandle());
|
| + return;
|
| + }
|
|
|
| - return GpuMemoryBufferImpl::Create(gfx::Size(width, height),
|
| - internalformat,
|
| - usage).PassAs<gfx::GpuMemoryBuffer>();
|
| + uint32 request_id = next_create_gpu_memory_buffer_request_id_++;
|
| + create_gpu_memory_buffer_requests_[request_id] = callback;
|
| +
|
| + host->CreateGpuMemoryBuffer(
|
| + handle,
|
| + size,
|
| + internalformat,
|
| + usage,
|
| + base::Bind(&BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated,
|
| + base::Unretained(this),
|
| + request_id));
|
| +}
|
| +
|
| +void BrowserGpuChannelHostFactory::DestroyGpuMemoryBuffer(
|
| + const gfx::GpuMemoryBufferHandle& handle,
|
| + int32 sync_point) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
|
| + if (!host)
|
| + return;
|
| +
|
| + host->DestroyGpuMemoryBuffer(handle, sync_point);
|
| }
|
|
|
| // static
|
| @@ -406,75 +482,33 @@ void BrowserGpuChannelHostFactory::SetHandlerForControlMessages(
|
| filter));
|
| }
|
|
|
| -void BrowserGpuChannelHostFactory::CreateGpuMemoryBuffer(
|
| - const gfx::GpuMemoryBufferHandle& handle,
|
| - const gfx::Size& size,
|
| - unsigned internalformat,
|
| - unsigned usage,
|
| - const CreateGpuMemoryBufferCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - uint32 request_id = next_create_gpu_memory_buffer_request_id_++;
|
| - create_gpu_memory_buffer_requests_[request_id] = callback;
|
| - GetIOLoopProxy()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&BrowserGpuChannelHostFactory::CreateGpuMemoryBufferOnIO,
|
| - base::Unretained(this),
|
| - handle,
|
| - size,
|
| - internalformat,
|
| - usage,
|
| - request_id));
|
| -}
|
| -
|
| -void BrowserGpuChannelHostFactory::DestroyGpuMemoryBuffer(
|
| - const gfx::GpuMemoryBufferHandle& handle,
|
| - int32 sync_point) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - GetIOLoopProxy()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&BrowserGpuChannelHostFactory::DestroyGpuMemoryBufferOnIO,
|
| - base::Unretained(this),
|
| - handle,
|
| - sync_point));
|
| -}
|
| -
|
| -void BrowserGpuChannelHostFactory::CreateGpuMemoryBufferOnIO(
|
| - const gfx::GpuMemoryBufferHandle& handle,
|
| - const gfx::Size& size,
|
| - unsigned internalformat,
|
| - unsigned usage,
|
| - uint32 request_id) {
|
| - GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
|
| - if (!host) {
|
| - GpuMemoryBufferCreatedOnIO(request_id, gfx::GpuMemoryBufferHandle());
|
| +// static
|
| +void BrowserGpuChannelHostFactory::AllocateGpuMemoryBufferOnIO(
|
| + AllocateGpuMemoryBufferRequest* request) {
|
| + if (!GpuMemoryBufferImpl::IsFormatValid(request->internalformat) ||
|
| + !GpuMemoryBufferImpl::IsUsageValid(request->usage)) {
|
| + request->result = scoped_ptr<gfx::GpuMemoryBuffer>();
|
| + request->event.Signal();
|
| return;
|
| }
|
|
|
| - host->CreateGpuMemoryBuffer(
|
| - handle,
|
| - size,
|
| - internalformat,
|
| - usage,
|
| - base::Bind(&BrowserGpuChannelHostFactory::GpuMemoryBufferCreatedOnIO,
|
| - base::Unretained(this),
|
| - request_id));
|
| + request->result = GpuMemoryBufferImpl::Create(
|
| + gfx::Size(request->width, request->height),
|
| + request->internalformat,
|
| + request->usage).PassAs<gfx::GpuMemoryBuffer>();
|
| + request->event.Signal();
|
| }
|
|
|
| -void BrowserGpuChannelHostFactory::GpuMemoryBufferCreatedOnIO(
|
| - uint32 request_id,
|
| - const gfx::GpuMemoryBufferHandle& handle) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated,
|
| - base::Unretained(this),
|
| - request_id,
|
| - handle));
|
| +// static
|
| +void BrowserGpuChannelHostFactory::DeleteGpuMemoryBufferOnIO(
|
| + scoped_ptr<gfx::GpuMemoryBuffer> buffer) {
|
| }
|
|
|
| void BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated(
|
| uint32 request_id,
|
| const gfx::GpuMemoryBufferHandle& handle) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| CreateGpuMemoryBufferCallbackMap::iterator iter =
|
| create_gpu_memory_buffer_requests_.find(request_id);
|
| DCHECK(iter != create_gpu_memory_buffer_requests_.end());
|
| @@ -482,14 +516,4 @@ void BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated(
|
| create_gpu_memory_buffer_requests_.erase(iter);
|
| }
|
|
|
| -void BrowserGpuChannelHostFactory::DestroyGpuMemoryBufferOnIO(
|
| - const gfx::GpuMemoryBufferHandle& handle,
|
| - int32 sync_point) {
|
| - GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
|
| - if (!host)
|
| - return;
|
| -
|
| - host->DestroyGpuMemoryBuffer(handle, sync_point);
|
| -}
|
| -
|
| } // namespace content
|
|
|