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

Side by Side Diff: content/browser/renderer_host/render_process_host_impl.cc

Issue 542083002: content: Move all GpuMemoryBuffer allocation to IO thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address review feedback Created 6 years, 3 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
« no previous file with comments | « content/browser/renderer_host/render_process_host_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // Represents the browser side of the browser <--> renderer communication 5 // Represents the browser side of the browser <--> renderer communication
6 // channel. There will be one RenderProcessHost per renderer process. 6 // channel. There will be one RenderProcessHost per renderer process.
7 7
8 #include "content/browser/renderer_host/render_process_host_impl.h" 8 #include "content/browser/renderer_host/render_process_host_impl.h"
9 9
10 #include <algorithm> 10 #include <algorithm>
11 #include <limits> 11 #include <limits>
12 #include <vector> 12 #include <vector>
13 13
14 #if defined(OS_POSIX) 14 #if defined(OS_POSIX)
15 #include <utility> // for pair<> 15 #include <utility> // for pair<>
16 #endif 16 #endif
17 17
18 #include "base/base_switches.h" 18 #include "base/base_switches.h"
19 #include "base/bind.h" 19 #include "base/bind.h"
20 #include "base/bind_helpers.h" 20 #include "base/bind_helpers.h"
21 #include "base/callback.h" 21 #include "base/callback.h"
22 #include "base/command_line.h" 22 #include "base/command_line.h"
23 #include "base/debug/trace_event.h" 23 #include "base/debug/trace_event.h"
24 #include "base/files/file.h" 24 #include "base/files/file.h"
25 #include "base/lazy_instance.h" 25 #include "base/lazy_instance.h"
26 #include "base/logging.h" 26 #include "base/logging.h"
27 #include "base/metrics/field_trial.h" 27 #include "base/metrics/field_trial.h"
28 #include "base/metrics/histogram.h" 28 #include "base/metrics/histogram.h"
29 #include "base/numerics/safe_math.h"
30 #include "base/path_service.h" 29 #include "base/path_service.h"
31 #include "base/process/process_handle.h" 30 #include "base/process/process_handle.h"
32 #include "base/rand_util.h" 31 #include "base/rand_util.h"
33 #include "base/stl_util.h" 32 #include "base/stl_util.h"
34 #include "base/strings/string_number_conversions.h" 33 #include "base/strings/string_number_conversions.h"
35 #include "base/strings/string_util.h" 34 #include "base/strings/string_util.h"
36 #include "base/supports_user_data.h" 35 #include "base/supports_user_data.h"
37 #include "base/sys_info.h" 36 #include "base/sys_info.h"
38 #include "base/threading/thread.h" 37 #include "base/threading/thread.h"
39 #include "base/threading/thread_restrictions.h" 38 #include "base/threading/thread_restrictions.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 #include "content/browser/shared_worker/worker_storage_partition.h" 101 #include "content/browser/shared_worker/worker_storage_partition.h"
103 #include "content/browser/speech/speech_recognition_dispatcher_host.h" 102 #include "content/browser/speech/speech_recognition_dispatcher_host.h"
104 #include "content/browser/storage_partition_impl.h" 103 #include "content/browser/storage_partition_impl.h"
105 #include "content/browser/streams/stream_context.h" 104 #include "content/browser/streams/stream_context.h"
106 #include "content/browser/tracing/trace_message_filter.h" 105 #include "content/browser/tracing/trace_message_filter.h"
107 #include "content/browser/vibration/vibration_message_filter.h" 106 #include "content/browser/vibration/vibration_message_filter.h"
108 #include "content/browser/webui/web_ui_controller_factory_registry.h" 107 #include "content/browser/webui/web_ui_controller_factory_registry.h"
109 #include "content/common/child_process_host_impl.h" 108 #include "content/common/child_process_host_impl.h"
110 #include "content/common/child_process_messages.h" 109 #include "content/common/child_process_messages.h"
111 #include "content/common/content_switches_internal.h" 110 #include "content/common/content_switches_internal.h"
112 #include "content/common/gpu/client/gpu_memory_buffer_impl.h"
113 #include "content/common/gpu/gpu_messages.h" 111 #include "content/common/gpu/gpu_messages.h"
114 #include "content/common/mojo/mojo_messages.h" 112 #include "content/common/mojo/mojo_messages.h"
115 #include "content/common/resource_messages.h" 113 #include "content/common/resource_messages.h"
116 #include "content/common/view_messages.h" 114 #include "content/common/view_messages.h"
117 #include "content/public/browser/browser_context.h" 115 #include "content/public/browser/browser_context.h"
118 #include "content/public/browser/content_browser_client.h" 116 #include "content/public/browser/content_browser_client.h"
119 #include "content/public/browser/notification_service.h" 117 #include "content/public/browser/notification_service.h"
120 #include "content/public/browser/notification_types.h" 118 #include "content/public/browser/notification_types.h"
121 #include "content/public/browser/render_process_host_factory.h" 119 #include "content/public/browser/render_process_host_factory.h"
122 #include "content/public/browser/render_process_host_observer.h" 120 #include "content/public/browser/render_process_host_observer.h"
(...skipping 21 matching lines...) Expand all
144 #include "third_party/skia/include/core/SkBitmap.h" 142 #include "third_party/skia/include/core/SkBitmap.h"
145 #include "ui/base/ui_base_switches.h" 143 #include "ui/base/ui_base_switches.h"
146 #include "ui/events/event_switches.h" 144 #include "ui/events/event_switches.h"
147 #include "ui/gfx/switches.h" 145 #include "ui/gfx/switches.h"
148 #include "ui/gl/gl_switches.h" 146 #include "ui/gl/gl_switches.h"
149 #include "ui/native_theme/native_theme_switches.h" 147 #include "ui/native_theme/native_theme_switches.h"
150 #include "webkit/browser/fileapi/sandbox_file_system_backend.h" 148 #include "webkit/browser/fileapi/sandbox_file_system_backend.h"
151 149
152 #if defined(OS_ANDROID) 150 #if defined(OS_ANDROID)
153 #include "content/browser/media/android/browser_demuxer_android.h" 151 #include "content/browser/media/android/browser_demuxer_android.h"
154 #include "content/browser/renderer_host/compositor_impl_android.h"
155 #include "content/browser/screen_orientation/screen_orientation_message_filter_a ndroid.h" 152 #include "content/browser/screen_orientation/screen_orientation_message_filter_a ndroid.h"
156 #include "content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.h"
157 #endif
158
159 #if defined(OS_MACOSX)
160 #include "content/common/gpu/client/gpu_memory_buffer_impl_io_surface.h"
161 #endif 153 #endif
162 154
163 #if defined(OS_WIN) 155 #if defined(OS_WIN)
164 #include "base/win/scoped_com_initializer.h" 156 #include "base/win/scoped_com_initializer.h"
165 #include "content/common/font_cache_dispatcher_win.h" 157 #include "content/common/font_cache_dispatcher_win.h"
166 #include "content/common/sandbox_win.h" 158 #include "content/common/sandbox_win.h"
167 #include "ui/gfx/win/dpi.h" 159 #include "ui/gfx/win/dpi.h"
168 #endif 160 #endif
169 161
170 #if defined(ENABLE_PLUGINS) 162 #if defined(ENABLE_PLUGINS)
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 return ipc_fd_; 325 return ipc_fd_;
334 } 326 }
335 #endif // OS_WIN 327 #endif // OS_WIN
336 328
337 private: 329 private:
338 #if defined(OS_POSIX) 330 #if defined(OS_POSIX)
339 int ipc_fd_; 331 int ipc_fd_;
340 #endif // OS_POSIX 332 #endif // OS_POSIX
341 }; 333 };
342 334
343 #if defined(OS_MACOSX)
344 void AddBooleanValue(CFMutableDictionaryRef dictionary,
345 const CFStringRef key,
346 bool value) {
347 CFDictionaryAddValue(
348 dictionary, key, value ? kCFBooleanTrue : kCFBooleanFalse);
349 }
350
351 void AddIntegerValue(CFMutableDictionaryRef dictionary,
352 const CFStringRef key,
353 int32 value) {
354 base::ScopedCFTypeRef<CFNumberRef> number(
355 CFNumberCreate(NULL, kCFNumberSInt32Type, &value));
356 CFDictionaryAddValue(dictionary, key, number.get());
357 }
358 #endif
359
360 const char kSessionStorageHolderKey[] = "kSessionStorageHolderKey"; 335 const char kSessionStorageHolderKey[] = "kSessionStorageHolderKey";
361 336
362 class SessionStorageHolder : public base::SupportsUserData::Data { 337 class SessionStorageHolder : public base::SupportsUserData::Data {
363 public: 338 public:
364 SessionStorageHolder() {} 339 SessionStorageHolder() {}
365 virtual ~SessionStorageHolder() {} 340 virtual ~SessionStorageHolder() {}
366 341
367 void Hold(const SessionStorageNamespaceMap& sessions, int view_route_id) { 342 void Hold(const SessionStorageNamespaceMap& sessions, int view_route_id) {
368 session_storage_namespaces_awaiting_close_[view_route_id] = sessions; 343 session_storage_namespaces_awaiting_close_[view_route_id] = sessions;
369 } 344 }
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 queued_messages_.pop(); 527 queued_messages_.pop();
553 } 528 }
554 529
555 UnregisterHost(GetID()); 530 UnregisterHost(GetID());
556 531
557 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( 532 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
558 switches::kDisableGpuShaderDiskCache)) { 533 switches::kDisableGpuShaderDiskCache)) {
559 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 534 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
560 base::Bind(&RemoveShaderInfo, GetID())); 535 base::Bind(&RemoveShaderInfo, GetID()));
561 } 536 }
562
563 #if defined(OS_ANDROID)
564 CompositorImpl::DestroyAllSurfaceTextures(GetID());
565 #endif
566 } 537 }
567 538
568 void RenderProcessHostImpl::EnableSendQueue() { 539 void RenderProcessHostImpl::EnableSendQueue() {
569 is_initialized_ = false; 540 is_initialized_ = false;
570 } 541 }
571 542
572 bool RenderProcessHostImpl::Init() { 543 bool RenderProcessHostImpl::Init() {
573 // calling Init() more than once does nothing, this makes it more convenient 544 // calling Init() more than once does nothing, this makes it more convenient
574 // for the view host which may not be sure in some cases 545 // for the view host which may not be sure in some cases
575 if (channel_) 546 if (channel_)
(...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after
1381 IPC_BEGIN_MESSAGE_MAP(RenderProcessHostImpl, msg) 1352 IPC_BEGIN_MESSAGE_MAP(RenderProcessHostImpl, msg)
1382 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ShutdownRequest, 1353 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ShutdownRequest,
1383 OnShutdownRequest) 1354 OnShutdownRequest)
1384 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_DumpHandlesDone, 1355 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_DumpHandlesDone,
1385 OnDumpHandlesDone) 1356 OnDumpHandlesDone)
1386 IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged, 1357 IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged,
1387 SuddenTerminationChanged) 1358 SuddenTerminationChanged)
1388 IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction, 1359 IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction,
1389 OnUserMetricsRecordAction) 1360 OnUserMetricsRecordAction)
1390 IPC_MESSAGE_HANDLER(ViewHostMsg_SavedPageAsMHTML, OnSavedPageAsMHTML) 1361 IPC_MESSAGE_HANDLER(ViewHostMsg_SavedPageAsMHTML, OnSavedPageAsMHTML)
1391 IPC_MESSAGE_HANDLER_DELAY_REPLY(
1392 ChildProcessHostMsg_SyncAllocateGpuMemoryBuffer,
1393 OnAllocateGpuMemoryBuffer)
1394 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_DeletedGpuMemoryBuffer,
1395 OnDeletedGpuMemoryBuffer)
1396 IPC_MESSAGE_HANDLER(ViewHostMsg_Close_ACK, OnCloseACK) 1362 IPC_MESSAGE_HANDLER(ViewHostMsg_Close_ACK, OnCloseACK)
1397 #if defined(ENABLE_WEBRTC) 1363 #if defined(ENABLE_WEBRTC)
1398 IPC_MESSAGE_HANDLER(AecDumpMsg_RegisterAecDumpConsumer, 1364 IPC_MESSAGE_HANDLER(AecDumpMsg_RegisterAecDumpConsumer,
1399 OnRegisterAecDumpConsumer) 1365 OnRegisterAecDumpConsumer)
1400 IPC_MESSAGE_HANDLER(AecDumpMsg_UnregisterAecDumpConsumer, 1366 IPC_MESSAGE_HANDLER(AecDumpMsg_UnregisterAecDumpConsumer,
1401 OnUnregisterAecDumpConsumer) 1367 OnUnregisterAecDumpConsumer)
1402 #endif 1368 #endif
1403 // Adding single handlers for your service here is fine, but once your 1369 // Adding single handlers for your service here is fine, but once your
1404 // service needs more than one handler, please extract them into a new 1370 // service needs more than one handler, please extract them into a new
1405 // message filter and add that filter to CreateMessageFilters(). 1371 // message filter and add that filter to CreateMessageFilters().
(...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after
2258 --worker_ref_count_; 2224 --worker_ref_count_;
2259 if (worker_ref_count_ == 0) 2225 if (worker_ref_count_ == 0)
2260 Cleanup(); 2226 Cleanup();
2261 } 2227 }
2262 2228
2263 void RenderProcessHostImpl::EnsureMojoActivated() { 2229 void RenderProcessHostImpl::EnsureMojoActivated() {
2264 mojo_activation_required_ = true; 2230 mojo_activation_required_ = true;
2265 MaybeActivateMojo(); 2231 MaybeActivateMojo();
2266 } 2232 }
2267 2233
2268 void RenderProcessHostImpl::OnAllocateGpuMemoryBuffer(uint32 width,
2269 uint32 height,
2270 uint32 internalformat,
2271 uint32 usage,
2272 IPC::Message* reply) {
2273 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2274 if (!GpuMemoryBufferImpl::IsFormatValid(internalformat) ||
2275 !GpuMemoryBufferImpl::IsUsageValid(usage)) {
2276 GpuMemoryBufferAllocated(reply, gfx::GpuMemoryBufferHandle());
2277 return;
2278 }
2279 base::CheckedNumeric<int> size = width;
2280 size *= height;
2281 if (!size.IsValid()) {
2282 GpuMemoryBufferAllocated(reply, gfx::GpuMemoryBufferHandle());
2283 return;
2284 }
2285
2286 #if defined(OS_MACOSX)
2287 // TODO(reveman): This should be moved to
2288 // GpuMemoryBufferImpl::AllocateForChildProcess and
2289 // GpuMemoryBufferImplIOSurface. crbug.com/325045, crbug.com/323304
2290 if (GpuMemoryBufferImplIOSurface::IsConfigurationSupported(internalformat,
2291 usage)) {
2292 base::ScopedCFTypeRef<CFMutableDictionaryRef> properties;
2293 properties.reset(
2294 CFDictionaryCreateMutable(kCFAllocatorDefault,
2295 0,
2296 &kCFTypeDictionaryKeyCallBacks,
2297 &kCFTypeDictionaryValueCallBacks));
2298 AddIntegerValue(properties, kIOSurfaceWidth, width);
2299 AddIntegerValue(properties, kIOSurfaceHeight, height);
2300 AddIntegerValue(properties,
2301 kIOSurfaceBytesPerElement,
2302 GpuMemoryBufferImpl::BytesPerPixel(internalformat));
2303 AddIntegerValue(
2304 properties,
2305 kIOSurfacePixelFormat,
2306 GpuMemoryBufferImplIOSurface::PixelFormat(internalformat));
2307 // TODO(reveman): Remove this when using a mach_port_t to transfer
2308 // IOSurface to renderer process. crbug.com/323304
2309 AddBooleanValue(
2310 properties, kIOSurfaceIsGlobal, true);
2311
2312 base::ScopedCFTypeRef<IOSurfaceRef> io_surface(IOSurfaceCreate(properties));
2313 if (io_surface) {
2314 gfx::GpuMemoryBufferHandle handle;
2315 handle.type = gfx::IO_SURFACE_BUFFER;
2316 handle.io_surface_id = IOSurfaceGetID(io_surface);
2317
2318 // TODO(reveman): This makes the assumption that the renderer will
2319 // grab a reference to the surface before sending another message.
2320 // crbug.com/325045
2321 last_io_surface_ = io_surface;
2322 GpuMemoryBufferAllocated(reply, handle);
2323 return;
2324 }
2325 }
2326 #endif
2327
2328 #if defined(OS_ANDROID)
2329 // TODO(reveman): This should be moved to
2330 // GpuMemoryBufferImpl::AllocateForChildProcess and
2331 // GpuMemoryBufferImplSurfaceTexture when adding support for out-of-process
2332 // GPU service. crbug.com/368716
2333 if (GpuMemoryBufferImplSurfaceTexture::IsConfigurationSupported(
2334 internalformat, usage)) {
2335 // Each surface texture is associated with a render process id. This allows
2336 // the GPU service and Java Binder IPC to verify that a renderer is not
2337 // trying to use a surface texture it doesn't own.
2338 int surface_texture_id = CompositorImpl::CreateSurfaceTexture(GetID());
2339 if (surface_texture_id != -1) {
2340 gfx::GpuMemoryBufferHandle handle;
2341 handle.type = gfx::SURFACE_TEXTURE_BUFFER;
2342 handle.surface_texture_id =
2343 gfx::SurfaceTextureId(surface_texture_id, GetID());
2344 GpuMemoryBufferAllocated(reply, handle);
2345 return;
2346 }
2347 }
2348 #endif
2349
2350 GpuMemoryBufferImpl::AllocateForChildProcess(
2351 gfx::Size(width, height),
2352 internalformat,
2353 usage,
2354 GetHandle(),
2355 GetID(),
2356 base::Bind(&RenderProcessHostImpl::GpuMemoryBufferAllocated,
2357 weak_factory_.GetWeakPtr(),
2358 reply));
2359 }
2360
2361 void RenderProcessHostImpl::GpuMemoryBufferAllocated(
2362 IPC::Message* reply,
2363 const gfx::GpuMemoryBufferHandle& handle) {
2364 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2365 ChildProcessHostMsg_SyncAllocateGpuMemoryBuffer::WriteReplyParams(reply,
2366 handle);
2367 Send(reply);
2368 }
2369
2370 void RenderProcessHostImpl::OnDeletedGpuMemoryBuffer(
2371 gfx::GpuMemoryBufferType type,
2372 const gfx::GpuMemoryBufferId& id) {
2373 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2374 GpuMemoryBufferImpl::DeletedByChildProcess(type, id, GetHandle());
2375 }
2376
2377 } // namespace content 2234 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_process_host_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698