OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/android/in_process/synchronous_compositor_factory_impl
.h" | 5 #include "content/browser/android/in_process/synchronous_compositor_factory_impl
.h" |
6 | 6 |
7 #include "base/observer_list.h" | 7 #include "base/observer_list.h" |
8 #include "content/browser/android/in_process/synchronous_compositor_output_surfa
ce.h" | 8 #include "content/browser/android/in_process/synchronous_compositor_output_surfa
ce.h" |
9 #include "content/public/browser/browser_thread.h" | 9 #include "content/public/browser/browser_thread.h" |
10 #include "content/renderer/gpu/frame_swap_message_queue.h" | 10 #include "content/renderer/gpu/frame_swap_message_queue.h" |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 const blink::WebGraphicsContext3D::Attributes& attributes, | 194 const blink::WebGraphicsContext3D::Attributes& attributes, |
195 const std::string& debug_name) { | 195 const std::string& debug_name) { |
196 scoped_ptr<gpu::GLInProcessContext> context = | 196 scoped_ptr<gpu::GLInProcessContext> context = |
197 CreateOffscreenContext(attributes); | 197 CreateOffscreenContext(attributes); |
198 return webkit::gpu::ContextProviderInProcess::Create( | 198 return webkit::gpu::ContextProviderInProcess::Create( |
199 WrapContext(context.Pass()), debug_name); | 199 WrapContext(context.Pass()), debug_name); |
200 } | 200 } |
201 | 201 |
202 scoped_refptr<cc::ContextProvider> SynchronousCompositorFactoryImpl:: | 202 scoped_refptr<cc::ContextProvider> SynchronousCompositorFactoryImpl:: |
203 CreateOnscreenContextProviderForCompositorThread() { | 203 CreateOnscreenContextProviderForCompositorThread() { |
204 DCHECK(service_); | 204 DCHECK(service_.get()); |
205 | 205 |
206 gpu::GLInProcessContextSharedMemoryLimits mem_limits; | 206 gpu::GLInProcessContextSharedMemoryLimits mem_limits; |
207 // This is half of what RenderWidget uses because synchronous compositor | 207 // This is half of what RenderWidget uses because synchronous compositor |
208 // pipeline is only one frame deep. | 208 // pipeline is only one frame deep. |
209 mem_limits.mapped_memory_reclaim_limit = 6 * 1024 * 1024; | 209 mem_limits.mapped_memory_reclaim_limit = 6 * 1024 * 1024; |
210 return webkit::gpu::ContextProviderInProcess::Create( | 210 return webkit::gpu::ContextProviderInProcess::Create( |
211 WrapContext(CreateContext(service_, mem_limits)), | 211 WrapContext(CreateContext(service_, mem_limits)), |
212 "Child-Compositor"); | 212 "Child-Compositor"); |
213 } | 213 } |
214 | 214 |
(...skipping 11 matching lines...) Expand all Loading... |
226 webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl* | 226 webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl* |
227 SynchronousCompositorFactoryImpl::CreateOffscreenGraphicsContext3D( | 227 SynchronousCompositorFactoryImpl::CreateOffscreenGraphicsContext3D( |
228 const blink::WebGraphicsContext3D::Attributes& attributes) { | 228 const blink::WebGraphicsContext3D::Attributes& attributes) { |
229 return WrapContextWithAttributes(CreateOffscreenContext(attributes), | 229 return WrapContextWithAttributes(CreateOffscreenContext(attributes), |
230 attributes).release(); | 230 attributes).release(); |
231 } | 231 } |
232 | 232 |
233 void SynchronousCompositorFactoryImpl::CompositorInitializedHardwareDraw() { | 233 void SynchronousCompositorFactoryImpl::CompositorInitializedHardwareDraw() { |
234 base::AutoLock lock(num_hardware_compositor_lock_); | 234 base::AutoLock lock(num_hardware_compositor_lock_); |
235 num_hardware_compositors_++; | 235 num_hardware_compositors_++; |
236 if (num_hardware_compositors_ == 1 && main_thread_proxy_) { | 236 if (num_hardware_compositors_ == 1 && main_thread_proxy_.get()) { |
237 main_thread_proxy_->PostTask( | 237 main_thread_proxy_->PostTask( |
238 FROM_HERE, | 238 FROM_HERE, |
239 base::Bind( | 239 base::Bind( |
240 &SynchronousCompositorFactoryImpl::RestoreContextOnMainThread, | 240 &SynchronousCompositorFactoryImpl::RestoreContextOnMainThread, |
241 base::Unretained(this))); | 241 base::Unretained(this))); |
242 } | 242 } |
243 } | 243 } |
244 | 244 |
245 void SynchronousCompositorFactoryImpl::CompositorReleasedHardwareDraw() { | 245 void SynchronousCompositorFactoryImpl::CompositorReleasedHardwareDraw() { |
246 base::AutoLock lock(num_hardware_compositor_lock_); | 246 base::AutoLock lock(num_hardware_compositor_lock_); |
247 DCHECK_GT(num_hardware_compositors_, 0u); | 247 DCHECK_GT(num_hardware_compositors_, 0u); |
248 num_hardware_compositors_--; | 248 num_hardware_compositors_--; |
249 } | 249 } |
250 | 250 |
251 void SynchronousCompositorFactoryImpl::RestoreContextOnMainThread() { | 251 void SynchronousCompositorFactoryImpl::RestoreContextOnMainThread() { |
252 if (CanCreateMainThreadContext() && video_context_provider_ ) | 252 if (CanCreateMainThreadContext() && video_context_provider_.get()) |
253 video_context_provider_->RestoreContext(); | 253 video_context_provider_->RestoreContext(); |
254 } | 254 } |
255 | 255 |
256 bool SynchronousCompositorFactoryImpl::CanCreateMainThreadContext() { | 256 bool SynchronousCompositorFactoryImpl::CanCreateMainThreadContext() { |
257 base::AutoLock lock(num_hardware_compositor_lock_); | 257 base::AutoLock lock(num_hardware_compositor_lock_); |
258 return num_hardware_compositors_ > 0; | 258 return num_hardware_compositors_ > 0; |
259 } | 259 } |
260 | 260 |
261 scoped_refptr<StreamTextureFactorySynchronousImpl::ContextProvider> | 261 scoped_refptr<StreamTextureFactorySynchronousImpl::ContextProvider> |
262 SynchronousCompositorFactoryImpl::TryCreateStreamTextureFactory() { | 262 SynchronousCompositorFactoryImpl::TryCreateStreamTextureFactory() { |
263 { | 263 { |
264 base::AutoLock lock(num_hardware_compositor_lock_); | 264 base::AutoLock lock(num_hardware_compositor_lock_); |
265 main_thread_proxy_ = base::MessageLoopProxy::current(); | 265 main_thread_proxy_ = base::MessageLoopProxy::current(); |
266 } | 266 } |
267 | 267 |
268 // Always fail creation even if |video_context_provider_| is not NULL. | 268 // Always fail creation even if |video_context_provider_| is not NULL. |
269 // This is to avoid synchronous calls that may deadlock. Setting | 269 // This is to avoid synchronous calls that may deadlock. Setting |
270 // |video_context_provider_| to null is also not safe since it makes | 270 // |video_context_provider_| to null is also not safe since it makes |
271 // synchronous destruction uncontrolled and possibly deadlock. | 271 // synchronous destruction uncontrolled and possibly deadlock. |
272 if (!CanCreateMainThreadContext()) { | 272 if (!CanCreateMainThreadContext()) { |
273 return | 273 return |
274 scoped_refptr<StreamTextureFactorySynchronousImpl::ContextProvider>(); | 274 scoped_refptr<StreamTextureFactorySynchronousImpl::ContextProvider>(); |
275 } | 275 } |
276 | 276 |
277 if (!video_context_provider_) { | 277 if (!video_context_provider_.get()) { |
278 DCHECK(service_); | 278 DCHECK(service_.get()); |
279 | 279 |
280 video_context_provider_ = new VideoContextProvider( | 280 video_context_provider_ = new VideoContextProvider( |
281 CreateContext(service_, | 281 CreateContext(service_, |
282 gpu::GLInProcessContextSharedMemoryLimits())); | 282 gpu::GLInProcessContextSharedMemoryLimits())); |
283 } | 283 } |
284 return video_context_provider_; | 284 return video_context_provider_; |
285 } | 285 } |
286 | 286 |
287 void SynchronousCompositorFactoryImpl::SetDeferredGpuService( | 287 void SynchronousCompositorFactoryImpl::SetDeferredGpuService( |
288 scoped_refptr<gpu::InProcessCommandBuffer::Service> service) { | 288 scoped_refptr<gpu::InProcessCommandBuffer::Service> service) { |
289 DCHECK(!service_); | 289 DCHECK(!service_.get()); |
290 service_ = service; | 290 service_ = service; |
291 } | 291 } |
292 | 292 |
293 void SynchronousCompositorFactoryImpl::SetRecordFullDocument( | 293 void SynchronousCompositorFactoryImpl::SetRecordFullDocument( |
294 bool record_full_document) { | 294 bool record_full_document) { |
295 record_full_layer_ = record_full_document; | 295 record_full_layer_ = record_full_document; |
296 } | 296 } |
297 | 297 |
298 } // namespace content | 298 } // namespace content |
OLD | NEW |