Chromium Code Reviews| 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 |