summaryrefslogtreecommitdiffstats
path: root/ui/surface
diff options
context:
space:
mode:
authorapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-07 07:48:22 +0000
committerapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-07 07:48:22 +0000
commit81a40f9fdbe68b86147ec62d84a546a11824c084 (patch)
treecebffabbbdc411690e1bc2b10571f9ae357e2928 /ui/surface
parent01f7a80416e36be6e5605b85646d0b7b8395a8b6 (diff)
downloadchromium_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.cc25
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;