Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(804)

Side by Side Diff: content/renderer/gpu/renderer_compositor_frame_sink.cc

Issue 2921713002: Reland "Send FrameSwapMessageQueue's messages in QueueMessageSwapPromise" with fixes (Closed)
Patch Set: Don't pass to RCFS Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/gpu/renderer_compositor_frame_sink.h" 5 #include "content/renderer/gpu/renderer_compositor_frame_sink.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/location.h" 10 #include "base/location.h"
11 #include "base/single_thread_task_runner.h" 11 #include "base/single_thread_task_runner.h"
12 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
13 #include "build/build_config.h" 13 #include "build/build_config.h"
14 #include "cc/output/compositor_frame.h" 14 #include "cc/output/compositor_frame.h"
15 #include "cc/output/compositor_frame_sink_client.h" 15 #include "cc/output/compositor_frame_sink_client.h"
16 #include "cc/output/managed_memory_policy.h" 16 #include "cc/output/managed_memory_policy.h"
17 #include "content/common/view_messages.h" 17 #include "content/common/view_messages.h"
18 #include "content/public/common/content_switches.h" 18 #include "content/public/common/content_switches.h"
19 #include "content/renderer/gpu/frame_swap_message_queue.h"
20 #include "content/renderer/render_thread_impl.h" 19 #include "content/renderer/render_thread_impl.h"
21 #include "gpu/command_buffer/client/context_support.h" 20 #include "gpu/command_buffer/client/context_support.h"
22 #include "gpu/command_buffer/client/gles2_interface.h" 21 #include "gpu/command_buffer/client/gles2_interface.h"
23 #include "gpu/ipc/client/command_buffer_proxy_impl.h" 22 #include "gpu/ipc/client/command_buffer_proxy_impl.h"
24 #include "ipc/ipc_sync_channel.h" 23 #include "ipc/ipc_sync_channel.h"
25 #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h" 24 #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h"
26 25
27 namespace content { 26 namespace content {
28 27
29 RendererCompositorFrameSink::RendererCompositorFrameSink( 28 RendererCompositorFrameSink::RendererCompositorFrameSink(
30 int32_t routing_id, 29 int32_t routing_id,
31 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, 30 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
32 scoped_refptr<cc::ContextProvider> context_provider, 31 scoped_refptr<cc::ContextProvider> context_provider,
33 scoped_refptr<cc::ContextProvider> worker_context_provider, 32 scoped_refptr<cc::ContextProvider> worker_context_provider,
34 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, 33 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
35 cc::SharedBitmapManager* shared_bitmap_manager, 34 cc::SharedBitmapManager* shared_bitmap_manager,
36 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info, 35 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info,
37 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request, 36 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request)
38 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue)
39 : ClientCompositorFrameSink(std::move(context_provider), 37 : ClientCompositorFrameSink(std::move(context_provider),
40 std::move(worker_context_provider), 38 std::move(worker_context_provider),
41 gpu_memory_buffer_manager, 39 gpu_memory_buffer_manager,
42 shared_bitmap_manager, 40 shared_bitmap_manager,
43 std::move(synthetic_begin_frame_source), 41 std::move(synthetic_begin_frame_source),
44 std::move(sink_info), 42 std::move(sink_info),
45 std::move(sink_client_request), 43 std::move(sink_client_request),
46 false /* enable_surface_synchronization */), 44 false /* enable_surface_synchronization */),
47 compositor_frame_sink_filter_( 45 compositor_frame_sink_filter_(
48 RenderThreadImpl::current()->compositor_message_filter()), 46 RenderThreadImpl::current()->compositor_message_filter()),
49 message_sender_(RenderThreadImpl::current()->sync_message_filter()), 47 message_sender_(RenderThreadImpl::current()->sync_message_filter()),
50 frame_swap_message_queue_(swap_frame_message_queue),
51 routing_id_(routing_id) { 48 routing_id_(routing_id) {
52 DCHECK(compositor_frame_sink_filter_); 49 DCHECK(compositor_frame_sink_filter_);
53 DCHECK(frame_swap_message_queue_);
54 DCHECK(message_sender_); 50 DCHECK(message_sender_);
55 } 51 }
56 52
57 RendererCompositorFrameSink::RendererCompositorFrameSink( 53 RendererCompositorFrameSink::RendererCompositorFrameSink(
58 int32_t routing_id, 54 int32_t routing_id,
59 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, 55 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
60 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, 56 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider,
61 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info, 57 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info,
62 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request, 58 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request)
63 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue)
64 : ClientCompositorFrameSink(std::move(vulkan_context_provider), 59 : ClientCompositorFrameSink(std::move(vulkan_context_provider),
65 std::move(synthetic_begin_frame_source), 60 std::move(synthetic_begin_frame_source),
66 std::move(sink_info), 61 std::move(sink_info),
67 std::move(sink_client_request), 62 std::move(sink_client_request),
68 false /* enable_surface_synchronization */), 63 false /* enable_surface_synchronization */),
69 compositor_frame_sink_filter_( 64 compositor_frame_sink_filter_(
70 RenderThreadImpl::current()->compositor_message_filter()), 65 RenderThreadImpl::current()->compositor_message_filter()),
71 message_sender_(RenderThreadImpl::current()->sync_message_filter()), 66 message_sender_(RenderThreadImpl::current()->sync_message_filter()),
72 frame_swap_message_queue_(swap_frame_message_queue),
73 routing_id_(routing_id) { 67 routing_id_(routing_id) {
74 DCHECK(compositor_frame_sink_filter_); 68 DCHECK(compositor_frame_sink_filter_);
75 DCHECK(frame_swap_message_queue_);
76 DCHECK(message_sender_); 69 DCHECK(message_sender_);
77 } 70 }
78 71
79 RendererCompositorFrameSink::~RendererCompositorFrameSink() = default; 72 RendererCompositorFrameSink::~RendererCompositorFrameSink() = default;
80 73
81 bool RendererCompositorFrameSink::BindToClient( 74 bool RendererCompositorFrameSink::BindToClient(
82 cc::CompositorFrameSinkClient* client) { 75 cc::CompositorFrameSinkClient* client) {
83 if (!ClientCompositorFrameSink::BindToClient(client)) 76 if (!ClientCompositorFrameSink::BindToClient(client))
84 return false; 77 return false;
85 78
86 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this); 79 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this);
87 compositor_frame_sink_filter_handler_ = 80 compositor_frame_sink_filter_handler_ =
88 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived, 81 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived,
89 compositor_frame_sink_proxy_); 82 compositor_frame_sink_proxy_);
90 compositor_frame_sink_filter_->AddHandlerOnCompositorThread( 83 compositor_frame_sink_filter_->AddHandlerOnCompositorThread(
91 routing_id_, compositor_frame_sink_filter_handler_); 84 routing_id_, compositor_frame_sink_filter_handler_);
92 85
93 return true; 86 return true;
94 } 87 }
95 88
96 void RendererCompositorFrameSink::DetachFromClient() { 89 void RendererCompositorFrameSink::DetachFromClient() {
97 compositor_frame_sink_proxy_->ClearCompositorFrameSink(); 90 compositor_frame_sink_proxy_->ClearCompositorFrameSink();
98 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( 91 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread(
99 routing_id_, compositor_frame_sink_filter_handler_); 92 routing_id_, compositor_frame_sink_filter_handler_);
100 ClientCompositorFrameSink::DetachFromClient(); 93 ClientCompositorFrameSink::DetachFromClient();
101 } 94 }
102 95
103 void RendererCompositorFrameSink::SubmitCompositorFrame( 96 void RendererCompositorFrameSink::SubmitCompositorFrame(
104 cc::CompositorFrame frame) { 97 cc::CompositorFrame frame) {
105 {
106 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope>
107 send_message_scope =
108 frame_swap_message_queue_->AcquireSendMessageScope();
109 std::vector<std::unique_ptr<IPC::Message>> messages;
110 frame_swap_message_queue_->DrainMessages(&messages);
111 std::vector<IPC::Message> messages_to_send;
112 FrameSwapMessageQueue::TransferMessages(&messages, &messages_to_send);
113 if (!messages_to_send.empty()) {
114 frame.metadata.frame_token =
115 frame_swap_message_queue_->AllocateFrameToken();
116 message_sender_->Send(new ViewHostMsg_FrameSwapMessages(
117 routing_id_, frame.metadata.frame_token, messages_to_send));
118 }
119 // ~send_message_scope.
120 }
121 auto new_surface_properties = 98 auto new_surface_properties =
122 RenderWidgetSurfaceProperties::FromCompositorFrame(frame); 99 RenderWidgetSurfaceProperties::FromCompositorFrame(frame);
123 ClientCompositorFrameSink::SubmitCompositorFrame(std::move(frame)); 100 ClientCompositorFrameSink::SubmitCompositorFrame(std::move(frame));
124 current_surface_properties_ = new_surface_properties; 101 current_surface_properties_ = new_surface_properties;
125 } 102 }
126 103
127 bool RendererCompositorFrameSink::ShouldAllocateNewLocalSurfaceId( 104 bool RendererCompositorFrameSink::ShouldAllocateNewLocalSurfaceId(
128 const cc::CompositorFrame& frame) { 105 const cc::CompositorFrame& frame) {
129 return current_surface_properties_ != 106 return current_surface_properties_ !=
130 RenderWidgetSurfaceProperties::FromCompositorFrame(frame); 107 RenderWidgetSurfaceProperties::FromCompositorFrame(frame);
131 } 108 }
132 109
133 } // namespace content 110 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/renderer_compositor_frame_sink.h ('k') | content/renderer/render_thread_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698