Chromium Code Reviews| Index: gpu/ipc/service/child_window_surface_win.cc |
| diff --git a/gpu/ipc/service/child_window_surface_win.cc b/gpu/ipc/service/child_window_surface_win.cc |
| index e7f482064f415fc79b411130ba92e22067530d92..92a9392b1d5d2d337763f7dc33cbd56249701885 100644 |
| --- a/gpu/ipc/service/child_window_surface_win.cc |
| +++ b/gpu/ipc/service/child_window_surface_win.cc |
| @@ -8,15 +8,10 @@ |
| #include "base/compiler_specific.h" |
| #include "base/memory/ptr_util.h" |
| -#include "base/threading/thread.h" |
| -#include "base/win/scoped_hdc.h" |
| -#include "base/win/wrapped_window_proc.h" |
| #include "gpu/ipc/common/gpu_messages.h" |
| #include "gpu/ipc/service/gpu_channel_manager.h" |
| #include "gpu/ipc/service/gpu_channel_manager_delegate.h" |
| #include "ui/gfx/native_widget_types.h" |
| -#include "ui/gfx/win/hwnd_util.h" |
| -#include "ui/gfx/win/window_impl.h" |
| #include "ui/gl/egl_util.h" |
| #include "ui/gl/gl_context.h" |
| #include "ui/gl/gl_surface_egl.h" |
| @@ -24,144 +19,11 @@ |
| namespace gpu { |
| -// This owns the thread and contains data that's shared between the threads. |
| -struct SharedData { |
| - SharedData() : thread("Window owner thread") {} |
| - |
| - base::Lock rect_lock; |
| - gfx::Rect rect_to_clear; |
| - |
| - base::Thread thread; |
| -}; |
| - |
| -namespace { |
| - |
| -ATOM g_window_class; |
| - |
| -// This runs on the window owner thread. |
| -LRESULT CALLBACK IntermediateWindowProc(HWND window, |
| - UINT message, |
| - WPARAM w_param, |
| - LPARAM l_param) { |
| - switch (message) { |
| - case WM_ERASEBKGND: |
| - // Prevent windows from erasing the background. |
| - return 1; |
| - case WM_PAINT: |
| - PAINTSTRUCT paint; |
| - if (BeginPaint(window, &paint)) { |
| - SharedData* shared_data = |
| - reinterpret_cast<SharedData*>(gfx::GetWindowUserData(window)); |
| - DCHECK(shared_data); |
| - { |
| - base::AutoLock lock(shared_data->rect_lock); |
| - shared_data->rect_to_clear.Union(gfx::Rect(paint.rcPaint)); |
| - } |
| - |
| - EndPaint(window, &paint); |
| - } |
| - return 0; |
| - default: |
| - return DefWindowProc(window, message, w_param, l_param); |
| - } |
| -} |
| - |
| -// This runs on the window owner thread. |
| -void InitializeWindowClass() { |
| - if (g_window_class) |
| - return; |
| - |
| - WNDCLASSEX intermediate_class; |
| - base::win::InitializeWindowClass( |
| - L"Intermediate D3D Window", |
| - &base::win::WrappedWindowProc<IntermediateWindowProc>, CS_OWNDC, 0, 0, |
| - nullptr, reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH)), nullptr, |
| - nullptr, nullptr, &intermediate_class); |
| - g_window_class = RegisterClassEx(&intermediate_class); |
| - if (!g_window_class) { |
| - LOG(ERROR) << "RegisterClass failed."; |
| - return; |
| - } |
| -} |
| - |
| -// Hidden popup window used as a parent for the child surface window. |
| -// Must be created and destroyed on the thread. |
| -class HiddenPopupWindow : public gfx::WindowImpl { |
| - public: |
| - static HWND Create() { |
| - gfx::WindowImpl* window = new HiddenPopupWindow; |
| - |
| - window->set_window_style(WS_POPUP); |
| - window->set_window_ex_style(WS_EX_TOOLWINDOW); |
| - window->Init(GetDesktopWindow(), gfx::Rect()); |
| - EnableWindow(window->hwnd(), FALSE); |
| - // The |window| instance is now owned by the window user data. |
| - DCHECK_EQ(window, gfx::GetWindowUserData(window->hwnd())); |
| - return window->hwnd(); |
| - } |
| - |
| - static void Destroy(HWND window) { |
| - // This uses the fact that the window user data contains a pointer |
| - // to gfx::WindowImpl instance. |
| - gfx::WindowImpl* window_data = |
| - reinterpret_cast<gfx::WindowImpl*>(gfx::GetWindowUserData(window)); |
| - DCHECK_EQ(window, window_data->hwnd()); |
| - DestroyWindow(window); |
| - delete window_data; |
| - } |
| - |
| - private: |
| - // Explicitly do nothing in Close. We do this as some external apps may get a |
| - // handle to this window and attempt to close it. |
| - void OnClose() {} |
| - |
| - CR_BEGIN_MSG_MAP_EX(HiddenPopupWindow) |
| - CR_MSG_WM_CLOSE(OnClose) |
| - CR_END_MSG_MAP() |
| -}; |
| - |
| -// This runs on the window owner thread. |
| -void CreateWindowsOnThread(const gfx::Size& size, |
| - base::WaitableEvent* event, |
| - SharedData* shared_data, |
| - HWND* child_window, |
| - HWND* parent_window) { |
| - InitializeWindowClass(); |
| - DCHECK(g_window_class); |
| - |
| - // Create hidden parent window on the current thread. |
| - *parent_window = HiddenPopupWindow::Create(); |
| - // Create child window. |
| - HWND window = CreateWindowEx( |
| - WS_EX_NOPARENTNOTIFY, reinterpret_cast<wchar_t*>(g_window_class), L"", |
| - WS_CHILDWINDOW | WS_DISABLED | WS_VISIBLE, 0, 0, size.width(), |
| - size.height(), *parent_window, NULL, NULL, NULL); |
| - CHECK(window); |
| - *child_window = window; |
| - gfx::SetWindowUserData(window, shared_data); |
| - event->Signal(); |
| -} |
| - |
| -// This runs on the main thread after the window was destroyed on window owner |
| -// thread. |
| -void DestroySharedData(std::unique_ptr<SharedData> shared_data) { |
| - shared_data->thread.Stop(); |
| -} |
| - |
| -// This runs on the window owner thread. |
| -void DestroyWindowsOnThread(HWND child_window, HWND hidden_popup_window) { |
| - DestroyWindow(child_window); |
| - HiddenPopupWindow::Destroy(hidden_popup_window); |
| -} |
| - |
| -} // namespace |
| - |
| ChildWindowSurfaceWin::ChildWindowSurfaceWin( |
| base::WeakPtr<ImageTransportSurfaceDelegate> delegate, |
| HWND parent_window) |
| : gl::NativeViewGLSurfaceEGL(0), |
| - parent_window_(parent_window), |
| - delegate_(delegate), |
| + child_window_(delegate, parent_window), |
| alpha_(true), |
| first_swap_(true) { |
| // Don't use EGL_ANGLE_window_fixed_size so that we can avoid recreating the |
| @@ -203,25 +65,9 @@ bool ChildWindowSurfaceWin::InitializeNativeWindow() { |
| if (window_) |
| return true; |
| - shared_data_ = base::MakeUnique<SharedData>(); |
| - |
| - base::Thread::Options options(base::MessageLoop::TYPE_UI, 0); |
| - shared_data_->thread.StartWithOptions(options); |
| - |
| - base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| - base::WaitableEvent::InitialState::NOT_SIGNALED); |
| - |
| - RECT window_rect; |
| - GetClientRect(parent_window_, &window_rect); |
| - |
| - shared_data_->thread.task_runner()->PostTask( |
| - FROM_HERE, |
| - base::Bind(&CreateWindowsOnThread, gfx::Rect(window_rect).size(), &event, |
| - shared_data_.get(), &window_, &initial_parent_window_)); |
| - event.Wait(); |
| - |
| - delegate_->DidCreateAcceleratedSurfaceChildWindow(parent_window_, window_); |
| - return true; |
| + bool result = child_window_.Initialize(); |
| + window_ = child_window_.window(); |
|
stanisc
2017/01/10 20:54:57
Could you just use child_window_.window() instead
|
| + return result; |
| } |
| bool ChildWindowSurfaceWin::Resize(const gfx::Size& size, |
| @@ -281,7 +127,7 @@ gfx::SwapResult ChildWindowSurfaceWin::SwapBuffers() { |
| glFinish(); |
| first_swap_ = false; |
| } |
| - ClearInvalidContents(); |
| + child_window_.ClearInvalidContents(); |
| return result; |
| } |
| @@ -291,33 +137,11 @@ gfx::SwapResult ChildWindowSurfaceWin::PostSubBuffer(int x, |
| int height) { |
| gfx::SwapResult result = |
| NativeViewGLSurfaceEGL::PostSubBuffer(x, y, width, height); |
| - ClearInvalidContents(); |
| + child_window_.ClearInvalidContents(); |
| return result; |
| } |
| -void ChildWindowSurfaceWin::ClearInvalidContents() { |
| - base::AutoLock lock(shared_data_->rect_lock); |
| - if (!shared_data_->rect_to_clear.IsEmpty()) { |
| - base::win::ScopedGetDC dc(window_); |
| - |
| - RECT rect = shared_data_->rect_to_clear.ToRECT(); |
| - |
| - // DirectComposition composites with the contents under the SwapChain, |
| - // so ensure that's cleared. GDI treats black as transparent. |
| - FillRect(dc, &rect, reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH))); |
| - shared_data_->rect_to_clear = gfx::Rect(); |
| - } |
| -} |
| - |
| ChildWindowSurfaceWin::~ChildWindowSurfaceWin() { |
| - if (shared_data_) { |
| - scoped_refptr<base::TaskRunner> task_runner = |
| - shared_data_->thread.task_runner(); |
| - task_runner->PostTaskAndReply( |
| - FROM_HERE, |
| - base::Bind(&DestroyWindowsOnThread, window_, initial_parent_window_), |
| - base::Bind(&DestroySharedData, base::Passed(std::move(shared_data_)))); |
| - } |
| } |
| } // namespace gpu |