Chromium Code Reviews| Index: chrome/gpu/gpu_command_buffer_stub.cc |
| =================================================================== |
| --- chrome/gpu/gpu_command_buffer_stub.cc (revision 65702) |
| +++ chrome/gpu/gpu_command_buffer_stub.cc (working copy) |
| @@ -14,6 +14,8 @@ |
| using gpu::Buffer; |
| +#define kCompositorWindowOwner L"kCompositorWindowOwner" |
| + |
| GpuCommandBufferStub::GpuCommandBufferStub( |
| GpuChannel* channel, |
| gfx::PluginWindowHandle handle, |
| @@ -38,10 +40,115 @@ |
| render_view_id_(render_view_id) { |
| } |
| +#if defined(OS_WIN) |
| +static LRESULT CALLBACK CompositorWindowProc( |
| + HWND hWnd, |
|
jam
2010/11/12 18:08:00
nit: hwnd
nduca
2010/11/12 19:45:32
Done.
|
| + UINT message, |
| + WPARAM wparam, |
| + LPARAM lparam) { |
| + switch (message) { |
| + case WM_ERASEBKGND: |
|
jam
2010/11/12 18:08:00
nit: the case should be indented in
nduca
2010/11/12 19:45:32
Done.
|
| + return 0; |
| + case WM_DESTROY: |
| + return 0; |
| + case WM_PAINT: |
| + { |
|
jam
2010/11/12 18:08:00
nit: i think you have extra indentation here
nduca
2010/11/12 19:45:32
Done.
|
| + PAINTSTRUCT paint; |
| + BeginPaint(hWnd, &paint); |
| + HANDLE h = GetProp(hWnd, kCompositorWindowOwner); |
| + GpuCommandBufferStub* stub = reinterpret_cast<GpuCommandBufferStub*>(h); |
| + stub->OnCompositorWindowPainted(); |
| + EndPaint(hWnd, &paint); |
| + } |
| + break; |
| + default: |
| + return DefWindowProc(hWnd, message, wparam, lparam); |
| + } |
| + return 0; |
| +} |
| + |
| +void GpuCommandBufferStub::CreateCompositorWindow() { |
| + DCHECK(handle_ != gfx::kNullPluginWindow); |
| + |
| + // Ask the browser to create the the host window. |
| + ChildThread* gpu_thread = ChildThread::current(); |
| + gfx::PluginWindowHandle host_window_id; |
| + gpu_thread->Send(new GpuHostMsg_CreateCompositorHostWindow( |
| + renderer_id_, |
| + render_view_id_, |
| + &host_window_id)); |
| + HWND host_window = static_cast<HWND>(host_window_id); |
| + |
| + // Create the compositor window itself. |
| + DCHECK(host_window); |
| + static ATOM window_class = 0; |
| + if (!window_class) { |
| + WNDCLASSEX wcex; |
| + wcex.cbSize = sizeof(wcex); |
| + wcex.style = 0; |
| + wcex.lpfnWndProc = CompositorWindowProc; |
| + wcex.cbClsExtra = 0; |
| + wcex.cbWndExtra = 0; |
| + wcex.hInstance = GetModuleHandle(NULL); |
| + wcex.hIcon = 0; |
| + wcex.hCursor = 0; |
| + wcex.hbrBackground = NULL; |
| + wcex.lpszMenuName = 0; |
| + wcex.lpszClassName = L"CompositorWindowClass"; |
| + wcex.hIconSm = 0; |
| + window_class = RegisterClassEx(&wcex); |
| + DCHECK(window_class); |
| + } |
| + |
| + HWND compositor_window = CreateWindowEx( |
| + WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR, |
|
jam
2010/11/12 18:08:00
nit: need 4 spaces for indentation
nduca
2010/11/12 19:45:32
Done.
|
| + MAKEINTATOM(window_class), |
| + 0, |
| + WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_DISABLED, |
| + 0/*x*/, 0/*y*/, |
|
jam
2010/11/12 18:08:00
nit: i don't see this pattern of commenting input
nduca
2010/11/12 19:45:32
I tend to agree.
|
| + 0/*nWidth*/, 0/*nHeight*/, |
| + host_window, |
| + 0, |
| + GetModuleHandle(NULL), |
| + 0); |
| + DCHECK(compositor_window); |
| + SetProp(compositor_window, kCompositorWindowOwner, |
| + reinterpret_cast<HANDLE>(this)); |
| + |
| + RECT parent_rect; |
| + GetClientRect(host_window, &parent_rect); |
| + |
| + UINT flags = SWP_NOSENDCHANGING | SWP_NOCOPYBITS | SWP_NOZORDER | |
| + SWP_NOACTIVATE | SWP_DEFERERASE | SWP_SHOWWINDOW; |
| + SetWindowPos(compositor_window, |
| + NULL, |
| + 0/*x*/, 0/*y*/, |
| + parent_rect.right - parent_rect.left, |
| + parent_rect.bottom - parent_rect.top, |
| + flags); |
| + compositor_window_ = static_cast<gfx::PluginWindowHandle>(compositor_window); |
| +} |
| + |
| +void GpuCommandBufferStub::OnCompositorWindowPainted() |
| +{ |
|
jam
2010/11/12 18:08:00
nit: brace bracket on previous line
nduca
2010/11/12 19:45:32
Done.
|
| + ChildThread* gpu_thread = ChildThread::current(); |
| + gpu_thread->Send(new GpuHostMsg_ScheduleComposite( |
| + renderer_id_, render_view_id_)); |
| +} |
| +#endif // defined(OS_WIN) |
| + |
| + |
| GpuCommandBufferStub::~GpuCommandBufferStub() { |
| if (processor_.get()) { |
| processor_->Destroy(); |
| } |
| +#if defined(OS_WIN) |
| + if (compositor_window_) { |
| + RemoveProp(compositor_window_, kCompositorWindowOwner); |
| + DestroyWindow(static_cast<HWND>(compositor_window_)); |
| + compositor_window_ = NULL; |
| + } |
| +#endif |
| } |
| void GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) { |
| @@ -79,6 +186,14 @@ |
| command_buffer_.reset(new gpu::CommandBufferService); |
| + // Create the child window, if needed |
| +#if defined(OS_WIN) |
| + CreateCompositorWindow(); |
| + gfx::PluginWindowHandle output_window_handle = compositor_window_; |
| +#else |
| + gfx::PluginWindowHandle output_window_handle = handle_; |
| +#endif |
| + |
| // Initialize the CommandBufferService and GPUProcessor. |
| if (command_buffer_->Initialize(size)) { |
| Buffer buffer = command_buffer_->GetRingBuffer(); |
| @@ -87,7 +202,7 @@ |
| parent_ ? parent_->processor_.get() : NULL; |
| processor_.reset(new gpu::GPUProcessor(command_buffer_.get(), NULL)); |
| if (processor_->Initialize( |
| - handle_, |
| + output_window_handle, |
| initial_size_, |
| allowed_extensions_.c_str(), |
| requested_attribs_, |