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 3de76c0b298191048f40635bbb47f63167028bab..ae49d33a9760bb1179dc18baf122b18cbb02431a 100644 |
--- a/content/browser/gpu/browser_gpu_channel_host_factory.cc |
+++ b/content/browser/gpu/browser_gpu_channel_host_factory.cc |
@@ -32,7 +32,6 @@ BrowserGpuChannelHostFactory* BrowserGpuChannelHostFactory::instance_ = NULL; |
struct BrowserGpuChannelHostFactory::CreateRequest { |
CreateRequest(int32 route_id) |
: event(true, false), |
- gpu_host_id(0), |
route_id(route_id), |
result(CREATE_COMMAND_BUFFER_FAILED) {} |
~CreateRequest() {} |
@@ -42,6 +41,20 @@ struct BrowserGpuChannelHostFactory::CreateRequest { |
CreateCommandBufferResult result; |
}; |
+struct BrowserGpuChannelHostFactory::CreateStreamTextureRequest { |
+ CreateStreamTextureRequest(int32 image_id, int32 stream_id, int32 route_id) |
+ : event(true, false), |
+ image_id(image_id), |
+ stream_id(stream_id), |
+ route_id(route_id) {} |
+ ~CreateStreamTextureRequest() {} |
+ base::WaitableEvent event; |
+ int32 image_id; |
+ int32 stream_id; |
+ int32 route_id; |
+ bool result; |
+}; |
+ |
class BrowserGpuChannelHostFactory::EstablishRequest |
: public base::RefCountedThreadSafe<EstablishRequest> { |
public: |
@@ -284,6 +297,19 @@ void BrowserGpuChannelHostFactory::CreateViewCommandBufferOnIO( |
request)); |
} |
+void BrowserGpuChannelHostFactory::CreateStreamTextureOnIO( |
+ CreateStreamTextureRequest* request) { |
+ GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); |
+ if (!host) { |
+ request->event.Signal(); |
+ return; |
+ } |
+ host->CreateStreamTexture( |
+ request->image_id, gpu_client_id_, request->route_id, request->stream_id, |
+ base::Bind(&BrowserGpuChannelHostFactory::StreamTextureCreatedOnIO, |
+ request)); |
+} |
+ |
IPC::AttachmentBroker* BrowserGpuChannelHostFactory::GetAttachmentBroker() { |
return content::ChildProcessHost::GetAttachmentBroker(); |
} |
@@ -295,6 +321,14 @@ void BrowserGpuChannelHostFactory::CommandBufferCreatedOnIO( |
request->event.Signal(); |
} |
+// static |
+void BrowserGpuChannelHostFactory::StreamTextureCreatedOnIO( |
+ CreateStreamTextureRequest* request, |
+ bool result) { |
+ request->result = result; |
+ request->event.Signal(); |
+} |
+ |
CreateCommandBufferResult BrowserGpuChannelHostFactory::CreateViewCommandBuffer( |
int32 surface_id, |
const GPUCreateCommandBufferConfig& init_params, |
@@ -320,6 +354,23 @@ CreateCommandBufferResult BrowserGpuChannelHostFactory::CreateViewCommandBuffer( |
return request.result; |
} |
+bool BrowserGpuChannelHostFactory::CreateStreamTexture(int32 image_id, |
+ int32 route_id, |
+ int32 stream_id) { |
+ CreateStreamTextureRequest request(image_id, stream_id, route_id); |
+ |
+ GetIOThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&BrowserGpuChannelHostFactory::CreateStreamTextureOnIO, |
+ base::Unretained(this), &request)); |
+ TRACE_EVENT0("browser", |
+ "BrowserGpuChannelHostFactory::CreateStreamTextureOnIO"); |
+ |
+ base::ThreadRestrictions::ScopedAllowWait allow_wait; |
+ request.event.Wait(); |
+ return request.result; |
+} |
+ |
// Blocking the UI thread to open a GPU channel is not supported on Android. |
// (Opening the initial channel to a child process involves handling a reply |
// task on the UI thread first, so we cannot block here.) |