sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "content/browser/renderer_host/compositor_impl_android.h" |
| 6 | |
dtrainor@chromium.org | 92fa4d29 | 2012-10-16 20:31:51 | [diff] [blame] | 7 | #include <android/bitmap.h> |
sievers@chromium.org | fd7a857 | 2012-09-18 19:32:05 | [diff] [blame] | 8 | #include <android/native_window_jni.h> |
avi | b533f5d | 2015-12-25 03:11:15 | [diff] [blame] | 9 | #include <stdint.h> |
danakj | 15ec524 | 2016-06-15 22:13:37 | [diff] [blame] | 10 | #include <unordered_set> |
dcheng | a45aa7d6 | 2015-12-30 01:56:12 | [diff] [blame] | 11 | #include <utility> |
sievers@chromium.org | fd7a857 | 2012-09-18 19:32:05 | [diff] [blame] | 12 | |
sievers@chromium.org | ccf558a | 2013-03-07 03:58:18 | [diff] [blame] | 13 | #include "base/android/jni_android.h" |
| 14 | #include "base/android/scoped_java_ref.h" |
sievers | 148fedf | 2015-10-02 00:12:04 | [diff] [blame] | 15 | #include "base/auto_reset.h" |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 16 | #include "base/bind.h" |
mkosiba@chromium.org | 88dfc7c | 2012-10-01 16:25:13 | [diff] [blame] | 17 | #include "base/command_line.h" |
reveman@chromium.org | 354c448d | 2014-04-06 04:29:01 | [diff] [blame] | 18 | #include "base/containers/hash_tables.h" |
aelias@chromium.org | 8f3ffdc6 | 2012-11-15 05:28:26 | [diff] [blame] | 19 | #include "base/lazy_instance.h" |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 20 | #include "base/logging.h" |
dcheng | 92ae141 | 2016-04-09 02:52:24 | [diff] [blame] | 21 | #include "base/memory/ptr_util.h" |
aelias | d880a3d | 2014-08-26 00:46:20 | [diff] [blame] | 22 | #include "base/memory/weak_ptr.h" |
danakj@chromium.org | 810d40b7 | 2013-06-20 18:26:15 | [diff] [blame] | 23 | #include "base/single_thread_task_runner.h" |
sievers@chromium.org | ccf558a | 2013-03-07 03:58:18 | [diff] [blame] | 24 | #include "base/synchronization/lock.h" |
jinsukkim | 2cd5109 | 2016-02-17 02:14:07 | [diff] [blame] | 25 | #include "base/sys_info.h" |
reveman | 34b7a152 | 2015-03-23 20:27:47 | [diff] [blame] | 26 | #include "base/threading/simple_thread.h" |
scottmg@chromium.org | 14b2f17 | 2013-06-15 15:25:14 | [diff] [blame] | 27 | #include "base/threading/thread.h" |
reveman@chromium.org | 82efc0d | 2014-03-31 06:45:02 | [diff] [blame] | 28 | #include "base/threading/thread_checker.h" |
gab | 30f26df | 2016-05-11 19:37:55 | [diff] [blame] | 29 | #include "base/threading/thread_task_runner_handle.h" |
loyso | ab32ee7 | 2016-06-08 03:33:18 | [diff] [blame] | 30 | #include "cc/animation/animation_host.h" |
ernstm@chromium.org | 58e2ad85 | 2014-02-21 23:57:03 | [diff] [blame] | 31 | #include "cc/base/switches.h" |
jamesr@chromium.org | 3052b10f | 2013-03-18 07:41:21 | [diff] [blame] | 32 | #include "cc/input/input_handler.h" |
jamesr@chromium.org | cc3cfaa | 2013-03-18 09:05:52 | [diff] [blame] | 33 | #include "cc/layers/layer.h" |
feng@chromium.org | dbafd6c | 2013-07-12 03:30:33 | [diff] [blame] | 34 | #include "cc/output/compositor_frame.h" |
jamesr@chromium.org | 7f0d825f | 2013-03-18 07:24:30 | [diff] [blame] | 35 | #include "cc/output/context_provider.h" |
| 36 | #include "cc/output/output_surface.h" |
sievers | df212b3 | 2014-10-09 20:40:14 | [diff] [blame] | 37 | #include "cc/output/output_surface_client.h" |
kylechar | 5344b39e | 2016-10-06 23:51:19 | [diff] [blame] | 38 | #include "cc/output/output_surface_frame.h" |
danakj | 8eb035c0 | 2016-06-17 22:41:32 | [diff] [blame] | 39 | #include "cc/output/texture_mailbox_deleter.h" |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 40 | #include "cc/output/vulkan_in_process_context_provider.h" |
ericrk | 4e3aa5a | 2015-12-01 03:53:56 | [diff] [blame] | 41 | #include "cc/raster/single_thread_task_graph_runner.h" |
khushalsagar | 8ec0740 | 2016-09-10 03:13:19 | [diff] [blame] | 42 | #include "cc/resources/ui_resource_manager.h" |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 43 | #include "cc/surfaces/direct_layer_tree_frame_sink.h" |
danakj | 324faea | 2016-06-11 01:39:31 | [diff] [blame] | 44 | #include "cc/surfaces/display.h" |
danakj | 8eb035c0 | 2016-06-17 22:41:32 | [diff] [blame] | 45 | #include "cc/surfaces/display_scheduler.h" |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 46 | #include "cc/surfaces/frame_sink_id_allocator.h" |
khushalsagar | e0e4486e | 2017-01-25 03:15:03 | [diff] [blame] | 47 | #include "cc/trees/layer_tree_host.h" |
loyso | a6edaaf | 2015-05-25 03:26:44 | [diff] [blame] | 48 | #include "cc/trees/layer_tree_settings.h" |
kylechar | cb5882d | 2017-06-05 13:41:34 | [diff] [blame] | 49 | #include "components/viz/host/frame_sink_manager_host.h" |
Fady Samuel | 279f5f0 | 2017-06-14 23:23:00 | [diff] [blame] | 50 | #include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.h" |
| 51 | #include "components/viz/service/display_compositor/gl_helper.h" |
| 52 | #include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" |
| 53 | #include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h" |
| 54 | #include "content/browser/compositor/surface_utils.h" |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 55 | #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
reveman | 22dd929 | 2014-10-13 20:52:05 | [diff] [blame] | 56 | #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
jbauman | 78f9b57 | 2014-11-18 06:01:56 | [diff] [blame] | 57 | #include "content/browser/gpu/compositor_util.h" |
sievers | df212b3 | 2014-10-09 20:40:14 | [diff] [blame] | 58 | #include "content/browser/renderer_host/render_widget_host_impl.h" |
sunnyps | 8f9139e | 2017-05-12 17:53:25 | [diff] [blame] | 59 | #include "content/common/gpu_stream_constants.h" |
loyso | a6edaaf | 2015-05-25 03:26:44 | [diff] [blame] | 60 | #include "content/public/browser/android/compositor.h" |
skyostil@chromium.org | f5f534b | 2013-07-10 17:59:50 | [diff] [blame] | 61 | #include "content/public/browser/android/compositor_client.h" |
loyso | 85a000a | 2015-06-02 01:31:27 | [diff] [blame] | 62 | #include "content/public/common/content_switches.h" |
sievers | df212b3 | 2014-10-09 20:40:14 | [diff] [blame] | 63 | #include "gpu/command_buffer/client/context_support.h" |
jamesr@chromium.org | a770f2a | 2014-01-07 22:29:23 | [diff] [blame] | 64 | #include "gpu/command_buffer/client/gles2_interface.h" |
penghuang | 346a46f9 | 2016-03-31 21:37:52 | [diff] [blame] | 65 | #include "gpu/ipc/client/command_buffer_proxy_impl.h" |
| 66 | #include "gpu/ipc/client/gpu_channel_host.h" |
jcivelli | c9a96403 | 2016-10-17 18:22:20 | [diff] [blame] | 67 | #include "gpu/ipc/common/gpu_surface_tracker.h" |
qyearsley | db0a3487 | 2017-03-14 03:24:31 | [diff] [blame] | 68 | #include "gpu/vulkan/features.h" |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 69 | #include "gpu/vulkan/vulkan_surface.h" |
sadrul | 85cc5d8 | 2016-12-20 03:37:41 | [diff] [blame] | 70 | #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h" |
dtrainor@chromium.org | 92fa4d29 | 2012-10-16 20:31:51 | [diff] [blame] | 71 | #include "third_party/khronos/GLES2/gl2.h" |
| 72 | #include "third_party/khronos/GLES2/gl2ext.h" |
powei@chromium.org | 80ee233 | 2014-02-06 18:31:07 | [diff] [blame] | 73 | #include "third_party/skia/include/core/SkMallocPixelRef.h" |
jaekyun | e4f9eed | 2015-02-24 02:06:58 | [diff] [blame] | 74 | #include "ui/android/window_android.h" |
boliu | 4868d41 | 2017-01-10 19:13:05 | [diff] [blame] | 75 | #include "ui/display/display.h" |
| 76 | #include "ui/display/screen.h" |
achaulk | ec8c2db | 2015-05-29 16:35:03 | [diff] [blame] | 77 | #include "ui/gfx/swap_result.h" |
dtrainor@chromium.org | 92fa4d29 | 2012-10-16 20:31:51 | [diff] [blame] | 78 | |
ccameron | 43320425 | 2016-05-09 20:57:55 | [diff] [blame] | 79 | namespace gpu { |
| 80 | struct GpuProcessHostedCALayerTreeParamsMac; |
| 81 | } |
| 82 | |
sievers | df212b3 | 2014-10-09 20:40:14 | [diff] [blame] | 83 | namespace content { |
| 84 | |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 85 | namespace { |
| 86 | |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 87 | // The client_id used here should not conflict with the client_id generated |
| 88 | // from RenderWidgetHostImpl. |
| 89 | constexpr uint32_t kDefaultClientId = 0u; |
| 90 | |
| 91 | class SingleThreadTaskGraphRunner : public cc::SingleThreadTaskGraphRunner { |
| 92 | public: |
| 93 | SingleThreadTaskGraphRunner() { |
| 94 | Start("CompositorTileWorker1", base::SimpleThread::Options()); |
| 95 | } |
| 96 | |
| 97 | ~SingleThreadTaskGraphRunner() override { Shutdown(); } |
| 98 | }; |
| 99 | |
| 100 | struct CompositorDependencies { |
kylechar | bfc507f | 2017-04-26 00:13:08 | [diff] [blame] | 101 | CompositorDependencies() : frame_sink_id_allocator(kDefaultClientId) { |
danakj | aee6717 | 2017-06-13 16:37:02 | [diff] [blame] | 102 | // TODO(danakj): Don't make a MojoFrameSinkManager when display is in the |
| 103 | // Gpu process, instead get the mojo pointer from the Gpu process. |
| 104 | frame_sink_manager = |
| 105 | base::MakeUnique<viz::MojoFrameSinkManager>(false, nullptr); |
Fady Samuel | 279f5f0 | 2017-06-14 23:23:00 | [diff] [blame] | 106 | surface_utils::ConnectWithInProcessFrameSinkManager( |
danakj | aee6717 | 2017-06-13 16:37:02 | [diff] [blame] | 107 | &frame_sink_manager_host, frame_sink_manager.get()); |
kylechar | bfc507f | 2017-04-26 00:13:08 | [diff] [blame] | 108 | } |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 109 | |
| 110 | SingleThreadTaskGraphRunner task_graph_runner; |
kylechar | cb5882d | 2017-06-05 13:41:34 | [diff] [blame] | 111 | viz::FrameSinkManagerHost frame_sink_manager_host; |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 112 | cc::FrameSinkIdAllocator frame_sink_id_allocator; |
danakj | aee6717 | 2017-06-13 16:37:02 | [diff] [blame] | 113 | // This is owned here so that SurfaceManager will be accessible in process |
| 114 | // when display is in the same process. Other than using SurfaceManager, |
| 115 | // access to |in_process_frame_sink_manager_| should happen via |
| 116 | // |frame_sink_manager_host_| instead which uses Mojo. See |
| 117 | // http://crbug.com/657959. |
| 118 | std::unique_ptr<viz::MojoFrameSinkManager> frame_sink_manager; |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 119 | |
qyearsley | db0a3487 | 2017-03-14 03:24:31 | [diff] [blame] | 120 | #if BUILDFLAG(ENABLE_VULKAN) |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 121 | scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider; |
| 122 | #endif |
| 123 | }; |
| 124 | |
scottmg | 5e65e3a | 2017-03-08 08:48:46 | [diff] [blame] | 125 | base::LazyInstance<CompositorDependencies>::DestructorAtExit |
| 126 | g_compositor_dependencies = LAZY_INSTANCE_INITIALIZER; |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 127 | |
brianderson | ebd2c9a | 2015-10-01 17:40:13 | [diff] [blame] | 128 | const unsigned int kMaxDisplaySwapBuffers = 1U; |
sievers@chromium.org | 41256cd | 2014-05-27 22:45:34 | [diff] [blame] | 129 | |
qyearsley | db0a3487 | 2017-03-14 03:24:31 | [diff] [blame] | 130 | #if BUILDFLAG(ENABLE_VULKAN) |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 131 | scoped_refptr<cc::VulkanContextProvider> GetSharedVulkanContextProvider() { |
| 132 | if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 133 | switches::kEnableVulkan)) { |
| 134 | scoped_refptr<cc::VulkanContextProvider> context_provider = |
| 135 | g_compositor_dependencies.Get().vulkan_context_provider; |
| 136 | if (!*context_provider) |
| 137 | *context_provider = cc::VulkanInProcessContextProvider::Create(); |
| 138 | return *context_provider; |
| 139 | } |
| 140 | return nullptr; |
| 141 | } |
| 142 | #endif |
| 143 | |
boliu | 4868d41 | 2017-01-10 19:13:05 | [diff] [blame] | 144 | gpu::SharedMemoryLimits GetCompositorContextSharedMemoryLimits( |
| 145 | gfx::NativeWindow window) { |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 146 | constexpr size_t kBytesPerPixel = 4; |
boliu | 4868d41 | 2017-01-10 19:13:05 | [diff] [blame] | 147 | const gfx::Size size = display::Screen::GetScreen() |
| 148 | ->GetDisplayNearestWindow(window) |
| 149 | .GetSizeInPixel(); |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 150 | const size_t full_screen_texture_size_in_bytes = |
boliu | 4868d41 | 2017-01-10 19:13:05 | [diff] [blame] | 151 | size.width() * size.height() * kBytesPerPixel; |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 152 | |
| 153 | gpu::SharedMemoryLimits limits; |
| 154 | // This limit is meant to hold the contents of the display compositor |
| 155 | // drawing the scene. See discussion here: |
| 156 | // https://codereview.chromium.org/1900993002/diff/90001/content/browser/renderer_host/compositor_impl_android.cc?context=3&column_width=80&tab_spaces=8 |
| 157 | limits.command_buffer_size = 64 * 1024; |
| 158 | // These limits are meant to hold the uploads for the browser UI without |
| 159 | // any excess space. |
| 160 | limits.start_transfer_buffer_size = 64 * 1024; |
| 161 | limits.min_transfer_buffer_size = 64 * 1024; |
| 162 | limits.max_transfer_buffer_size = full_screen_texture_size_in_bytes; |
| 163 | // Texture uploads may use mapped memory so give a reasonable limit for |
| 164 | // them. |
| 165 | limits.mapped_memory_reclaim_limit = full_screen_texture_size_in_bytes; |
| 166 | |
| 167 | return limits; |
| 168 | } |
| 169 | |
| 170 | gpu::gles2::ContextCreationAttribHelper GetCompositorContextAttributes( |
| 171 | bool has_transparent_background) { |
| 172 | // This is used for the browser compositor (offscreen) and for the display |
| 173 | // compositor (onscreen), so ask for capabilities needed by either one. |
| 174 | // The default framebuffer for an offscreen context is not used, so it does |
| 175 | // not need alpha, stencil, depth, antialiasing. The display compositor does |
| 176 | // not use these things either, except for alpha when it has a transparent |
| 177 | // background. |
| 178 | gpu::gles2::ContextCreationAttribHelper attributes; |
| 179 | attributes.alpha_size = -1; |
| 180 | attributes.stencil_size = 0; |
| 181 | attributes.depth_size = 0; |
| 182 | attributes.samples = 0; |
| 183 | attributes.sample_buffers = 0; |
| 184 | attributes.bind_generates_resource = false; |
| 185 | |
| 186 | if (has_transparent_background) { |
| 187 | attributes.alpha_size = 8; |
aelias | e678aa4 | 2017-04-14 22:41:04 | [diff] [blame] | 188 | } else if (base::SysInfo::AmountOfPhysicalMemoryMB() <= 512) { |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 189 | // In this case we prefer to use RGB565 format instead of RGBA8888 if |
| 190 | // possible. |
| 191 | // TODO(danakj): GpuCommandBufferStub constructor checks for alpha == 0 in |
| 192 | // order to enable 565, but it should avoid using 565 when -1s are |
| 193 | // specified |
| 194 | // (IOW check that a <= 0 && rgb > 0 && rgb <= 565) then alpha should be |
| 195 | // -1. |
liberato | 3fbc8b7 | 2017-03-21 18:38:18 | [diff] [blame] | 196 | // TODO(liberato): This condition is memorized in ComositorView.java, to |
| 197 | // avoid using two surfaces temporarily during alpha <-> no alpha |
| 198 | // transitions. If these mismatch, then we risk a power regression if the |
| 199 | // SurfaceView is not marked as eOpaque (FORMAT_OPAQUE), and we have an |
| 200 | // EGL surface with an alpha channel. SurfaceFlinger needs at least one of |
| 201 | // those hints to optimize out alpha blending. |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 202 | attributes.alpha_size = 0; |
| 203 | attributes.red_size = 5; |
| 204 | attributes.green_size = 6; |
| 205 | attributes.blue_size = 5; |
| 206 | } |
| 207 | |
| 208 | return attributes; |
| 209 | } |
| 210 | |
khushalsagar | 003796ca | 2017-03-08 01:28:29 | [diff] [blame] | 211 | void CreateContextProviderAfterGpuChannelEstablished( |
| 212 | gpu::SurfaceHandle handle, |
| 213 | gpu::gles2::ContextCreationAttribHelper attributes, |
| 214 | gpu::SharedMemoryLimits shared_memory_limits, |
| 215 | Compositor::ContextProviderCallback callback, |
| 216 | scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) { |
| 217 | if (!gpu_channel_host) |
| 218 | callback.Run(nullptr); |
| 219 | |
sunnyps | 8f9139e | 2017-05-12 17:53:25 | [diff] [blame] | 220 | int32_t stream_id = kGpuStreamIdDefault; |
| 221 | gpu::SchedulingPriority stream_priority = kGpuStreamPriorityUI; |
| 222 | |
khushalsagar | 003796ca | 2017-03-08 01:28:29 | [diff] [blame] | 223 | constexpr bool automatic_flushes = false; |
| 224 | constexpr bool support_locking = false; |
sunnyps | 8f9139e | 2017-05-12 17:53:25 | [diff] [blame] | 225 | |
khushalsagar | 003796ca | 2017-03-08 01:28:29 | [diff] [blame] | 226 | scoped_refptr<ui::ContextProviderCommandBuffer> context_provider = |
| 227 | new ui::ContextProviderCommandBuffer( |
sunnyps | 8f9139e | 2017-05-12 17:53:25 | [diff] [blame] | 228 | std::move(gpu_channel_host), stream_id, stream_priority, handle, |
khushalsagar | 003796ca | 2017-03-08 01:28:29 | [diff] [blame] | 229 | GURL(std::string("chrome://gpu/Compositor::CreateContextProvider")), |
| 230 | automatic_flushes, support_locking, shared_memory_limits, attributes, |
| 231 | nullptr /* shared_context */, |
| 232 | ui::command_buffer_metrics::CONTEXT_TYPE_UNKNOWN); |
| 233 | callback.Run(std::move(context_provider)); |
| 234 | } |
| 235 | |
danakj | 1120f4c | 2016-09-15 02:05:32 | [diff] [blame] | 236 | class AndroidOutputSurface : public cc::OutputSurface { |
brianderson@chromium.org | df3c24c | 2013-06-19 03:54:35 | [diff] [blame] | 237 | public: |
boliu | e07c48a | 2017-03-10 05:46:51 | [diff] [blame] | 238 | AndroidOutputSurface( |
| 239 | scoped_refptr<ui::ContextProviderCommandBuffer> context_provider, |
| 240 | base::Closure swap_buffers_callback) |
danakj | e41d978a | 2016-09-19 21:09:28 | [diff] [blame] | 241 | : cc::OutputSurface(std::move(context_provider)), |
boliu | e07c48a | 2017-03-10 05:46:51 | [diff] [blame] | 242 | swap_buffers_callback_(std::move(swap_buffers_callback)), |
watk | b9c0f2fe | 2015-11-25 00:44:54 | [diff] [blame] | 243 | overlay_candidate_validator_( |
xing.xu | e334e56 | 2017-05-17 19:08:10 | [diff] [blame] | 244 | new viz::CompositorOverlayCandidateValidatorAndroid()), |
danakj | 94486a4 | 2016-10-25 22:31:12 | [diff] [blame] | 245 | weak_ptr_factory_(this) { |
brianderson | ebd2c9a | 2015-10-01 17:40:13 | [diff] [blame] | 246 | capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; |
brianderson@chromium.org | df3c24c | 2013-06-19 03:54:35 | [diff] [blame] | 247 | } |
feng@chromium.org | dbafd6c | 2013-07-12 03:30:33 | [diff] [blame] | 248 | |
danakj | 1120f4c | 2016-09-15 02:05:32 | [diff] [blame] | 249 | ~AndroidOutputSurface() override = default; |
jbauman | 9ebeafa | 2015-07-28 22:46:51 | [diff] [blame] | 250 | |
kylechar | 5344b39e | 2016-10-06 23:51:19 | [diff] [blame] | 251 | void SwapBuffers(cc::OutputSurfaceFrame frame) override { |
mfomitchev | 598a769 | 2017-04-11 00:30:31 | [diff] [blame] | 252 | GetCommandBufferProxy()->AddLatencyInfo(frame.latency_info); |
halliwell | 55723a7 | 2017-02-22 22:24:03 | [diff] [blame] | 253 | if (frame.sub_buffer_rect) { |
| 254 | DCHECK(frame.sub_buffer_rect->IsEmpty()); |
watk | c7589a8d | 2015-12-04 03:48:59 | [diff] [blame] | 255 | context_provider_->ContextSupport()->CommitOverlayPlanes(); |
| 256 | } else { |
watk | c7589a8d | 2015-12-04 03:48:59 | [diff] [blame] | 257 | context_provider_->ContextSupport()->Swap(); |
| 258 | } |
feng@chromium.org | dbafd6c | 2013-07-12 03:30:33 | [diff] [blame] | 259 | } |
aelias | d880a3d | 2014-08-26 00:46:20 | [diff] [blame] | 260 | |
danakj | 94486a4 | 2016-10-25 22:31:12 | [diff] [blame] | 261 | void BindToClient(cc::OutputSurfaceClient* client) override { |
| 262 | DCHECK(client); |
| 263 | DCHECK(!client_); |
| 264 | client_ = client; |
sievers | df212b3 | 2014-10-09 20:40:14 | [diff] [blame] | 265 | GetCommandBufferProxy()->SetSwapBuffersCompletionCallback( |
danakj | 94486a4 | 2016-10-25 22:31:12 | [diff] [blame] | 266 | base::Bind(&AndroidOutputSurface::OnSwapBuffersCompleted, |
| 267 | weak_ptr_factory_.GetWeakPtr())); |
aelias | d880a3d | 2014-08-26 00:46:20 | [diff] [blame] | 268 | } |
| 269 | |
danakj | 1c77b83 | 2016-09-26 21:26:09 | [diff] [blame] | 270 | void EnsureBackbuffer() override {} |
| 271 | |
| 272 | void DiscardBackbuffer() override { |
| 273 | context_provider()->ContextGL()->DiscardBackbufferCHROMIUM(); |
| 274 | } |
| 275 | |
| 276 | void BindFramebuffer() override { |
| 277 | context_provider()->ContextGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); |
| 278 | } |
| 279 | |
jbauman | 2a2ad22 | 2017-03-02 00:35:13 | [diff] [blame] | 280 | void SetDrawRectangle(const gfx::Rect& rect) override {} |
| 281 | |
danakj | 70ffc43c | 2016-10-10 21:47:30 | [diff] [blame] | 282 | void Reshape(const gfx::Size& size, |
| 283 | float device_scale_factor, |
| 284 | const gfx::ColorSpace& color_space, |
reveman | 9413cff | 2017-01-18 03:05:48 | [diff] [blame] | 285 | bool has_alpha, |
| 286 | bool use_stencil) override { |
danakj | 70ffc43c | 2016-10-10 21:47:30 | [diff] [blame] | 287 | context_provider()->ContextGL()->ResizeCHROMIUM( |
| 288 | size.width(), size.height(), device_scale_factor, has_alpha); |
| 289 | } |
| 290 | |
watk | b9c0f2fe | 2015-11-25 00:44:54 | [diff] [blame] | 291 | cc::OverlayCandidateValidator* GetOverlayCandidateValidator() const override { |
| 292 | return overlay_candidate_validator_.get(); |
| 293 | } |
| 294 | |
danakj | 1c77b83 | 2016-09-26 21:26:09 | [diff] [blame] | 295 | bool IsDisplayedAsOverlayPlane() const override { return false; } |
| 296 | unsigned GetOverlayTextureId() const override { return 0; } |
| 297 | bool SurfaceIsSuspendForRecycle() const override { return false; } |
| 298 | bool HasExternalStencilTest() const override { return false; } |
| 299 | void ApplyExternalStencil() override {} |
| 300 | |
danakj | a85bd24 | 2016-06-22 22:25:49 | [diff] [blame] | 301 | uint32_t GetFramebufferCopyTextureFormat() override { |
sadrul | 85cc5d8 | 2016-12-20 03:37:41 | [diff] [blame] | 302 | auto* gl = |
| 303 | static_cast<ui::ContextProviderCommandBuffer*>(context_provider()); |
danakj | a85bd24 | 2016-06-22 22:25:49 | [diff] [blame] | 304 | return gl->GetCopyTextureInternalFormat(); |
| 305 | } |
| 306 | |
sievers | df212b3 | 2014-10-09 20:40:14 | [diff] [blame] | 307 | private: |
penghuang | 346a46f9 | 2016-03-31 21:37:52 | [diff] [blame] | 308 | gpu::CommandBufferProxyImpl* GetCommandBufferProxy() { |
sadrul | 85cc5d8 | 2016-12-20 03:37:41 | [diff] [blame] | 309 | ui::ContextProviderCommandBuffer* provider_command_buffer = |
| 310 | static_cast<ui::ContextProviderCommandBuffer*>(context_provider_.get()); |
penghuang | 346a46f9 | 2016-03-31 21:37:52 | [diff] [blame] | 311 | gpu::CommandBufferProxyImpl* command_buffer_proxy = |
sievers | df212b3 | 2014-10-09 20:40:14 | [diff] [blame] | 312 | provider_command_buffer->GetCommandBufferProxy(); |
| 313 | DCHECK(command_buffer_proxy); |
| 314 | return command_buffer_proxy; |
| 315 | } |
| 316 | |
ccameron | 43320425 | 2016-05-09 20:57:55 | [diff] [blame] | 317 | void OnSwapBuffersCompleted( |
| 318 | const std::vector<ui::LatencyInfo>& latency_info, |
| 319 | gfx::SwapResult result, |
| 320 | const gpu::GpuProcessHostedCALayerTreeParamsMac* params_mac) { |
mfomitchev | 60addc8d | 2017-04-04 17:14:55 | [diff] [blame] | 321 | RenderWidgetHostImpl::OnGpuSwapBuffersCompleted(latency_info); |
danakj | 440bc68 | 2016-10-14 19:56:48 | [diff] [blame] | 322 | client_->DidReceiveSwapBuffersAck(); |
boliu | e07c48a | 2017-03-10 05:46:51 | [diff] [blame] | 323 | swap_buffers_callback_.Run(); |
sievers | df212b3 | 2014-10-09 20:40:14 | [diff] [blame] | 324 | } |
| 325 | |
enne | 19c10858 | 2016-04-14 03:35:32 | [diff] [blame] | 326 | private: |
danakj | 94486a4 | 2016-10-25 22:31:12 | [diff] [blame] | 327 | cc::OutputSurfaceClient* client_ = nullptr; |
boliu | e07c48a | 2017-03-10 05:46:51 | [diff] [blame] | 328 | base::Closure swap_buffers_callback_; |
dcheng | 92ae141 | 2016-04-09 02:52:24 | [diff] [blame] | 329 | std::unique_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_; |
danakj | 94486a4 | 2016-10-25 22:31:12 | [diff] [blame] | 330 | base::WeakPtrFactory<AndroidOutputSurface> weak_ptr_factory_; |
sievers | 48c068d | 2016-01-06 00:14:43 | [diff] [blame] | 331 | }; |
| 332 | |
qyearsley | db0a3487 | 2017-03-14 03:24:31 | [diff] [blame] | 333 | #if BUILDFLAG(ENABLE_VULKAN) |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 334 | class VulkanOutputSurface : public cc::OutputSurface { |
| 335 | public: |
danakj | 8eb035c0 | 2016-06-17 22:41:32 | [diff] [blame] | 336 | explicit VulkanOutputSurface( |
danakj | daad1d1 | 2016-10-11 00:00:34 | [diff] [blame] | 337 | scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, |
| 338 | scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
| 339 | : OutputSurface(std::move(vulkan_context_provider)), |
| 340 | task_runner_(std::move(task_runner)), |
| 341 | weak_ptr_factory_(this) {} |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 342 | |
| 343 | ~VulkanOutputSurface() override { Destroy(); } |
| 344 | |
| 345 | bool Initialize(gfx::AcceleratedWidget widget) { |
| 346 | DCHECK(!surface_); |
| 347 | std::unique_ptr<gpu::VulkanSurface> surface( |
| 348 | gpu::VulkanSurface::CreateViewSurface(widget)); |
| 349 | if (!surface->Initialize(vulkan_context_provider()->GetDeviceQueue(), |
| 350 | gpu::VulkanSurface::DEFAULT_SURFACE_FORMAT)) { |
| 351 | return false; |
| 352 | } |
| 353 | surface_ = std::move(surface); |
| 354 | |
| 355 | return true; |
| 356 | } |
| 357 | |
sohan.jyoti | 13587c6 | 2016-05-13 01:33:15 | [diff] [blame] | 358 | bool BindToClient(cc::OutputSurfaceClient* client) override { |
| 359 | if (!OutputSurface::BindToClient(client)) |
| 360 | return false; |
sohan.jyoti | 13587c6 | 2016-05-13 01:33:15 | [diff] [blame] | 361 | return true; |
| 362 | } |
| 363 | |
fsamuel | d63137a | 2016-06-24 23:39:51 | [diff] [blame] | 364 | void SwapBuffers(cc::CompositorFrame frame) override { |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 365 | surface_->SwapBuffers(); |
danakj | daad1d1 | 2016-10-11 00:00:34 | [diff] [blame] | 366 | task_runner_->PostTask(FROM_HERE, |
danakj | 440bc68 | 2016-10-14 19:56:48 | [diff] [blame] | 367 | base::Bind(&VulkanOutputSurface::SwapBuffersAck, |
danakj | daad1d1 | 2016-10-11 00:00:34 | [diff] [blame] | 368 | weak_ptr_factory_.GetWeakPtr())); |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 369 | } |
| 370 | |
| 371 | void Destroy() { |
| 372 | if (surface_) { |
| 373 | surface_->Destroy(); |
| 374 | surface_.reset(); |
| 375 | } |
| 376 | } |
| 377 | |
danakj | daad1d1 | 2016-10-11 00:00:34 | [diff] [blame] | 378 | private: |
danakj | 440bc68 | 2016-10-14 19:56:48 | [diff] [blame] | 379 | void SwapBuffersAck() { client_->DidReceiveSwapBuffersAck(); } |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 380 | |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 381 | std::unique_ptr<gpu::VulkanSurface> surface_; |
danakj | daad1d1 | 2016-10-11 00:00:34 | [diff] [blame] | 382 | scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| 383 | base::WeakPtrFactory<VulkanOutputSurface> weak_ptr_factory_; |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 384 | |
| 385 | DISALLOW_COPY_AND_ASSIGN(VulkanOutputSurface); |
| 386 | }; |
| 387 | #endif |
| 388 | |
sievers@chromium.org | fd7a857 | 2012-09-18 19:32:05 | [diff] [blame] | 389 | static bool g_initialized = false; |
| 390 | |
ericrk | 4e3aa5a | 2015-12-01 03:53:56 | [diff] [blame] | 391 | } // anonymous namespace |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 392 | |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 393 | // static |
powei@chromium.org | aca40ac | 2013-11-21 21:35:28 | [diff] [blame] | 394 | Compositor* Compositor::Create(CompositorClient* client, |
| 395 | gfx::NativeWindow root_window) { |
| 396 | return client ? new CompositorImpl(client, root_window) : NULL; |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 397 | } |
| 398 | |
| 399 | // static |
| 400 | void Compositor::Initialize() { |
sievers@chromium.org | d32353f | 2012-11-16 23:49:32 | [diff] [blame] | 401 | DCHECK(!CompositorImpl::IsInitialized()); |
sievers@chromium.org | fd7a857 | 2012-09-18 19:32:05 | [diff] [blame] | 402 | g_initialized = true; |
aelias@chromium.org | 8f3ffdc6 | 2012-11-15 05:28:26 | [diff] [blame] | 403 | } |
| 404 | |
| 405 | // static |
khushalsagar | 003796ca | 2017-03-08 01:28:29 | [diff] [blame] | 406 | void Compositor::CreateContextProvider( |
| 407 | gpu::SurfaceHandle handle, |
| 408 | gpu::gles2::ContextCreationAttribHelper attributes, |
| 409 | gpu::SharedMemoryLimits shared_memory_limits, |
| 410 | ContextProviderCallback callback) { |
| 411 | BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel( |
| 412 | base::Bind(&CreateContextProviderAfterGpuChannelEstablished, handle, |
| 413 | attributes, shared_memory_limits, callback)); |
| 414 | } |
| 415 | |
| 416 | // static |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 417 | cc::SurfaceManager* CompositorImpl::GetSurfaceManager() { |
danakj | aee6717 | 2017-06-13 16:37:02 | [diff] [blame] | 418 | return g_compositor_dependencies.Get().frame_sink_manager->surface_manager(); |
kylechar | 69bd916 | 2017-04-10 23:45:48 | [diff] [blame] | 419 | } |
| 420 | |
| 421 | // static |
kylechar | cb5882d | 2017-06-05 13:41:34 | [diff] [blame] | 422 | viz::FrameSinkManagerHost* CompositorImpl::GetFrameSinkManagerHost() { |
kylechar | 69bd916 | 2017-04-10 23:45:48 | [diff] [blame] | 423 | return &g_compositor_dependencies.Get().frame_sink_manager_host; |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 424 | } |
| 425 | |
| 426 | // static |
| 427 | cc::FrameSinkId CompositorImpl::AllocateFrameSinkId() { |
| 428 | return g_compositor_dependencies.Get() |
| 429 | .frame_sink_id_allocator.NextFrameSinkId(); |
| 430 | } |
| 431 | |
| 432 | // static |
sievers@chromium.org | fd7a857 | 2012-09-18 19:32:05 | [diff] [blame] | 433 | bool CompositorImpl::IsInitialized() { |
| 434 | return g_initialized; |
| 435 | } |
| 436 | |
powei@chromium.org | aca40ac | 2013-11-21 21:35:28 | [diff] [blame] | 437 | CompositorImpl::CompositorImpl(CompositorClient* client, |
| 438 | gfx::NativeWindow root_window) |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 439 | : frame_sink_id_(AllocateFrameSinkId()), |
enne | 131f1db | 2016-04-18 19:32:51 | [diff] [blame] | 440 | resource_manager_(root_window), |
leandrogracia@chromium.org | d9c747af | 2012-12-03 14:54:35 | [diff] [blame] | 441 | window_(NULL), |
piman | a333e3d | 2016-04-27 02:37:25 | [diff] [blame] | 442 | surface_handle_(gpu::kNullSurfaceHandle), |
powei@chromium.org | aca40ac | 2013-11-21 21:35:28 | [diff] [blame] | 443 | client_(client), |
sievers@chromium.org | 5aba5bc | 2014-05-13 22:40:59 | [diff] [blame] | 444 | root_window_(root_window), |
sievers@chromium.org | 41256cd | 2014-05-27 22:45:34 | [diff] [blame] | 445 | needs_animate_(false), |
boliu | ba83590 | 2017-02-28 04:10:15 | [diff] [blame] | 446 | pending_frames_(0U), |
sievers | bce21923 | 2015-02-09 21:01:49 | [diff] [blame] | 447 | num_successive_context_creation_failures_(0), |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 448 | layer_tree_frame_sink_request_pending_(false), |
sievers@chromium.org | aee59bb | 2014-05-31 04:58:45 | [diff] [blame] | 449 | weak_factory_(this) { |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 450 | GetSurfaceManager()->RegisterFrameSinkId(frame_sink_id_); |
sievers@chromium.org | 24a65cc | 2012-10-15 17:53:46 | [diff] [blame] | 451 | DCHECK(client); |
powei@chromium.org | aca40ac | 2013-11-21 21:35:28 | [diff] [blame] | 452 | DCHECK(root_window); |
sievers | 481b7fe | 2016-07-21 17:03:59 | [diff] [blame] | 453 | DCHECK(root_window->GetLayer() == nullptr); |
| 454 | root_window->SetLayer(cc::Layer::Create()); |
sievers | 962aa721 | 2016-08-12 18:26:14 | [diff] [blame] | 455 | readback_layer_tree_ = cc::Layer::Create(); |
| 456 | readback_layer_tree_->SetHideLayerAndSubtree(true); |
| 457 | root_window->GetLayer()->AddChild(readback_layer_tree_); |
powei@chromium.org | 0809f7e2 | 2014-03-20 00:05:45 | [diff] [blame] | 458 | root_window->AttachCompositor(this); |
sievers | 148fedf | 2015-10-02 00:12:04 | [diff] [blame] | 459 | CreateLayerTreeHost(); |
khushalsagar | 8ec0740 | 2016-09-10 03:13:19 | [diff] [blame] | 460 | resource_manager_.Init(host_->GetUIResourceManager()); |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 461 | } |
| 462 | |
| 463 | CompositorImpl::~CompositorImpl() { |
powei@chromium.org | aca40ac | 2013-11-21 21:35:28 | [diff] [blame] | 464 | root_window_->DetachCompositor(); |
sievers | 481b7fe | 2016-07-21 17:03:59 | [diff] [blame] | 465 | root_window_->SetLayer(nullptr); |
epenner@chromium.org | 822f0c44 | 2013-04-18 05:03:07 | [diff] [blame] | 466 | // Clean-up any surface references. |
| 467 | SetSurface(NULL); |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 468 | GetSurfaceManager()->InvalidateFrameSinkId(frame_sink_id_); |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 469 | } |
| 470 | |
wjmaclean | a755e30 | 2017-04-20 00:43:16 | [diff] [blame] | 471 | bool CompositorImpl::IsForSubframe() { |
| 472 | return false; |
| 473 | } |
| 474 | |
jaekyun | f229b81 | 2014-12-11 02:49:10 | [diff] [blame] | 475 | ui::UIResourceProvider& CompositorImpl::GetUIResourceProvider() { |
sievers | 148fedf | 2015-10-02 00:12:04 | [diff] [blame] | 476 | return *this; |
powei@chromium.org | 4825cbf | 2014-06-13 07:15:45 | [diff] [blame] | 477 | } |
| 478 | |
jaekyun | d5de7e4 | 2014-12-04 16:19:13 | [diff] [blame] | 479 | ui::ResourceManager& CompositorImpl::GetResourceManager() { |
| 480 | return resource_manager_; |
| 481 | } |
| 482 | |
leandrogracia@chromium.org | d9c747af | 2012-12-03 14:54:35 | [diff] [blame] | 483 | void CompositorImpl::SetRootLayer(scoped_refptr<cc::Layer> root_layer) { |
dcheng | 165763c | 2014-10-07 04:14:54 | [diff] [blame] | 484 | if (subroot_layer_.get()) { |
aelias@chromium.org | 25950ad | 2014-07-18 18:30:01 | [diff] [blame] | 485 | subroot_layer_->RemoveFromParent(); |
| 486 | subroot_layer_ = NULL; |
| 487 | } |
sievers | 481b7fe | 2016-07-21 17:03:59 | [diff] [blame] | 488 | if (root_window_->GetLayer()) { |
| 489 | subroot_layer_ = root_window_->GetLayer(); |
| 490 | root_window_->GetLayer()->AddChild(root_layer); |
aelias@chromium.org | 25950ad | 2014-07-18 18:30:01 | [diff] [blame] | 491 | } |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 492 | } |
| 493 | |
sievers | e018d323c | 2015-10-15 20:41:20 | [diff] [blame] | 494 | void CompositorImpl::SetSurface(jobject surface) { |
| 495 | JNIEnv* env = base::android::AttachCurrentThread(); |
jcivelli | c9a96403 | 2016-10-17 18:22:20 | [diff] [blame] | 496 | gpu::GpuSurfaceTracker* tracker = gpu::GpuSurfaceTracker::Get(); |
sievers@chromium.org | fd7a857 | 2012-09-18 19:32:05 | [diff] [blame] | 497 | |
| 498 | if (window_) { |
sievers | e8d881d | 2015-08-06 20:01:35 | [diff] [blame] | 499 | // Shut down GL context before unregistering surface. |
| 500 | SetVisible(false); |
piman | a333e3d | 2016-04-27 02:37:25 | [diff] [blame] | 501 | tracker->RemoveSurface(surface_handle_); |
sievers@chromium.org | fd7a857 | 2012-09-18 19:32:05 | [diff] [blame] | 502 | ANativeWindow_release(window_); |
| 503 | window_ = NULL; |
piman | a333e3d | 2016-04-27 02:37:25 | [diff] [blame] | 504 | surface_handle_ = gpu::kNullSurfaceHandle; |
sievers@chromium.org | fd7a857 | 2012-09-18 19:32:05 | [diff] [blame] | 505 | } |
| 506 | |
sievers | e018d323c | 2015-10-15 20:41:20 | [diff] [blame] | 507 | ANativeWindow* window = NULL; |
| 508 | if (surface) { |
| 509 | // Note: This ensures that any local references used by |
| 510 | // ANativeWindow_fromSurface are released immediately. This is needed as a |
| 511 | // workaround for https://code.google.com/p/android/issues/detail?id=68174 |
| 512 | base::android::ScopedJavaLocalFrame scoped_local_reference_frame(env); |
| 513 | window = ANativeWindow_fromSurface(env, surface); |
| 514 | } |
| 515 | |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 516 | if (window) { |
sievers@chromium.org | fd7a857 | 2012-09-18 19:32:05 | [diff] [blame] | 517 | window_ = window; |
| 518 | ANativeWindow_acquire(window); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 519 | // Register first, SetVisible() might create a LayerTreeFrameSink. |
liberato | d90f48c | 2017-05-01 23:44:50 | [diff] [blame] | 520 | surface_handle_ = tracker->AddSurfaceForNativeWidget( |
| 521 | gpu::GpuSurfaceTracker::SurfaceRecord(window, surface)); |
sievers | e018d323c | 2015-10-15 20:41:20 | [diff] [blame] | 522 | SetVisible(true); |
| 523 | ANativeWindow_release(window); |
sievers@chromium.org | ccf558a | 2013-03-07 03:58:18 | [diff] [blame] | 524 | } |
| 525 | } |
| 526 | |
auygun | b2101b6 | 2014-12-08 10:46:23 | [diff] [blame] | 527 | void CompositorImpl::CreateLayerTreeHost() { |
| 528 | DCHECK(!host_); |
sievers | 148fedf | 2015-10-02 00:12:04 | [diff] [blame] | 529 | |
auygun | b2101b6 | 2014-12-08 10:46:23 | [diff] [blame] | 530 | cc::LayerTreeSettings settings; |
Bo Liu | 5364de18 | 2015-05-21 03:48:29 | [diff] [blame] | 531 | settings.use_zero_copy = true; |
auygun | b2101b6 | 2014-12-08 10:46:23 | [diff] [blame] | 532 | |
| 533 | base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
| 534 | settings.initial_debug_state.SetRecordRenderingStats( |
| 535 | command_line->HasSwitch(cc::switches::kEnableGpuBenchmarking)); |
dongseong.hwang | e095dfa | 2016-02-04 11:21:39 | [diff] [blame] | 536 | settings.initial_debug_state.show_fps_counter = |
| 537 | command_line->HasSwitch(cc::switches::kUIShowFPSCounter); |
sievers | 48c068d | 2016-01-06 00:14:43 | [diff] [blame] | 538 | settings.single_thread_proxy_scheduler = true; |
auygun | b2101b6 | 2014-12-08 10:46:23 | [diff] [blame] | 539 | |
loyso | 2cb3f32f | 2016-11-08 07:08:34 | [diff] [blame] | 540 | animation_host_ = cc::AnimationHost::CreateMainInstance(); |
| 541 | |
khushalsagar | e0e4486e | 2017-01-25 03:15:03 | [diff] [blame] | 542 | cc::LayerTreeHost::InitParams params; |
sadrul | 6780f3da | 2015-05-11 17:01:52 | [diff] [blame] | 543 | params.client = this; |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 544 | params.task_graph_runner = &g_compositor_dependencies.Get().task_graph_runner; |
sadrul | 6780f3da | 2015-05-11 17:01:52 | [diff] [blame] | 545 | params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); |
| 546 | params.settings = &settings; |
loyso | 2cb3f32f | 2016-11-08 07:08:34 | [diff] [blame] | 547 | params.mutator_host = animation_host_.get(); |
khushalsagar | e0e4486e | 2017-01-25 03:15:03 | [diff] [blame] | 548 | host_ = cc::LayerTreeHost::CreateSingleThreaded(this, ¶ms); |
khushalsagar | cebe494 | 2016-09-07 23:27:01 | [diff] [blame] | 549 | DCHECK(!host_->IsVisible()); |
khushalsagar | b69ba945 | 2017-01-27 22:20:07 | [diff] [blame] | 550 | host_->SetRootLayer(root_window_->GetLayer()); |
fsamuel | b6acafa | 2016-10-04 03:21:52 | [diff] [blame] | 551 | host_->SetFrameSinkId(frame_sink_id_); |
khushalsagar | b69ba945 | 2017-01-27 22:20:07 | [diff] [blame] | 552 | host_->SetViewportSize(size_); |
jinsukkim | d4b3f4e4 | 2016-11-23 02:10:13 | [diff] [blame] | 553 | SetHasTransparentBackground(false); |
khushalsagar | b69ba945 | 2017-01-27 22:20:07 | [diff] [blame] | 554 | host_->SetDeviceScaleFactor(1); |
jdduke | 1711257 | 2014-12-10 23:02:59 | [diff] [blame] | 555 | |
| 556 | if (needs_animate_) |
| 557 | host_->SetNeedsAnimate(); |
auygun | b2101b6 | 2014-12-08 10:46:23 | [diff] [blame] | 558 | } |
| 559 | |
sievers@chromium.org | d32353f | 2012-11-16 23:49:32 | [diff] [blame] | 560 | void CompositorImpl::SetVisible(bool visible) { |
jdduke | 76f3477 | 2015-03-26 03:44:53 | [diff] [blame] | 561 | TRACE_EVENT1("cc", "CompositorImpl::SetVisible", "visible", visible); |
sievers@chromium.org | d32353f | 2012-11-16 23:49:32 | [diff] [blame] | 562 | if (!visible) { |
khushalsagar | cebe494 | 2016-09-07 23:27:01 | [diff] [blame] | 563 | DCHECK(host_->IsVisible()); |
sievers | 962aa721 | 2016-08-12 18:26:14 | [diff] [blame] | 564 | |
| 565 | // Make a best effort to try to complete pending readbacks. |
| 566 | // TODO(crbug.com/637035): Consider doing this in a better way, |
| 567 | // ideally with the guarantee of readbacks completing. |
| 568 | if (display_.get() && HavePendingReadbacks()) |
| 569 | display_->ForceImmediateDrawAndSwapIfPossible(); |
| 570 | |
sievers | 148fedf | 2015-10-02 00:12:04 | [diff] [blame] | 571 | host_->SetVisible(false); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 572 | host_->ReleaseLayerTreeFrameSink(); |
| 573 | has_layer_tree_frame_sink_ = false; |
boliu | ba83590 | 2017-02-28 04:10:15 | [diff] [blame] | 574 | pending_frames_ = 0; |
Alex Zhang | d3b9d65 | 2017-06-09 18:48:55 | [diff] [blame] | 575 | if (display_) { |
| 576 | GetSurfaceManager()->UnregisterBeginFrameSource( |
| 577 | root_window_->GetBeginFrameSource()); |
| 578 | } |
danakj | 324faea | 2016-06-11 01:39:31 | [diff] [blame] | 579 | display_.reset(); |
sievers | 148fedf | 2015-10-02 00:12:04 | [diff] [blame] | 580 | } else { |
| 581 | host_->SetVisible(true); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 582 | if (layer_tree_frame_sink_request_pending_) |
| 583 | HandlePendingLayerTreeFrameSinkRequest(); |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 584 | } |
| 585 | } |
| 586 | |
| 587 | void CompositorImpl::SetWindowBounds(const gfx::Size& size) { |
| 588 | if (size_ == size) |
| 589 | return; |
| 590 | |
| 591 | size_ = size; |
joth@chromium.org | 1972848 | 2012-11-20 03:39:01 | [diff] [blame] | 592 | if (host_) |
khushalsagar | b69ba945 | 2017-01-27 22:20:07 | [diff] [blame] | 593 | host_->SetViewportSize(size); |
danakj | 324faea | 2016-06-11 01:39:31 | [diff] [blame] | 594 | if (display_) |
| 595 | display_->Resize(size); |
sievers | 481b7fe | 2016-07-21 17:03:59 | [diff] [blame] | 596 | root_window_->GetLayer()->SetBounds(size); |
sievers@chromium.org | 1638338 | 2012-09-05 23:57:26 | [diff] [blame] | 597 | } |
| 598 | |
jinsukkim | d4b3f4e4 | 2016-11-23 02:10:13 | [diff] [blame] | 599 | void CompositorImpl::SetHasTransparentBackground(bool transparent) { |
| 600 | has_transparent_background_ = transparent; |
| 601 | if (host_) { |
khushalsagar | b69ba945 | 2017-01-27 22:20:07 | [diff] [blame] | 602 | host_->set_has_transparent_background(transparent); |
jinsukkim | d4b3f4e4 | 2016-11-23 02:10:13 | [diff] [blame] | 603 | |
| 604 | // Give a delay in setting the background color to avoid the color for |
| 605 | // the normal mode (white) affecting the UI transition. |
| 606 | base::ThreadTaskRunnerHandle::Get().get()->PostDelayedTask( |
| 607 | FROM_HERE, |
| 608 | base::Bind(&CompositorImpl::SetBackgroundColor, |
| 609 | weak_factory_.GetWeakPtr(), |
| 610 | transparent ? SK_ColorBLACK : SK_ColorWHITE), |
| 611 | base::TimeDelta::FromMilliseconds(500)); |
| 612 | } |
| 613 | } |
| 614 | |
| 615 | void CompositorImpl::SetBackgroundColor(int color) { |
khushalsagar | b69ba945 | 2017-01-27 22:20:07 | [diff] [blame] | 616 | host_->set_background_color(color); |
trchen@chromium.org | d66ddad | 2014-01-09 02:16:00 | [diff] [blame] | 617 | } |
| 618 | |
sievers@chromium.org | 5aba5bc | 2014-05-13 22:40:59 | [diff] [blame] | 619 | void CompositorImpl::SetNeedsComposite() { |
khushalsagar | cebe494 | 2016-09-07 23:27:01 | [diff] [blame] | 620 | if (!host_->IsVisible()) |
sievers@chromium.org | 5aba5bc | 2014-05-13 22:40:59 | [diff] [blame] | 621 | return; |
sievers | 6414a45 | 2016-04-22 21:33:20 | [diff] [blame] | 622 | TRACE_EVENT0("compositor", "Compositor::SetNeedsComposite"); |
sievers | 48c068d | 2016-01-06 00:14:43 | [diff] [blame] | 623 | host_->SetNeedsAnimate(); |
sievers@chromium.org | 5aba5bc | 2014-05-13 22:40:59 | [diff] [blame] | 624 | } |
| 625 | |
wkorman | 7265db01 | 2015-11-03 04:08:25 | [diff] [blame] | 626 | void CompositorImpl::UpdateLayerTreeHost() { |
wkorman | 7265db01 | 2015-11-03 04:08:25 | [diff] [blame] | 627 | client_->UpdateLayerTreeHost(); |
sievers | 48c068d | 2016-01-06 00:14:43 | [diff] [blame] | 628 | if (needs_animate_) { |
| 629 | needs_animate_ = false; |
| 630 | root_window_->Animate(base::TimeTicks::Now()); |
| 631 | } |
sievers@chromium.org | 5aba5bc | 2014-05-13 22:40:59 | [diff] [blame] | 632 | } |
| 633 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 634 | void CompositorImpl::RequestNewLayerTreeFrameSink() { |
| 635 | DCHECK(!layer_tree_frame_sink_request_pending_) |
| 636 | << "LayerTreeFrameSink request is already pending?"; |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 637 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 638 | layer_tree_frame_sink_request_pending_ = true; |
| 639 | HandlePendingLayerTreeFrameSinkRequest(); |
enne | 2097cab | 2014-09-25 20:16:31 | [diff] [blame] | 640 | } |
| 641 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 642 | void CompositorImpl::DidInitializeLayerTreeFrameSink() { |
| 643 | layer_tree_frame_sink_request_pending_ = false; |
| 644 | has_layer_tree_frame_sink_ = true; |
staraz | aa23111 | 2017-02-07 17:53:24 | [diff] [blame] | 645 | for (auto& frame_sink_id : pending_child_frame_sink_ids_) |
| 646 | AddChildFrameSink(frame_sink_id); |
| 647 | |
| 648 | pending_child_frame_sink_ids_.clear(); |
sievers | bce21923 | 2015-02-09 21:01:49 | [diff] [blame] | 649 | } |
| 650 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 651 | void CompositorImpl::DidFailToInitializeLayerTreeFrameSink() { |
danakj | 801bcef9 | 2016-11-01 20:18:38 | [diff] [blame] | 652 | // The context is bound/initialized before handing it to the |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 653 | // LayerTreeFrameSink. |
danakj | 801bcef9 | 2016-11-01 20:18:38 | [diff] [blame] | 654 | NOTREACHED(); |
enne | 7f8fdde | 2014-12-10 21:32:09 | [diff] [blame] | 655 | } |
| 656 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 657 | void CompositorImpl::HandlePendingLayerTreeFrameSinkRequest() { |
| 658 | DCHECK(layer_tree_frame_sink_request_pending_); |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 659 | |
| 660 | // We might have been made invisible now. |
khushalsagar | cebe494 | 2016-09-07 23:27:01 | [diff] [blame] | 661 | if (!host_->IsVisible()) |
sievers | 589235a | 2015-02-11 01:48:51 | [diff] [blame] | 662 | return; |
| 663 | |
qyearsley | db0a3487 | 2017-03-14 03:24:31 | [diff] [blame] | 664 | #if BUILDFLAG(ENABLE_VULKAN) |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 665 | CreateVulkanOutputSurface() |
| 666 | if (display_) |
| 667 | return; |
| 668 | #endif |
| 669 | |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 670 | #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \ |
| 671 | defined(SYZYASAN) || defined(CYGPROFILE_INSTRUMENTATION) |
| 672 | const int64_t kGpuChannelTimeoutInSeconds = 40; |
| 673 | #else |
| 674 | // The GPU watchdog timeout is 15 seconds (1.5x the kGpuTimeout value due to |
| 675 | // logic in GpuWatchdogThread). Make this slightly longer to give the GPU a |
| 676 | // chance to crash itself before crashing the browser. |
| 677 | const int64_t kGpuChannelTimeoutInSeconds = 20; |
| 678 | #endif |
| 679 | |
| 680 | // Start the timer first, if the result comes synchronously, we want it to |
| 681 | // stop in the callback. |
| 682 | establish_gpu_channel_timeout_.Start( |
| 683 | FROM_HERE, base::TimeDelta::FromSeconds(kGpuChannelTimeoutInSeconds), |
| 684 | this, &CompositorImpl::OnGpuChannelTimeout); |
| 685 | |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 686 | DCHECK(surface_handle_ != gpu::kNullSurfaceHandle); |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 687 | BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel(base::Bind( |
khushalsagar | 8ecea2e7 | 2016-09-02 20:25:57 | [diff] [blame] | 688 | &CompositorImpl::OnGpuChannelEstablished, weak_factory_.GetWeakPtr())); |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 689 | } |
| 690 | |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 691 | void CompositorImpl::OnGpuChannelTimeout() { |
| 692 | LOG(FATAL) << "Timed out waiting for GPU channel."; |
| 693 | } |
| 694 | |
qyearsley | db0a3487 | 2017-03-14 03:24:31 | [diff] [blame] | 695 | #if BUILDFLAG(ENABLE_VULKAN) |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 696 | void CompositorImpl::CreateVulkanOutputSurface() { |
| 697 | if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 698 | switches::kEnableVulkan)) |
| 699 | return; |
| 700 | |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 701 | scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider = |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 702 | GetSharedVulkanContextProvider(); |
danakj | 1120f4c | 2016-09-15 02:05:32 | [diff] [blame] | 703 | if (!vulkan_context_provider) |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 704 | return; |
| 705 | |
boliu | 1021ed20 | 2017-03-03 20:13:40 | [diff] [blame] | 706 | // TODO(crbug.com/582558): Need to match GL and implement DidSwapBuffers. |
danakj | daad1d1 | 2016-10-11 00:00:34 | [diff] [blame] | 707 | auto vulkan_surface = base::MakeUnique<VulkanOutputSurface>( |
| 708 | vulkan_context_provider, base::ThreadTaskRunnerHandle::Get()); |
danakj | 1120f4c | 2016-09-15 02:05:32 | [diff] [blame] | 709 | if (!vulkan_surface->Initialize(window_)) |
| 710 | return; |
| 711 | |
| 712 | InitializeDisplay(std::move(vulkan_surface), |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 713 | std::move(vulkan_context_provider), nullptr); |
| 714 | } |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 715 | #endif |
jinsukkim | 2521961 | 2016-01-20 23:24:07 | [diff] [blame] | 716 | |
khushalsagar | 8ecea2e7 | 2016-09-02 20:25:57 | [diff] [blame] | 717 | void CompositorImpl::OnGpuChannelEstablished( |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 718 | scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) { |
| 719 | establish_gpu_channel_timeout_.Stop(); |
| 720 | |
khushalsagar | 2010e7d | 2016-09-06 05:45:43 | [diff] [blame] | 721 | // We might end up queing multiple GpuChannel requests for the same |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 722 | // LayerTreeFrameSink request as the visibility of the compositor changes, so |
| 723 | // the LayerTreeFrameSink request could have been handled already. |
| 724 | if (!layer_tree_frame_sink_request_pending_) |
khushalsagar | 2010e7d | 2016-09-06 05:45:43 | [diff] [blame] | 725 | return; |
sievers@chromium.org | 2b594b1 | 2013-03-06 01:02:12 | [diff] [blame] | 726 | |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 727 | if (!gpu_channel_host) { |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 728 | HandlePendingLayerTreeFrameSinkRequest(); |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 729 | return; |
khushalsagar | 8ecea2e7 | 2016-09-02 20:25:57 | [diff] [blame] | 730 | } |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 731 | |
| 732 | // We don't need the context anymore if we are invisible. |
| 733 | if (!host_->IsVisible()) |
| 734 | return; |
| 735 | |
| 736 | DCHECK(window_); |
| 737 | DCHECK_NE(surface_handle_, gpu::kNullSurfaceHandle); |
sunnyps | 8f9139e | 2017-05-12 17:53:25 | [diff] [blame] | 738 | |
| 739 | int32_t stream_id = kGpuStreamIdDefault; |
| 740 | gpu::SchedulingPriority stream_priority = kGpuStreamPriorityUI; |
| 741 | |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 742 | constexpr bool support_locking = false; |
| 743 | constexpr bool automatic_flushes = false; |
sunnyps | 8f9139e | 2017-05-12 17:53:25 | [diff] [blame] | 744 | |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 745 | ui::ContextProviderCommandBuffer* shared_context = nullptr; |
| 746 | scoped_refptr<ui::ContextProviderCommandBuffer> context_provider = |
| 747 | new ui::ContextProviderCommandBuffer( |
sunnyps | 8f9139e | 2017-05-12 17:53:25 | [diff] [blame] | 748 | std::move(gpu_channel_host), stream_id, stream_priority, |
| 749 | surface_handle_, |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 750 | GURL(std::string("chrome://gpu/CompositorImpl::") + |
| 751 | std::string("CompositorContextProvider")), |
| 752 | automatic_flushes, support_locking, |
| 753 | GetCompositorContextSharedMemoryLimits(root_window_), |
| 754 | GetCompositorContextAttributes(has_transparent_background_), |
| 755 | shared_context, |
| 756 | ui::command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT); |
| 757 | if (!context_provider->BindToCurrentThread()) { |
| 758 | LOG(ERROR) << "Failed to init ContextProvider for compositor."; |
| 759 | LOG_IF(FATAL, ++num_successive_context_creation_failures_ >= 2) |
| 760 | << "Too many context creation failures. Giving up... "; |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 761 | HandlePendingLayerTreeFrameSinkRequest(); |
khushalsagar | cfd16cd | 2017-04-04 18:47:48 | [diff] [blame] | 762 | return; |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 763 | } |
| 764 | |
boliu | e07c48a | 2017-03-10 05:46:51 | [diff] [blame] | 765 | // Unretained is safe this owns cc::Display which owns OutputSurface. |
| 766 | auto display_output_surface = base::MakeUnique<AndroidOutputSurface>( |
| 767 | context_provider, |
| 768 | base::Bind(&CompositorImpl::DidSwapBuffers, base::Unretained(this))); |
hzl | 1fa9487 | 2017-03-09 00:21:38 | [diff] [blame] | 769 | InitializeDisplay(std::move(display_output_surface), nullptr, |
| 770 | std::move(context_provider)); |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 771 | } |
danakj@chromium.org | 0634cdd4 | 2013-08-16 00:46:09 | [diff] [blame] | 772 | |
khushalsagar | c81e43b | 2016-08-09 02:15:51 | [diff] [blame] | 773 | void CompositorImpl::InitializeDisplay( |
| 774 | std::unique_ptr<cc::OutputSurface> display_output_surface, |
| 775 | scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, |
| 776 | scoped_refptr<cc::ContextProvider> context_provider) { |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 777 | DCHECK(layer_tree_frame_sink_request_pending_); |
danakj | 6f4e1e2 | 2016-04-20 03:27:34 | [diff] [blame] | 778 | |
boliu | ba83590 | 2017-02-28 04:10:15 | [diff] [blame] | 779 | pending_frames_ = 0; |
danakj | 801bcef9 | 2016-11-01 20:18:38 | [diff] [blame] | 780 | num_successive_context_creation_failures_ = 0; |
| 781 | |
| 782 | if (context_provider) { |
| 783 | gpu_capabilities_ = context_provider->ContextCapabilities(); |
| 784 | } else { |
| 785 | // TODO(danakj): Populate gpu_capabilities_ for VulkanContextProvider. |
| 786 | } |
danakj | 6f4e1e2 | 2016-04-20 03:27:34 | [diff] [blame] | 787 | |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 788 | cc::SurfaceManager* manager = GetSurfaceManager(); |
danakj | 8eb035c0 | 2016-06-17 22:41:32 | [diff] [blame] | 789 | auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); |
danakj | 8eb035c0 | 2016-06-17 22:41:32 | [diff] [blame] | 790 | std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( |
Alex Zhang | d3b9d65 | 2017-06-09 18:48:55 | [diff] [blame] | 791 | root_window_->GetBeginFrameSource(), task_runner, |
| 792 | display_output_surface->capabilities().max_frames_pending)); |
danakj | 8eb035c0 | 2016-06-17 22:41:32 | [diff] [blame] | 793 | |
Alex Zhang | 903cb6a | 2017-06-12 20:31:37 | [diff] [blame] | 794 | cc::RendererSettings renderer_settings; |
| 795 | renderer_settings.allow_antialiasing = false; |
| 796 | renderer_settings.highp_threshold_min = 2048; |
danakj | 8eb035c0 | 2016-06-17 22:41:32 | [diff] [blame] | 797 | display_.reset(new cc::Display( |
xing.xu | e334e56 | 2017-05-17 19:08:10 | [diff] [blame] | 798 | viz::HostSharedBitmapManager::current(), |
Alex Zhang | 903cb6a | 2017-06-12 20:31:37 | [diff] [blame] | 799 | BrowserGpuMemoryBufferManager::current(), renderer_settings, |
| 800 | frame_sink_id_, std::move(display_output_surface), std::move(scheduler), |
danakj | 8eb035c0 | 2016-06-17 22:41:32 | [diff] [blame] | 801 | base::MakeUnique<cc::TextureMailboxDeleter>(task_runner))); |
sohan.jyoti | 2986bd48 | 2016-05-09 17:44:12 | [diff] [blame] | 802 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 803 | auto layer_tree_frame_sink = |
piman | c44437a2 | 2016-10-29 00:09:22 | [diff] [blame] | 804 | vulkan_context_provider |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 805 | ? base::MakeUnique<cc::DirectLayerTreeFrameSink>( |
piman | c44437a2 | 2016-10-29 00:09:22 | [diff] [blame] | 806 | frame_sink_id_, manager, display_.get(), |
| 807 | vulkan_context_provider) |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 808 | : base::MakeUnique<cc::DirectLayerTreeFrameSink>( |
piman | c44437a2 | 2016-10-29 00:09:22 | [diff] [blame] | 809 | frame_sink_id_, manager, display_.get(), context_provider, |
| 810 | nullptr, BrowserGpuMemoryBufferManager::current(), |
xing.xu | e334e56 | 2017-05-17 19:08:10 | [diff] [blame] | 811 | viz::HostSharedBitmapManager::current()); |
jbauman | 78f9b57 | 2014-11-18 06:01:56 | [diff] [blame] | 812 | |
danakj | 6f2861b | 2016-08-17 02:10:17 | [diff] [blame] | 813 | display_->SetVisible(true); |
danakj | 324faea | 2016-06-11 01:39:31 | [diff] [blame] | 814 | display_->Resize(size_); |
Alex Zhang | d3b9d65 | 2017-06-09 18:48:55 | [diff] [blame] | 815 | GetSurfaceManager()->RegisterBeginFrameSource( |
| 816 | root_window_->GetBeginFrameSource(), frame_sink_id_); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 817 | host_->SetLayerTreeFrameSink(std::move(layer_tree_frame_sink)); |
aelias | d880a3d | 2014-08-26 00:46:20 | [diff] [blame] | 818 | } |
| 819 | |
boliu | e07c48a | 2017-03-10 05:46:51 | [diff] [blame] | 820 | void CompositorImpl::DidSwapBuffers() { |
| 821 | client_->DidSwapBuffers(); |
| 822 | } |
| 823 | |
sievers | 148fedf | 2015-10-02 00:12:04 | [diff] [blame] | 824 | cc::UIResourceId CompositorImpl::CreateUIResource( |
| 825 | cc::UIResourceClient* client) { |
sievers | 6414a45 | 2016-04-22 21:33:20 | [diff] [blame] | 826 | TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource"); |
khushalsagar | 8ec0740 | 2016-09-10 03:13:19 | [diff] [blame] | 827 | return host_->GetUIResourceManager()->CreateUIResource(client); |
sievers | 148fedf | 2015-10-02 00:12:04 | [diff] [blame] | 828 | } |
| 829 | |
| 830 | void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { |
sievers | 6414a45 | 2016-04-22 21:33:20 | [diff] [blame] | 831 | TRACE_EVENT0("compositor", "CompositorImpl::DeleteUIResource"); |
khushalsagar | 8ec0740 | 2016-09-10 03:13:19 | [diff] [blame] | 832 | host_->GetUIResourceManager()->DeleteUIResource(resource_id); |
sievers | 148fedf | 2015-10-02 00:12:04 | [diff] [blame] | 833 | } |
| 834 | |
| 835 | bool CompositorImpl::SupportsETC1NonPowerOfTwo() const { |
| 836 | return gpu_capabilities_.texture_format_etc1_npot; |
| 837 | } |
| 838 | |
danakj | 6c872fc0 | 2016-10-22 04:29:49 | [diff] [blame] | 839 | void CompositorImpl::DidSubmitCompositorFrame() { |
| 840 | TRACE_EVENT0("compositor", "CompositorImpl::DidSubmitCompositorFrame"); |
boliu | ba83590 | 2017-02-28 04:10:15 | [diff] [blame] | 841 | pending_frames_++; |
sievers@chromium.org | 5aba5bc | 2014-05-13 22:40:59 | [diff] [blame] | 842 | } |
| 843 | |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 844 | void CompositorImpl::DidReceiveCompositorFrameAck() { |
| 845 | TRACE_EVENT0("compositor", "CompositorImpl::DidReceiveCompositorFrameAck"); |
boliu | ba83590 | 2017-02-28 04:10:15 | [diff] [blame] | 846 | DCHECK_GT(pending_frames_, 0U); |
| 847 | pending_frames_--; |
| 848 | client_->DidSwapFrame(pending_frames_); |
jamesr@chromium.org | 4d7e46a | 2013-11-08 05:33:40 | [diff] [blame] | 849 | } |
| 850 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 851 | void CompositorImpl::DidLoseLayerTreeFrameSink() { |
| 852 | TRACE_EVENT0("compositor", "CompositorImpl::DidLoseLayerTreeFrameSink"); |
| 853 | has_layer_tree_frame_sink_ = false; |
boliu | ba83590 | 2017-02-28 04:10:15 | [diff] [blame] | 854 | client_->DidSwapFrame(0); |
jamesr@chromium.org | fa8d396 | 2012-11-19 22:18:34 | [diff] [blame] | 855 | } |
| 856 | |
powei@chromium.org | aca40ac | 2013-11-21 21:35:28 | [diff] [blame] | 857 | void CompositorImpl::DidCommit() { |
| 858 | root_window_->OnCompositingDidCommit(); |
| 859 | } |
| 860 | |
sievers | 02d8a97d | 2016-08-12 01:06:49 | [diff] [blame] | 861 | void CompositorImpl::AttachLayerForReadback(scoped_refptr<cc::Layer> layer) { |
sievers | 962aa721 | 2016-08-12 18:26:14 | [diff] [blame] | 862 | readback_layer_tree_->AddChild(layer); |
sievers | 02d8a97d | 2016-08-12 01:06:49 | [diff] [blame] | 863 | } |
| 864 | |
danakj@chromium.org | 2e6f39e | 2014-05-15 19:36:36 | [diff] [blame] | 865 | void CompositorImpl::RequestCopyOfOutputOnRootLayer( |
dcheng | 92ae141 | 2016-04-09 02:52:24 | [diff] [blame] | 866 | std::unique_ptr<cc::CopyOutputRequest> request) { |
sievers | 481b7fe | 2016-07-21 17:03:59 | [diff] [blame] | 867 | root_window_->GetLayer()->RequestCopyOfOutput(std::move(request)); |
danakj@chromium.org | 2e6f39e | 2014-05-15 19:36:36 | [diff] [blame] | 868 | } |
| 869 | |
sievers@chromium.org | 41256cd | 2014-05-27 22:45:34 | [diff] [blame] | 870 | void CompositorImpl::SetNeedsAnimate() { |
jdduke | 1711257 | 2014-12-10 23:02:59 | [diff] [blame] | 871 | needs_animate_ = true; |
khushalsagar | cebe494 | 2016-09-07 23:27:01 | [diff] [blame] | 872 | if (!host_->IsVisible()) |
sievers@chromium.org | 41256cd | 2014-05-27 22:45:34 | [diff] [blame] | 873 | return; |
| 874 | |
sievers | 6414a45 | 2016-04-22 21:33:20 | [diff] [blame] | 875 | TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); |
sievers@chromium.org | 41256cd | 2014-05-27 22:45:34 | [diff] [blame] | 876 | host_->SetNeedsAnimate(); |
sievers@chromium.org | 5aba5bc | 2014-05-13 22:40:59 | [diff] [blame] | 877 | } |
| 878 | |
fsamuel | e0f705b | 2016-10-01 14:07:14 | [diff] [blame] | 879 | cc::FrameSinkId CompositorImpl::GetFrameSinkId() { |
fsamuel | b6acafa | 2016-10-04 03:21:52 | [diff] [blame] | 880 | return frame_sink_id_; |
enne | a487a27 | 2016-09-30 19:56:18 | [diff] [blame] | 881 | } |
| 882 | |
staraz | aa23111 | 2017-02-07 17:53:24 | [diff] [blame] | 883 | void CompositorImpl::AddChildFrameSink(const cc::FrameSinkId& frame_sink_id) { |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 884 | if (has_layer_tree_frame_sink_) { |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 885 | GetSurfaceManager()->RegisterFrameSinkHierarchy(frame_sink_id_, |
| 886 | frame_sink_id); |
staraz | aa23111 | 2017-02-07 17:53:24 | [diff] [blame] | 887 | } else { |
| 888 | pending_child_frame_sink_ids_.insert(frame_sink_id); |
| 889 | } |
| 890 | } |
| 891 | |
| 892 | void CompositorImpl::RemoveChildFrameSink( |
| 893 | const cc::FrameSinkId& frame_sink_id) { |
| 894 | auto it = pending_child_frame_sink_ids_.find(frame_sink_id); |
| 895 | if (it != pending_child_frame_sink_ids_.end()) { |
| 896 | pending_child_frame_sink_ids_.erase(it); |
| 897 | return; |
| 898 | } |
khushalsagar | 31690fb | 2017-02-28 23:23:48 | [diff] [blame] | 899 | GetSurfaceManager()->UnregisterFrameSinkHierarchy(frame_sink_id_, |
| 900 | frame_sink_id); |
staraz | aa23111 | 2017-02-07 17:53:24 | [diff] [blame] | 901 | } |
| 902 | |
sievers | 962aa721 | 2016-08-12 18:26:14 | [diff] [blame] | 903 | bool CompositorImpl::HavePendingReadbacks() { |
| 904 | return !readback_layer_tree_->children().empty(); |
| 905 | } |
| 906 | |
powei@chromium.org | 0809f7e2 | 2014-03-20 00:05:45 | [diff] [blame] | 907 | } // namespace content |