OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/synchronous_compositor_host.h" | 5 #include "content/browser/android/synchronous_compositor_host.h" |
6 | 6 |
7 #include "base/containers/hash_tables.h" | 7 #include "base/containers/hash_tables.h" |
8 #include "base/memory/shared_memory.h" | 8 #include "base/memory/shared_memory.h" |
9 #include "base/trace_event/trace_event_argument.h" | 9 #include "base/trace_event/trace_event_argument.h" |
10 #include "cc/output/compositor_frame_ack.h" | 10 #include "cc/output/compositor_frame_ack.h" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
89 if (frame) | 89 if (frame) |
90 UpdateFrameMetaData(frame->metadata); | 90 UpdateFrameMetaData(frame->metadata); |
91 return frame; | 91 return frame; |
92 } | 92 } |
93 | 93 |
94 void SynchronousCompositorHost::UpdateFrameMetaData( | 94 void SynchronousCompositorHost::UpdateFrameMetaData( |
95 const cc::CompositorFrameMetadata& frame_metadata) { | 95 const cc::CompositorFrameMetadata& frame_metadata) { |
96 rwhva_->SynchronousFrameMetadata(frame_metadata); | 96 rwhva_->SynchronousFrameMetadata(frame_metadata); |
97 } | 97 } |
98 | 98 |
99 class SynchronousCompositorHost::ScopedSendZeroMemory { | |
100 public: | |
101 ScopedSendZeroMemory(SynchronousCompositorHost* host) : host_(host) {} | |
102 ~ScopedSendZeroMemory() { host_->SendZeroMemory(); } | |
103 | |
104 private: | |
105 SynchronousCompositorHost* host_; | |
dcheng
2015/12/29 00:00:24
Nit: T* const.
boliu
2015/12/29 00:16:30
Done.
| |
106 | |
107 DISALLOW_COPY_AND_ASSIGN(ScopedSendZeroMemory); | |
108 }; | |
109 | |
110 struct SynchronousCompositorHost::SharedMemoryWithSize { | |
111 base::SharedMemory shm; | |
112 const size_t stride; | |
113 const size_t buffer_size; | |
114 | |
115 SharedMemoryWithSize(size_t stride, size_t buffer_size) | |
116 : stride(stride), buffer_size(buffer_size) {} | |
117 }; | |
dcheng
2015/12/29 00:00:24
DISALLOW_COPY_AND_ASSIGN here too?
boliu
2015/12/29 00:16:30
Done.
| |
118 | |
99 bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) { | 119 bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) { |
100 SyncCompositorDemandDrawSwParams params; | 120 SyncCompositorDemandDrawSwParams params; |
101 params.size = gfx::Size(canvas->getBaseLayerSize().width(), | 121 params.size = gfx::Size(canvas->getBaseLayerSize().width(), |
102 canvas->getBaseLayerSize().height()); | 122 canvas->getBaseLayerSize().height()); |
103 SkIRect canvas_clip; | 123 SkIRect canvas_clip; |
104 canvas->getClipDeviceBounds(&canvas_clip); | 124 canvas->getClipDeviceBounds(&canvas_clip); |
105 params.clip = gfx::SkIRectToRect(canvas_clip); | 125 params.clip = gfx::SkIRectToRect(canvas_clip); |
106 params.transform.matrix() = canvas->getTotalMatrix(); | 126 params.transform.matrix() = canvas->getTotalMatrix(); |
107 if (params.size.IsEmpty()) | 127 if (params.size.IsEmpty()) |
108 return true; | 128 return true; |
109 | 129 |
110 SkImageInfo info = | 130 SkImageInfo info = |
111 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); | 131 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); |
112 DCHECK_EQ(kRGBA_8888_SkColorType, info.colorType()); | 132 DCHECK_EQ(kRGBA_8888_SkColorType, info.colorType()); |
113 size_t stride = info.minRowBytes(); | 133 size_t stride = info.minRowBytes(); |
114 size_t buffer_size = info.getSafeSize(stride); | 134 size_t buffer_size = info.getSafeSize(stride); |
115 if (!buffer_size) | 135 if (!buffer_size) |
116 return false; // Overflow. | 136 return false; // Overflow. |
117 | 137 |
118 base::SharedMemory shm; | 138 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size); |
119 { | 139 if (!software_draw_shm_) |
120 TRACE_EVENT1("browser", "AllocateSharedMemory", "buffer_size", buffer_size); | |
121 if (!shm.CreateAndMapAnonymous(buffer_size)) | |
122 return false; | |
123 } | |
124 base::ProcessHandle renderer_process_handle = | |
125 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); | |
126 if (!shm.ShareToProcess(renderer_process_handle, ¶ms.shm_handle)) | |
127 return false; | 140 return false; |
128 | 141 |
129 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); | 142 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
130 SyncCompositorCommonBrowserParams common_browser_params; | 143 SyncCompositorCommonBrowserParams common_browser_params; |
131 PopulateCommonParams(&common_browser_params); | 144 PopulateCommonParams(&common_browser_params); |
132 SyncCompositorCommonRendererParams common_renderer_params; | 145 SyncCompositorCommonRendererParams common_renderer_params; |
133 bool success = false; | 146 bool success = false; |
134 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( | 147 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( |
135 routing_id_, common_browser_params, params, &success, | 148 routing_id_, common_browser_params, params, &success, |
136 &common_renderer_params, frame.get()))) { | 149 &common_renderer_params, frame.get()))) { |
137 return false; | 150 return false; |
138 } | 151 } |
152 ScopedSendZeroMemory send_zero_memory(this); | |
139 if (!success) | 153 if (!success) |
140 return false; | 154 return false; |
141 | 155 |
142 ProcessCommonParams(common_renderer_params); | 156 ProcessCommonParams(common_renderer_params); |
143 UpdateFrameMetaData(frame->metadata); | 157 UpdateFrameMetaData(frame->metadata); |
144 | 158 |
145 SkBitmap bitmap; | 159 SkBitmap bitmap; |
146 if (!bitmap.installPixels(info, shm.memory(), stride)) | 160 if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride)) |
147 return false; | 161 return false; |
148 | 162 |
149 { | 163 { |
150 TRACE_EVENT0("browser", "DrawBitmap"); | 164 TRACE_EVENT0("browser", "DrawBitmap"); |
151 canvas->save(); | 165 canvas->save(); |
152 canvas->resetMatrix(); | 166 canvas->resetMatrix(); |
153 canvas->drawBitmap(bitmap, 0, 0); | 167 canvas->drawBitmap(bitmap, 0, 0); |
154 canvas->restore(); | 168 canvas->restore(); |
155 } | 169 } |
156 | 170 |
157 return true; | 171 return true; |
158 } | 172 } |
159 | 173 |
174 void SynchronousCompositorHost::SetSoftwareDrawSharedMemoryIfNeeded( | |
175 size_t stride, | |
176 size_t buffer_size) { | |
177 if (software_draw_shm_ && software_draw_shm_->stride == stride && | |
178 software_draw_shm_->buffer_size == buffer_size) | |
179 return; | |
180 software_draw_shm_.reset(); | |
181 scoped_ptr<SharedMemoryWithSize> software_draw_shm( | |
182 new SharedMemoryWithSize(stride, buffer_size)); | |
183 { | |
184 TRACE_EVENT1("browser", "AllocateSharedMemory", "buffer_size", buffer_size); | |
185 if (!software_draw_shm->shm.CreateAndMapAnonymous(buffer_size)) | |
186 return; | |
187 } | |
188 | |
189 SyncCompositorSetSharedMemoryParams set_shm_params; | |
190 set_shm_params.buffer_size = buffer_size; | |
191 base::ProcessHandle renderer_process_handle = | |
192 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); | |
193 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle, | |
194 &set_shm_params.shm_handle)) { | |
195 return; | |
196 } | |
197 | |
198 SyncCompositorCommonBrowserParams common_browser_params; | |
199 PopulateCommonParams(&common_browser_params); | |
200 bool success = false; | |
201 SyncCompositorCommonRendererParams common_renderer_params; | |
202 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory( | |
203 routing_id_, common_browser_params, set_shm_params, &success, | |
204 &common_renderer_params)) || | |
205 !success) { | |
206 return; | |
207 } | |
208 software_draw_shm_ = std::move(software_draw_shm); | |
dcheng
2015/12/29 00:00:24
#include <utility>
boliu
2015/12/29 00:16:30
Done.
| |
209 ProcessCommonParams(common_renderer_params); | |
210 } | |
211 | |
212 void SynchronousCompositorHost::SendZeroMemory() { | |
213 // No need to check return value. | |
214 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); | |
215 } | |
216 | |
160 void SynchronousCompositorHost::ReturnResources( | 217 void SynchronousCompositorHost::ReturnResources( |
161 const cc::CompositorFrameAck& frame_ack) { | 218 const cc::CompositorFrameAck& frame_ack) { |
162 returned_resources_.insert(returned_resources_.end(), | 219 returned_resources_.insert(returned_resources_.end(), |
163 frame_ack.resources.begin(), | 220 frame_ack.resources.begin(), |
164 frame_ack.resources.end()); | 221 frame_ack.resources.end()); |
165 } | 222 } |
166 | 223 |
167 void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) { | 224 void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) { |
168 if (bytes_limit_ == bytes_limit) | 225 if (bytes_limit_ == bytes_limit) |
169 return; | 226 return; |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
311 params.scrollable_size, params.page_scale_factor, | 368 params.scrollable_size, params.page_scale_factor, |
312 params.min_page_scale_factor, params.max_page_scale_factor); | 369 params.min_page_scale_factor, params.max_page_scale_factor); |
313 } | 370 } |
314 } | 371 } |
315 | 372 |
316 void SynchronousCompositorHost::UpdateNeedsBeginFrames() { | 373 void SynchronousCompositorHost::UpdateNeedsBeginFrames() { |
317 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_); | 374 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_); |
318 } | 375 } |
319 | 376 |
320 } // namespace content | 377 } // namespace content |
OLD | NEW |