OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" | 5 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/threading/thread_restrictions.h" | 8 #include "base/threading/thread_restrictions.h" |
9 #include "content/browser/gpu/gpu_data_manager_impl.h" | 9 #include "content/browser/gpu/gpu_data_manager_impl.h" |
10 #include "content/browser/gpu/gpu_process_host.h" | 10 #include "content/browser/gpu/gpu_process_host.h" |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 init_params)); | 127 init_params)); |
128 // We're blocking the UI thread, which is generally undesirable. | 128 // We're blocking the UI thread, which is generally undesirable. |
129 // In this case we need to wait for this before we can show any UI /anyway/, | 129 // In this case we need to wait for this before we can show any UI /anyway/, |
130 // so it won't cause additional jank. | 130 // so it won't cause additional jank. |
131 // TODO(piman): Make this asynchronous (http://crbug.com/125248). | 131 // TODO(piman): Make this asynchronous (http://crbug.com/125248). |
132 base::ThreadRestrictions::ScopedAllowWait allow_wait; | 132 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
133 request.event.Wait(); | 133 request.event.Wait(); |
134 return request.route_id; | 134 return request.route_id; |
135 } | 135 } |
136 | 136 |
| 137 void BrowserGpuChannelHostFactory::CreateImageOnIO( |
| 138 gfx::PluginWindowHandle window, |
| 139 int32 image_id, |
| 140 const CreateImageCallback& callback) { |
| 141 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); |
| 142 if (!host) { |
| 143 ImageCreatedOnIO(callback, gfx::Size()); |
| 144 return; |
| 145 } |
| 146 |
| 147 host->CreateImage( |
| 148 window, |
| 149 gpu_client_id_, |
| 150 image_id, |
| 151 base::Bind(&BrowserGpuChannelHostFactory::ImageCreatedOnIO, callback)); |
| 152 } |
| 153 |
| 154 // static |
| 155 void BrowserGpuChannelHostFactory::ImageCreatedOnIO( |
| 156 const CreateImageCallback& callback, const gfx::Size size) { |
| 157 BrowserThread::PostTask( |
| 158 BrowserThread::UI, |
| 159 FROM_HERE, |
| 160 base::Bind(&BrowserGpuChannelHostFactory::OnImageCreated, |
| 161 callback, size)); |
| 162 } |
| 163 |
| 164 // static |
| 165 void BrowserGpuChannelHostFactory::OnImageCreated( |
| 166 const CreateImageCallback& callback, const gfx::Size size) { |
| 167 callback.Run(size); |
| 168 } |
| 169 |
| 170 void BrowserGpuChannelHostFactory::CreateImage( |
| 171 gfx::PluginWindowHandle window, |
| 172 int32 image_id, |
| 173 const CreateImageCallback& callback) { |
| 174 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 175 GetIOLoopProxy()->PostTask(FROM_HERE, base::Bind( |
| 176 &BrowserGpuChannelHostFactory::CreateImageOnIO, |
| 177 base::Unretained(this), |
| 178 window, |
| 179 image_id, |
| 180 callback)); |
| 181 } |
| 182 |
| 183 void BrowserGpuChannelHostFactory::DeleteImageOnIO(int32 image_id) { |
| 184 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); |
| 185 if (!host) { |
| 186 return; |
| 187 } |
| 188 |
| 189 host->DeleteImage(gpu_client_id_, image_id); |
| 190 } |
| 191 |
| 192 void BrowserGpuChannelHostFactory::DeleteImage(int32 image_id) { |
| 193 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 194 GetIOLoopProxy()->PostTask(FROM_HERE, base::Bind( |
| 195 &BrowserGpuChannelHostFactory::DeleteImageOnIO, |
| 196 base::Unretained(this), |
| 197 image_id)); |
| 198 } |
| 199 |
137 void BrowserGpuChannelHostFactory::EstablishGpuChannelOnIO( | 200 void BrowserGpuChannelHostFactory::EstablishGpuChannelOnIO( |
138 EstablishRequest* request) { | 201 EstablishRequest* request) { |
139 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); | 202 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); |
140 if (!host) { | 203 if (!host) { |
141 host = GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED, | 204 host = GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED, |
142 request->cause_for_gpu_launch); | 205 request->cause_for_gpu_launch); |
143 if (!host) { | 206 if (!host) { |
144 request->event.Signal(); | 207 request->event.Signal(); |
145 return; | 208 return; |
146 } | 209 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 gpu_channel_->set_gpu_info(request.gpu_info); | 281 gpu_channel_->set_gpu_info(request.gpu_info); |
219 content::GetContentClient()->SetGpuInfo(request.gpu_info); | 282 content::GetContentClient()->SetGpuInfo(request.gpu_info); |
220 | 283 |
221 // Connect to the GPU process if a channel name was received. | 284 // Connect to the GPU process if a channel name was received. |
222 gpu_channel_->Connect(request.channel_handle); | 285 gpu_channel_->Connect(request.channel_handle); |
223 | 286 |
224 return gpu_channel_.get(); | 287 return gpu_channel_.get(); |
225 } | 288 } |
226 | 289 |
227 } // namespace content | 290 } // namespace content |
OLD | NEW |