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

Side by Side Diff: chrome/gpu/gpu_command_buffer_stub.cc

Issue 4815001: Use inner HWND for accelerated rendering on windows (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #if defined(ENABLE_GPU) 5 #if defined(ENABLE_GPU)
6 6
7 #include "base/process_util.h" 7 #include "base/process_util.h"
8 #include "base/shared_memory.h" 8 #include "base/shared_memory.h"
9 #include "build/build_config.h" 9 #include "build/build_config.h"
10 #include "chrome/common/child_thread.h" 10 #include "chrome/common/child_thread.h"
11 #include "chrome/common/gpu_messages.h" 11 #include "chrome/common/gpu_messages.h"
12 #include "chrome/gpu/gpu_channel.h" 12 #include "chrome/gpu/gpu_channel.h"
13 #include "chrome/gpu/gpu_command_buffer_stub.h" 13 #include "chrome/gpu/gpu_command_buffer_stub.h"
14 14
15 using gpu::Buffer; 15 using gpu::Buffer;
16 16
17 #define kCompositorWindowOwner L"kCompositorWindowOwner"
apatrick_chromium 2010/11/19 23:09:51 nit: make this const wchar_t[]
nduca 2010/11/20 00:28:49 Other code that does this follows the define patte
18
17 GpuCommandBufferStub::GpuCommandBufferStub( 19 GpuCommandBufferStub::GpuCommandBufferStub(
18 GpuChannel* channel, 20 GpuChannel* channel,
19 gfx::PluginWindowHandle handle, 21 gfx::PluginWindowHandle handle,
20 GpuCommandBufferStub* parent, 22 GpuCommandBufferStub* parent,
21 const gfx::Size& size, 23 const gfx::Size& size,
22 const std::string& allowed_extensions, 24 const std::string& allowed_extensions,
23 const std::vector<int32>& attribs, 25 const std::vector<int32>& attribs,
24 uint32 parent_texture_id, 26 uint32 parent_texture_id,
25 int32 route_id, 27 int32 route_id,
26 int32 renderer_id, 28 int32 renderer_id,
27 int32 render_view_id) 29 int32 render_view_id)
28 : channel_(channel), 30 : channel_(channel),
29 handle_(handle), 31 handle_(handle),
30 parent_( 32 parent_(
31 parent ? parent->AsWeakPtr() : base::WeakPtr<GpuCommandBufferStub>()), 33 parent ? parent->AsWeakPtr() : base::WeakPtr<GpuCommandBufferStub>()),
32 initial_size_(size), 34 initial_size_(size),
33 allowed_extensions_(allowed_extensions), 35 allowed_extensions_(allowed_extensions),
34 requested_attribs_(attribs), 36 requested_attribs_(attribs),
35 parent_texture_id_(parent_texture_id), 37 parent_texture_id_(parent_texture_id),
36 route_id_(route_id), 38 route_id_(route_id),
37 renderer_id_(renderer_id), 39 renderer_id_(renderer_id),
38 render_view_id_(render_view_id) { 40 render_view_id_(render_view_id) {
39 } 41 }
40 42
43 #if defined(OS_WIN)
44 static LRESULT CALLBACK CompositorWindowProc(
45 HWND hwnd,
46 UINT message,
47 WPARAM wparam,
48 LPARAM lparam) {
49 switch (message) {
50 case WM_ERASEBKGND:
51 return 0;
52 case WM_DESTROY:
53 return 0;
54 case WM_PAINT: {
55 PAINTSTRUCT paint;
56 BeginPaint(hwnd, &paint);
apatrick_chromium 2010/11/19 23:09:51 Check this doesn't return null and don't call EndP
nduca 2010/11/20 00:28:49 Done.
57 HANDLE h = GetProp(hwnd, kCompositorWindowOwner);
apatrick_chromium 2010/11/19 23:09:51 Check this does not return null before calling OnC
nduca 2010/11/20 00:28:49 Done.
58 GpuCommandBufferStub* stub = reinterpret_cast<GpuCommandBufferStub*>(h);
59 stub->OnCompositorWindowPainted();
60 EndPaint(hwnd, &paint);
61 break;
62 }
63 default:
64 return DefWindowProc(hwnd, message, wparam, lparam);
65 }
66 return 0;
67 }
68
69 void GpuCommandBufferStub::CreateCompositorWindow() {
70 DCHECK(handle_ != gfx::kNullPluginWindow);
71
72 // Ask the browser to create the the host window.
73 ChildThread* gpu_thread = ChildThread::current();
apatrick_chromium 2010/11/19 23:09:51 nit: add a pointer from GpuCommandBufferStub to Gp
nduca 2010/11/20 00:28:49 I don't see why that would affect this call. Are y
74 gfx::PluginWindowHandle host_window_id;
75 gpu_thread->Send(new GpuHostMsg_CreateCompositorHostWindow(
76 renderer_id_,
77 render_view_id_,
78 &host_window_id));
79 HWND host_window = static_cast<HWND>(host_window_id);
apatrick_chromium 2010/11/19 23:09:51 If Send fails, host_window_id will be uninitialize
nduca 2010/11/20 00:28:49 If send fails, it means browser is dead. We're ter
80
81 // Create the compositor window itself.
82 DCHECK(host_window);
83 static ATOM window_class = 0;
84 if (!window_class) {
85 WNDCLASSEX wcex;
86 wcex.cbSize = sizeof(wcex);
87 wcex.style = 0;
88 wcex.lpfnWndProc = CompositorWindowProc;
89 wcex.cbClsExtra = 0;
90 wcex.cbWndExtra = 0;
91 wcex.hInstance = GetModuleHandle(NULL);
92 wcex.hIcon = 0;
93 wcex.hCursor = 0;
94 wcex.hbrBackground = NULL;
95 wcex.lpszMenuName = 0;
96 wcex.lpszClassName = L"CompositorWindowClass";
97 wcex.hIconSm = 0;
98 window_class = RegisterClassEx(&wcex);
99 DCHECK(window_class);
100 }
101
102 HWND compositor_window = CreateWindowEx(
103 WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR,
104 MAKEINTATOM(window_class),
105 0,
106 WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_DISABLED,
107 0, 0,
108 0, 0,
109 host_window,
110 0,
111 GetModuleHandle(NULL),
112 0);
113 DCHECK(compositor_window);
apatrick_chromium 2010/11/19 23:09:51 I think this might legitimately fail. It might be
nduca 2010/11/20 00:28:49 Done.
114 SetProp(compositor_window, kCompositorWindowOwner,
115 reinterpret_cast<HANDLE>(this));
116
117 RECT parent_rect;
118 GetClientRect(host_window, &parent_rect);
apatrick_chromium 2010/11/19 23:09:51 If the host window is destroyed for any reason, th
nduca 2010/11/20 00:28:49 Done.
119
120 UINT flags = SWP_NOSENDCHANGING | SWP_NOCOPYBITS | SWP_NOZORDER |
121 SWP_NOACTIVATE | SWP_DEFERERASE | SWP_SHOWWINDOW;
122 SetWindowPos(compositor_window,
apatrick_chromium 2010/11/19 23:09:51 nit: can you drop this argument to the next line a
123 NULL,
124 0, 0,
125 parent_rect.right - parent_rect.left,
126 parent_rect.bottom - parent_rect.top,
127 flags);
128 compositor_window_ = static_cast<gfx::PluginWindowHandle>(compositor_window);
129 }
130
131 void GpuCommandBufferStub::OnCompositorWindowPainted() {
132 ChildThread* gpu_thread = ChildThread::current();
apatrick_chromium 2010/11/19 23:09:51 See comment about GpuThread above.
nduca 2010/11/20 00:28:49 Not sold on this being necessary.
133 gpu_thread->Send(new GpuHostMsg_ScheduleComposite(
134 renderer_id_, render_view_id_));
135 }
136 #endif // defined(OS_WIN)
137
138
41 GpuCommandBufferStub::~GpuCommandBufferStub() { 139 GpuCommandBufferStub::~GpuCommandBufferStub() {
42 if (processor_.get()) { 140 if (processor_.get()) {
43 processor_->Destroy(); 141 processor_->Destroy();
44 } 142 }
143 #if defined(OS_WIN)
144 if (compositor_window_) {
145 RemoveProp(compositor_window_, kCompositorWindowOwner);
146 DestroyWindow(static_cast<HWND>(compositor_window_));
147 compositor_window_ = NULL;
148 }
149 #endif
45 } 150 }
46 151
47 void GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) { 152 void GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) {
48 IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message) 153 IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message)
49 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Initialize, OnInitialize); 154 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Initialize, OnInitialize);
50 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_GetState, OnGetState); 155 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_GetState, OnGetState);
51 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncGetState, OnAsyncGetState); 156 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncGetState, OnAsyncGetState);
52 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Flush, OnFlush); 157 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Flush, OnFlush);
53 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncFlush, OnAsyncFlush); 158 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncFlush, OnAsyncFlush);
54 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_CreateTransferBuffer, 159 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_CreateTransferBuffer,
(...skipping 17 matching lines...) Expand all
72 177
73 void GpuCommandBufferStub::OnInitialize( 178 void GpuCommandBufferStub::OnInitialize(
74 int32 size, 179 int32 size,
75 base::SharedMemoryHandle* ring_buffer) { 180 base::SharedMemoryHandle* ring_buffer) {
76 DCHECK(!command_buffer_.get()); 181 DCHECK(!command_buffer_.get());
77 182
78 *ring_buffer = base::SharedMemory::NULLHandle(); 183 *ring_buffer = base::SharedMemory::NULLHandle();
79 184
80 command_buffer_.reset(new gpu::CommandBufferService); 185 command_buffer_.reset(new gpu::CommandBufferService);
81 186
187 // Create the child window, if needed
188 #if defined(OS_WIN)
189 CreateCompositorWindow();
apatrick_chromium 2010/11/19 23:09:51 Check if this fails.
nduca 2010/11/20 00:28:49 Done.
190 gfx::PluginWindowHandle output_window_handle = compositor_window_;
191 #else
192 gfx::PluginWindowHandle output_window_handle = handle_;
193 #endif
194
82 // Initialize the CommandBufferService and GPUProcessor. 195 // Initialize the CommandBufferService and GPUProcessor.
83 if (command_buffer_->Initialize(size)) { 196 if (command_buffer_->Initialize(size)) {
84 Buffer buffer = command_buffer_->GetRingBuffer(); 197 Buffer buffer = command_buffer_->GetRingBuffer();
85 if (buffer.shared_memory) { 198 if (buffer.shared_memory) {
86 gpu::GPUProcessor* parent_processor = 199 gpu::GPUProcessor* parent_processor =
87 parent_ ? parent_->processor_.get() : NULL; 200 parent_ ? parent_->processor_.get() : NULL;
88 processor_.reset(new gpu::GPUProcessor(command_buffer_.get(), NULL)); 201 processor_.reset(new gpu::GPUProcessor(command_buffer_.get(), NULL));
89 if (processor_->Initialize( 202 if (processor_->Initialize(
90 handle_, 203 output_window_handle,
91 initial_size_, 204 initial_size_,
92 allowed_extensions_.c_str(), 205 allowed_extensions_.c_str(),
93 requested_attribs_, 206 requested_attribs_,
94 parent_processor, 207 parent_processor,
95 parent_texture_id_)) { 208 parent_texture_id_)) {
96 command_buffer_->SetPutOffsetChangeCallback( 209 command_buffer_->SetPutOffsetChangeCallback(
97 NewCallback(processor_.get(), 210 NewCallback(processor_.get(),
98 &gpu::GPUProcessor::ProcessCommands)); 211 &gpu::GPUProcessor::ProcessCommands));
99 processor_->SetSwapBuffersCallback( 212 processor_->SetSwapBuffersCallback(
100 NewCallback(this, &GpuCommandBufferStub::OnSwapBuffers)); 213 NewCallback(this, &GpuCommandBufferStub::OnSwapBuffers));
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 } 310 }
198 311
199 void GpuCommandBufferStub::SwapBuffersCallback() { 312 void GpuCommandBufferStub::SwapBuffersCallback() {
200 ChildThread* gpu_thread = ChildThread::current(); 313 ChildThread* gpu_thread = ChildThread::current();
201 gpu_thread->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped( 314 gpu_thread->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(
202 renderer_id_, render_view_id_, handle_, processor_->GetSurfaceId())); 315 renderer_id_, render_view_id_, handle_, processor_->GetSurfaceId()));
203 } 316 }
204 #endif // defined(OS_MACOSX) 317 #endif // defined(OS_MACOSX)
205 318
206 #endif // ENABLE_GPU 319 #endif // ENABLE_GPU
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698