diff options
author | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-29 01:31:43 +0000 |
---|---|---|
committer | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-29 01:31:43 +0000 |
commit | f91f7486bbbf37710726d9e58703fb1240cac727 (patch) | |
tree | a175615168b1f3952536bc04025eb7ae1e7f5ed1 /ui/surface/accelerated_surface_win.cc | |
parent | abaca60571344ee85d1bd134cb05b113c7dcc4fa (diff) | |
download | chromium_src-f91f7486bbbf37710726d9e58703fb1240cac727.zip chromium_src-f91f7486bbbf37710726d9e58703fb1240cac727.tar.gz chromium_src-f91f7486bbbf37710726d9e58703fb1240cac727.tar.bz2 |
Windows: AcceleratedPresenter takes present thread lock before reseting its D3D device.
I also added some asserts to PresentThread to prevent this from happening in the future.
Review URL: https://chromiumcodereview.appspot.com/12798009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@191257 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/surface/accelerated_surface_win.cc')
-rw-r--r-- | ui/surface/accelerated_surface_win.cc | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/ui/surface/accelerated_surface_win.cc b/ui/surface/accelerated_surface_win.cc index 92d81d2..10487d3 100644 --- a/ui/surface/accelerated_surface_win.cc +++ b/ui/surface/accelerated_surface_win.cc @@ -82,6 +82,7 @@ class PresentThread : public base::Thread, } void InitDevice(); + void LockAndResetDevice(); void ResetDevice(); bool IsDeviceLost(); @@ -162,6 +163,8 @@ PresentThread::PresentThread(const char* name) : base::Thread(name) { } void PresentThread::InitDevice() { + lock_.AssertAcquired(); + if (device_) return; @@ -170,9 +173,16 @@ void PresentThread::InitDevice() { ResetDevice(); } +void PresentThread::LockAndResetDevice() { + base::AutoLock locked(lock_); + ResetDevice(); +} + void PresentThread::ResetDevice() { TRACE_EVENT0("gpu", "PresentThread::ResetDevice"); + lock_.AssertAcquired(); + // The D3D device must be created on the present thread. CHECK(message_loop() == MessageLoop::current()); @@ -207,6 +217,8 @@ void PresentThread::ResetDevice() { } bool PresentThread::IsDeviceLost() { + lock_.AssertAcquired(); + HRESULT hr = device_->CheckDeviceState(NULL); return FAILED(hr) || hr == S_PRESENT_MODE_CHANGED; } @@ -911,7 +923,7 @@ void AcceleratedPresenter::PresentWithGDI(HDC dc) { if (present_thread_->IsDeviceLost()) { present_thread_->message_loop()->PostTask( FROM_HERE, - base::Bind(&PresentThread::ResetDevice, present_thread_)); + base::Bind(&PresentThread::LockAndResetDevice, present_thread_)); } return; } |