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..8e018a829fe44aa5b10d5579721d67b4ba2197fd 100644 |
--- a/content/browser/gpu/browser_gpu_channel_host_factory.cc |
+++ b/content/browser/gpu/browser_gpu_channel_host_factory.cc |
@@ -188,6 +188,77 @@ void BrowserGpuChannelHostFactory::EstablishRequest::Cancel() { |
finished_ = true; |
} |
+class BrowserGpuChannelHostFactory::CreateGpuMemoryBufferRequest |
+ : public base::RefCountedThreadSafe<CreateGpuMemoryBufferRequest> { |
+ public: |
+ enum RequestType { |
+ SYNC, |
+ CALLBACK, |
+ }; |
+ static scoped_refptr<CreateGpuMemoryBufferRequest> CreateSync(); |
+ static scoped_refptr<CreateGpuMemoryBufferRequest> CreateForCallback( |
+ uint32 request_id); |
+ |
+ void Wait(); |
+ void Signal(); |
+ |
+ void set_result(const gfx::GpuMemoryBufferHandle& handle) { |
+ handle_ = handle; |
+ } |
+ gfx::GpuMemoryBufferHandle result() { return handle_; } |
+ uint32 request_id() { return request_id_; } |
+ RequestType request_type() { return request_type_; } |
+ |
+ private: |
+ friend class base::RefCountedThreadSafe<CreateGpuMemoryBufferRequest>; |
+ CreateGpuMemoryBufferRequest(scoped_ptr<base::WaitableEvent> event, |
+ uint32 request_id, |
+ RequestType request_type); |
+ ~CreateGpuMemoryBufferRequest() {} |
+ |
+ scoped_ptr<base::WaitableEvent> event_; |
+ gfx::GpuMemoryBufferHandle handle_; |
+ uint32 request_id_; |
+ RequestType request_type_; |
+}; |
+ |
+scoped_refptr<BrowserGpuChannelHostFactory::CreateGpuMemoryBufferRequest> |
+BrowserGpuChannelHostFactory::CreateGpuMemoryBufferRequest::CreateSync() { |
+ scoped_ptr<base::WaitableEvent> event(new base::WaitableEvent(true, false)); |
+ scoped_refptr<CreateGpuMemoryBufferRequest> request = |
+ new CreateGpuMemoryBufferRequest(event.Pass(), 0, SYNC); |
+ return request; |
+} |
+ |
+scoped_refptr<BrowserGpuChannelHostFactory::CreateGpuMemoryBufferRequest> |
+BrowserGpuChannelHostFactory::CreateGpuMemoryBufferRequest::CreateForCallback( |
+ uint32 request_id) { |
+ scoped_refptr<CreateGpuMemoryBufferRequest> request = |
+ new CreateGpuMemoryBufferRequest( |
+ scoped_ptr<base::WaitableEvent>(), request_id, CALLBACK); |
+ return request; |
+} |
+ |
+BrowserGpuChannelHostFactory::CreateGpuMemoryBufferRequest:: |
+ CreateGpuMemoryBufferRequest(scoped_ptr<base::WaitableEvent> event, |
+ uint32 request_id, |
+ RequestType request_type) |
+ : event_(event.Pass()), |
+ request_id_(request_id), |
+ request_type_(request_type) { |
+} |
+ |
+void BrowserGpuChannelHostFactory::CreateGpuMemoryBufferRequest::Wait() { |
+ DCHECK(event_.get()); |
+ base::ThreadRestrictions::ScopedAllowWait allow_wait; |
+ event_->Wait(); |
+} |
+ |
+void BrowserGpuChannelHostFactory::CreateGpuMemoryBufferRequest::Signal() { |
+ DCHECK(event_.get()); |
+ event_->Signal(); |
+} |
+ |
bool BrowserGpuChannelHostFactory::CanUseForTesting() { |
return GpuDataManager::GetInstance()->GpuAccessAllowed(NULL); |
} |
@@ -412,6 +483,12 @@ void BrowserGpuChannelHostFactory::CreateGpuMemoryBuffer( |
unsigned internalformat, |
unsigned usage, |
const CreateGpuMemoryBufferCallback& callback) { |
+ TRACE_EVENT2("gpu", |
+ "BrowserGpuChannelHostFactory::CreateGpuMemoryBuffer", |
+ "primary_id", |
+ handle.global_id.primary_id, |
+ "secondary_id", |
+ handle.global_id.secondary_id); |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
uint32 request_id = next_create_gpu_memory_buffer_request_id_++; |
create_gpu_memory_buffer_requests_[request_id] = callback; |
@@ -423,7 +500,36 @@ void BrowserGpuChannelHostFactory::CreateGpuMemoryBuffer( |
size, |
internalformat, |
usage, |
- request_id)); |
+ CreateGpuMemoryBufferRequest::CreateForCallback(request_id))); |
+} |
+ |
+gfx::GpuMemoryBufferHandle |
+BrowserGpuChannelHostFactory::CreateGpuMemoryBufferSync( |
+ const gfx::GpuMemoryBufferHandle& handle, |
+ const gfx::Size& size, |
+ unsigned internalformat, |
+ unsigned usage) { |
+ TRACE_EVENT2("gpu", |
+ "BrowserGpuChannelHostFactory::CreateGpuMemoryBufferSync", |
+ "primary_id", |
+ handle.global_id.primary_id, |
+ "secondary_id", |
+ handle.global_id.secondary_id); |
+ scoped_refptr<CreateGpuMemoryBufferRequest> request = |
+ CreateGpuMemoryBufferRequest::CreateSync(); |
+ GetIOLoopProxy()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&BrowserGpuChannelHostFactory::CreateGpuMemoryBufferOnIO, |
+ base::Unretained(this), |
+ handle, |
+ size, |
+ internalformat, |
+ usage, |
+ request)); |
+ |
+ request->Wait(); |
+ |
+ return request->result(); |
} |
void BrowserGpuChannelHostFactory::DestroyGpuMemoryBuffer( |
@@ -443,10 +549,16 @@ void BrowserGpuChannelHostFactory::CreateGpuMemoryBufferOnIO( |
const gfx::Size& size, |
unsigned internalformat, |
unsigned usage, |
- uint32 request_id) { |
+ scoped_refptr<CreateGpuMemoryBufferRequest> request) { |
+ TRACE_EVENT2("gpu", |
+ "BrowserGpuChannelHostFactory::CreateGpuMemoryBufferOnIO", |
+ "primary_id", |
+ handle.global_id.primary_id, |
+ "secondary_id", |
+ handle.global_id.secondary_id); |
GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); |
if (!host) { |
- GpuMemoryBufferCreatedOnIO(request_id, gfx::GpuMemoryBufferHandle()); |
+ GpuMemoryBufferCreatedOnIO(request, gfx::GpuMemoryBufferHandle()); |
return; |
} |
@@ -457,19 +569,36 @@ void BrowserGpuChannelHostFactory::CreateGpuMemoryBufferOnIO( |
usage, |
base::Bind(&BrowserGpuChannelHostFactory::GpuMemoryBufferCreatedOnIO, |
base::Unretained(this), |
- request_id)); |
+ request)); |
} |
void BrowserGpuChannelHostFactory::GpuMemoryBufferCreatedOnIO( |
- uint32 request_id, |
+ scoped_refptr<CreateGpuMemoryBufferRequest> request, |
const gfx::GpuMemoryBufferHandle& handle) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated, |
- base::Unretained(this), |
- request_id, |
- handle)); |
+ TRACE_EVENT2("gpu", |
+ "BrowserGpuChannelHostFactory::GpuMemoryBufferCreatedOnIO", |
+ "primary_id", |
+ handle.global_id.primary_id, |
+ "secondary_id", |
+ handle.global_id.secondary_id); |
+ switch (request->request_type()) { |
+ case CreateGpuMemoryBufferRequest::SYNC: { |
+ request->set_result(handle); |
+ request->Signal(); |
+ return; |
+ } |
+ case CreateGpuMemoryBufferRequest::CALLBACK: { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated, |
+ base::Unretained(this), |
+ request->request_id(), |
+ handle)); |
+ return; |
+ } |
+ } |
+ NOTREACHED(); |
} |
void BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated( |