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 |