diff options
author | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-07 07:48:22 +0000 |
---|---|---|
committer | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-07 07:48:22 +0000 |
commit | 81a40f9fdbe68b86147ec62d84a546a11824c084 (patch) | |
tree | cebffabbbdc411690e1bc2b10571f9ae357e2928 /ui/surface | |
parent | 01f7a80416e36be6e5605b85646d0b7b8395a8b6 (diff) | |
download | chromium_src-81a40f9fdbe68b86147ec62d84a546a11824c084.zip chromium_src-81a40f9fdbe68b86147ec62d84a546a11824c084.tar.gz chromium_src-81a40f9fdbe68b86147ec62d84a546a11824c084.tar.bz2 |
Move initialization of D3D earlier in present thread lifetime.
This improves startup time.
Fixed bug where initial window size was treated as a resize and triggered the slow GDI path.
BUG=163215
Review URL: https://chromiumcodereview.appspot.com/11471020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171720 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/surface')
-rw-r--r-- | ui/surface/accelerated_surface_win.cc | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/ui/surface/accelerated_surface_win.cc b/ui/surface/accelerated_surface_win.cc index 4ed0ffd4..1ec9289 100644 --- a/ui/surface/accelerated_surface_win.cc +++ b/ui/surface/accelerated_surface_win.cc @@ -189,6 +189,7 @@ class PresentThread : public base::Thread, void ResetDevice(); protected: + virtual void Init(); virtual void CleanUp(); private: @@ -353,6 +354,10 @@ void PresentThread::ResetDevice() { device_->SetVertexDeclaration(vertex_declaration); } +void PresentThread::Init() { + TRACE_EVENT0("gpu", "Initialize thread"); +} + void PresentThread::CleanUp() { // The D3D device and query are leaked because destroying the associated D3D // query crashes some Intel drivers. @@ -365,18 +370,19 @@ PresentThread::~PresentThread() { } PresentThreadPool::PresentThreadPool() : next_thread_(0) { - // Do this in the constructor so present_threads_ is initialized before any - // other thread sees it. See LazyInstance documentation. - for (int i = 0; i < kNumPresentThreads; ++i) { - present_threads_[i] = new PresentThread( - base::StringPrintf("PresentThread #%d", i).c_str()); - present_threads_[i]->Start(); - } } PresentThread* PresentThreadPool::NextThread() { next_thread_ = (next_thread_ + 1) % kNumPresentThreads; - return present_threads_[next_thread_].get(); + PresentThread* thread = present_threads_[next_thread_].get(); + if (!thread) { + thread = new PresentThread( + base::StringPrintf("PresentThread #%d", next_thread_).c_str()); + thread->Start(); + present_threads_[next_thread_] = thread; + } + + return thread; } AcceleratedPresenterMap::AcceleratedPresenterMap() { @@ -926,6 +932,7 @@ void AcceleratedPresenter::DoSuspend() { void AcceleratedPresenter::DoReleaseSurface() { base::AutoLock locked(lock_); + present_thread_->InitDevice(); source_texture_.Release(); } @@ -1018,7 +1025,7 @@ gfx::Size AcceleratedPresenter::GetWindowSize() { bool AcceleratedPresenter::CheckDirect3DWillWork() { gfx::Size window_size = GetWindowSize(); - if (window_size != last_window_size_) { + if (window_size != last_window_size_ && last_window_size_.GetArea() != 0) { last_window_size_ = window_size; last_window_resize_time_ = base::Time::Now(); return false; |