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

Unified Diff: gpu/ipc/service/child_window_surface_win.cc

Issue 2623763003: Split out ChildWindowWin (Closed)
Patch Set: add comment Created 3 years, 11 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/ipc/service/child_window_surface_win.h ('k') | gpu/ipc/service/child_window_win.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
+ 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
« no previous file with comments | « gpu/ipc/service/child_window_surface_win.h ('k') | gpu/ipc/service/child_window_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698