| 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/renderer/render_thread_impl.h" | 5 #include "content/renderer/render_thread_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 for (size_t i = 0; i < pieces.size(); ++i) { | 396 for (size_t i = 0; i < pieces.size(); ++i) { |
| 397 unsigned number = 0; | 397 unsigned number = 0; |
| 398 bool succeed = base::StringToUint(pieces[i], &number); | 398 bool succeed = base::StringToUint(pieces[i], &number); |
| 399 DCHECK(succeed); | 399 DCHECK(succeed); |
| 400 vector->push_back(number); | 400 vector->push_back(number); |
| 401 } | 401 } |
| 402 } | 402 } |
| 403 | 403 |
| 404 scoped_refptr<ContextProviderCommandBuffer> CreateOffscreenContext( | 404 scoped_refptr<ContextProviderCommandBuffer> CreateOffscreenContext( |
| 405 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host, | 405 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host, |
| 406 command_buffer_metrics::ContextType type) { | 406 command_buffer_metrics::ContextType type, |
| 407 int32_t stream_id, |
| 408 gpu::GpuStreamPriority stream_priority) { |
| 407 DCHECK(gpu_channel_host); | 409 DCHECK(gpu_channel_host); |
| 408 // This is used to create a few different offscreen contexts: | 410 // This is used to create a few different offscreen contexts: |
| 409 // - The shared main thread context (offscreen) used by blink for canvas. | 411 // - The shared main thread context (offscreen) used by blink for canvas. |
| 410 // - The worker context (offscreen) used for GPU raster and video decoding. | 412 // - The worker context (offscreen) used for GPU raster and video decoding. |
| 411 // This is for an offscreen context, so the default framebuffer doesn't need | 413 // This is for an offscreen context, so the default framebuffer doesn't need |
| 412 // alpha, depth, stencil, antialiasing. | 414 // alpha, depth, stencil, antialiasing. |
| 413 gpu::gles2::ContextCreationAttribHelper attributes; | 415 gpu::gles2::ContextCreationAttribHelper attributes; |
| 414 attributes.alpha_size = -1; | 416 attributes.alpha_size = -1; |
| 415 attributes.depth_size = 0; | 417 attributes.depth_size = 0; |
| 416 attributes.stencil_size = 0; | 418 attributes.stencil_size = 0; |
| 417 attributes.samples = 0; | 419 attributes.samples = 0; |
| 418 attributes.sample_buffers = 0; | 420 attributes.sample_buffers = 0; |
| 419 attributes.bind_generates_resource = false; | 421 attributes.bind_generates_resource = false; |
| 420 attributes.lose_context_when_out_of_memory = true; | 422 attributes.lose_context_when_out_of_memory = true; |
| 421 constexpr bool automatic_flushes = false; | 423 const bool automatic_flushes = false; |
| 422 return make_scoped_refptr(new ContextProviderCommandBuffer( | 424 return make_scoped_refptr(new ContextProviderCommandBuffer( |
| 423 std::move(gpu_channel_host), gpu::kNullSurfaceHandle, | 425 std::move(gpu_channel_host), stream_id, stream_priority, |
| 426 gpu::kNullSurfaceHandle, |
| 424 GURL("chrome://gpu/RenderThreadImpl::CreateOffscreenContext"), | 427 GURL("chrome://gpu/RenderThreadImpl::CreateOffscreenContext"), |
| 425 gfx::PreferIntegratedGpu, automatic_flushes, gpu::SharedMemoryLimits(), | 428 gfx::PreferIntegratedGpu, automatic_flushes, gpu::SharedMemoryLimits(), |
| 426 attributes, nullptr, type)); | 429 attributes, nullptr, type)); |
| 427 } | 430 } |
| 428 | 431 |
| 429 } // namespace | 432 } // namespace |
| 430 | 433 |
| 431 // For measuring memory usage after each task. Behind a command line flag. | 434 // For measuring memory usage after each task. Behind a command line flag. |
| 432 class MemoryObserver : public base::MessageLoop::TaskObserver { | 435 class MemoryObserver : public base::MessageLoop::TaskObserver { |
| 433 public: | 436 public: |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 736 is_lcd_text_enabled_ = false; | 739 is_lcd_text_enabled_ = false; |
| 737 #else | 740 #else |
| 738 is_lcd_text_enabled_ = true; | 741 is_lcd_text_enabled_ = true; |
| 739 #endif | 742 #endif |
| 740 } | 743 } |
| 741 | 744 |
| 742 is_gpu_rasterization_enabled_ = | 745 is_gpu_rasterization_enabled_ = |
| 743 command_line.HasSwitch(switches::kEnableGpuRasterization); | 746 command_line.HasSwitch(switches::kEnableGpuRasterization); |
| 744 is_gpu_rasterization_forced_ = | 747 is_gpu_rasterization_forced_ = |
| 745 command_line.HasSwitch(switches::kForceGpuRasterization); | 748 command_line.HasSwitch(switches::kForceGpuRasterization); |
| 749 is_async_worker_context_enabled_ = |
| 750 command_line.HasSwitch(switches::kEnableGpuAsyncWorkerContext); |
| 746 | 751 |
| 747 if (command_line.HasSwitch(switches::kGpuRasterizationMSAASampleCount)) { | 752 if (command_line.HasSwitch(switches::kGpuRasterizationMSAASampleCount)) { |
| 748 std::string string_value = command_line.GetSwitchValueASCII( | 753 std::string string_value = command_line.GetSwitchValueASCII( |
| 749 switches::kGpuRasterizationMSAASampleCount); | 754 switches::kGpuRasterizationMSAASampleCount); |
| 750 bool parsed_msaa_sample_count = | 755 bool parsed_msaa_sample_count = |
| 751 base::StringToInt(string_value, &gpu_rasterization_msaa_sample_count_); | 756 base::StringToInt(string_value, &gpu_rasterization_msaa_sample_count_); |
| 752 DCHECK(parsed_msaa_sample_count) << string_value; | 757 DCHECK(parsed_msaa_sample_count) << string_value; |
| 753 DCHECK_GE(gpu_rasterization_msaa_sample_count_, 0); | 758 DCHECK_GE(gpu_rasterization_msaa_sample_count_, 0); |
| 754 } else { | 759 } else { |
| 755 gpu_rasterization_msaa_sample_count_ = -1; | 760 gpu_rasterization_msaa_sample_count_ = -1; |
| (...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1440 | 1445 |
| 1441 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host(EstablishGpuChannelSync( | 1446 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host(EstablishGpuChannelSync( |
| 1442 CAUSE_FOR_GPU_LAUNCH_RENDERER_SHARED_MAIN_THREAD_CONTEXT)); | 1447 CAUSE_FOR_GPU_LAUNCH_RENDERER_SHARED_MAIN_THREAD_CONTEXT)); |
| 1443 if (!gpu_channel_host) { | 1448 if (!gpu_channel_host) { |
| 1444 shared_main_thread_contexts_ = nullptr; | 1449 shared_main_thread_contexts_ = nullptr; |
| 1445 return nullptr; | 1450 return nullptr; |
| 1446 } | 1451 } |
| 1447 | 1452 |
| 1448 shared_main_thread_contexts_ = CreateOffscreenContext( | 1453 shared_main_thread_contexts_ = CreateOffscreenContext( |
| 1449 std::move(gpu_channel_host), | 1454 std::move(gpu_channel_host), |
| 1450 command_buffer_metrics::RENDERER_MAINTHREAD_CONTEXT); | 1455 command_buffer_metrics::RENDERER_MAINTHREAD_CONTEXT, |
| 1456 gpu::GPU_STREAM_DEFAULT, gpu::GpuStreamPriority::NORMAL); |
| 1451 if (!shared_main_thread_contexts_->BindToCurrentThread()) | 1457 if (!shared_main_thread_contexts_->BindToCurrentThread()) |
| 1452 shared_main_thread_contexts_ = nullptr; | 1458 shared_main_thread_contexts_ = nullptr; |
| 1453 return shared_main_thread_contexts_; | 1459 return shared_main_thread_contexts_; |
| 1454 } | 1460 } |
| 1455 | 1461 |
| 1456 #if defined(OS_ANDROID) | 1462 #if defined(OS_ANDROID) |
| 1457 | 1463 |
| 1458 scoped_refptr<StreamTextureFactory> RenderThreadImpl::GetStreamTexureFactory() { | 1464 scoped_refptr<StreamTextureFactory> RenderThreadImpl::GetStreamTexureFactory() { |
| 1459 DCHECK(IsMainThread()); | 1465 DCHECK(IsMainThread()); |
| 1460 if (!stream_texture_factory_.get() || | 1466 if (!stream_texture_factory_.get() || |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1520 } | 1526 } |
| 1521 | 1527 |
| 1522 bool RenderThreadImpl::IsGpuRasterizationForced() { | 1528 bool RenderThreadImpl::IsGpuRasterizationForced() { |
| 1523 return is_gpu_rasterization_forced_; | 1529 return is_gpu_rasterization_forced_; |
| 1524 } | 1530 } |
| 1525 | 1531 |
| 1526 bool RenderThreadImpl::IsGpuRasterizationEnabled() { | 1532 bool RenderThreadImpl::IsGpuRasterizationEnabled() { |
| 1527 return is_gpu_rasterization_enabled_; | 1533 return is_gpu_rasterization_enabled_; |
| 1528 } | 1534 } |
| 1529 | 1535 |
| 1536 bool RenderThreadImpl::IsAsyncWorkerContextEnabled() { |
| 1537 return is_async_worker_context_enabled_; |
| 1538 } |
| 1539 |
| 1530 int RenderThreadImpl::GetGpuRasterizationMSAASampleCount() { | 1540 int RenderThreadImpl::GetGpuRasterizationMSAASampleCount() { |
| 1531 return gpu_rasterization_msaa_sample_count_; | 1541 return gpu_rasterization_msaa_sample_count_; |
| 1532 } | 1542 } |
| 1533 | 1543 |
| 1534 bool RenderThreadImpl::IsLcdTextEnabled() { | 1544 bool RenderThreadImpl::IsLcdTextEnabled() { |
| 1535 return is_lcd_text_enabled_; | 1545 return is_lcd_text_enabled_; |
| 1536 } | 1546 } |
| 1537 | 1547 |
| 1538 bool RenderThreadImpl::IsDistanceFieldTextEnabled() { | 1548 bool RenderThreadImpl::IsDistanceFieldTextEnabled() { |
| 1539 return is_distance_field_text_enabled_; | 1549 return is_distance_field_text_enabled_; |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1945 return shared_worker_context_provider_; | 1955 return shared_worker_context_provider_; |
| 1946 } | 1956 } |
| 1947 | 1957 |
| 1948 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host(EstablishGpuChannelSync( | 1958 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host(EstablishGpuChannelSync( |
| 1949 CAUSE_FOR_GPU_LAUNCH_SHARED_WORKER_THREAD_CONTEXT)); | 1959 CAUSE_FOR_GPU_LAUNCH_SHARED_WORKER_THREAD_CONTEXT)); |
| 1950 if (!gpu_channel_host) { | 1960 if (!gpu_channel_host) { |
| 1951 shared_worker_context_provider_ = nullptr; | 1961 shared_worker_context_provider_ = nullptr; |
| 1952 return shared_worker_context_provider_; | 1962 return shared_worker_context_provider_; |
| 1953 } | 1963 } |
| 1954 | 1964 |
| 1965 int32_t stream_id = gpu::GPU_STREAM_DEFAULT; |
| 1966 gpu::GpuStreamPriority stream_priority = gpu::GpuStreamPriority::NORMAL; |
| 1967 if (is_async_worker_context_enabled_) { |
| 1968 stream_id = gpu_channel_host->GenerateStreamID(); |
| 1969 stream_priority = gpu::GpuStreamPriority::LOW; |
| 1970 } |
| 1971 |
| 1955 shared_worker_context_provider_ = | 1972 shared_worker_context_provider_ = |
| 1956 CreateOffscreenContext(std::move(gpu_channel_host), | 1973 CreateOffscreenContext(std::move(gpu_channel_host), |
| 1957 command_buffer_metrics::RENDER_WORKER_CONTEXT); | 1974 command_buffer_metrics::RENDER_WORKER_CONTEXT, |
| 1975 stream_id, stream_priority); |
| 1958 if (!shared_worker_context_provider_->BindToCurrentThread()) | 1976 if (!shared_worker_context_provider_->BindToCurrentThread()) |
| 1959 shared_worker_context_provider_ = nullptr; | 1977 shared_worker_context_provider_ = nullptr; |
| 1960 if (shared_worker_context_provider_) | 1978 if (shared_worker_context_provider_) |
| 1961 shared_worker_context_provider_->SetupLock(); | 1979 shared_worker_context_provider_->SetupLock(); |
| 1962 return shared_worker_context_provider_; | 1980 return shared_worker_context_provider_; |
| 1963 } | 1981 } |
| 1964 | 1982 |
| 1965 void RenderThreadImpl::SampleGamepads(blink::WebGamepads* data) { | 1983 void RenderThreadImpl::SampleGamepads(blink::WebGamepads* data) { |
| 1966 blink_platform_impl_->sampleGamepads(*data); | 1984 blink_platform_impl_->sampleGamepads(*data); |
| 1967 } | 1985 } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2046 } | 2064 } |
| 2047 | 2065 |
| 2048 void RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError() { | 2066 void RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError() { |
| 2049 size_t erased = | 2067 size_t erased = |
| 2050 RenderThreadImpl::current()->pending_render_frame_connects_.erase( | 2068 RenderThreadImpl::current()->pending_render_frame_connects_.erase( |
| 2051 routing_id_); | 2069 routing_id_); |
| 2052 DCHECK_EQ(1u, erased); | 2070 DCHECK_EQ(1u, erased); |
| 2053 } | 2071 } |
| 2054 | 2072 |
| 2055 } // namespace content | 2073 } // namespace content |
| OLD | NEW |