diff options
author | Aron Budea <aron.budea@collabora.com> | 2017-01-23 03:47:19 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-01-25 13:13:41 +0000 |
commit | 1c8f98a5fd33f02b9af0ce35b1ad0eb091c895d0 (patch) | |
tree | 4bc15990d3ee6b3da7deaf9600fb3eb0890a98af | |
parent | 5e314dfb058990a78cd9e1b9045ac0f186de7003 (diff) |
tdf#100151: Dispose of window if DX device creation failed
Before, if the device lacked Direct3D capabilities, VclPtr
handling became compromised, and caused a crash. This was
particularly a problem in virtualized/remote desktop
connections in Windows.
Now mpWindow instance is disposed of right away if DX
device creation fails.
Change-Id: I639340380affdb31a93ce6dccd8df33a0a466df6
Reviewed-on: https://gerrit.libreoffice.org/33413
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Jenkins <ci@libreoffice.org>
(cherry picked from commit bb50474225f80b8aeea49f14ad66173462026a41)
Reviewed-on: https://gerrit.libreoffice.org/33487
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | canvas/source/directx/dx_9rm.cxx | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/canvas/source/directx/dx_9rm.cxx b/canvas/source/directx/dx_9rm.cxx index 6beb18312a8c..7d2867b209db 100644 --- a/canvas/source/directx/dx_9rm.cxx +++ b/canvas/source/directx/dx_9rm.cxx @@ -590,6 +590,14 @@ namespace dxcanvas // TODO(P2): get rid of those fine-grained locking ::osl::MutexGuard aGuard( maMutex ); + // TODO(F2): since we would like to share precious hardware + // resources, the direct3d9 object should be global. each new + // request for a canvas should only create a new swapchain. + mpDirect3D9 = COMReference<IDirect3D9>( + Direct3DCreate9(D3D_SDK_VERSION)); + if(!mpDirect3D9.is()) + return false; + maVertexCache.reserve( 1024 ); mpWindow.disposeAndClear(); @@ -626,17 +634,12 @@ namespace dxcanvas // let the child window cover the same size as the parent window. mpWindow->setPosSizePixel(0,0,maSize.getX(),maSize.getY()); - // TODO(F2): since we would like to share precious hardware - // resources, the direct3d9 object should be global. each new - // request for a canvas should only create a new swapchain. - mpDirect3D9 = COMReference<IDirect3D9>( - Direct3DCreate9(D3D_SDK_VERSION)); - if(!mpDirect3D9.is()) - return false; - // create a device from the direct3d9 object. if(!(createDevice())) + { + mpWindow.disposeAndClear(); return false; + } mpWindow->Show(); |