 Chromium Code Reviews
 Chromium Code Reviews Issue 4815001:
  Use inner HWND for accelerated rendering on windows  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src/
    
  
    Issue 4815001:
  Use inner HWND for accelerated rendering on windows  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src/| 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_, |