From d3b250cffeba171ca1b1f793d188b1d05f57e66b Mon Sep 17 00:00:00 2001 From: Aron Budea Date: Mon, 23 Jan 2017 03:47:19 +0100 Subject: tdf#100151: Dispose of window if DX device creation failed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Tested-by: Jenkins (cherry picked from commit bb50474225f80b8aeea49f14ad66173462026a41) Reviewed-on: https://gerrit.libreoffice.org/33477 Reviewed-by: Caolán McNamara Tested-by: Caolán McNamara --- canvas/source/directx/dx_9rm.cxx | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/canvas/source/directx/dx_9rm.cxx b/canvas/source/directx/dx_9rm.cxx index 1f58f2bd8349..4b41d302b54b 100644 --- a/canvas/source/directx/dx_9rm.cxx +++ b/canvas/source/directx/dx_9rm.cxx @@ -583,6 +583,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( + Direct3DCreate9(D3D_SDK_VERSION)); + if(!mpDirect3D9.is()) + return false; + maVertexCache.reserve( 1024 ); mpWindow.disposeAndClear(); @@ -619,17 +627,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( - Direct3DCreate9(D3D_SDK_VERSION)); - if(!mpDirect3D9.is()) - return false; - // create a device from the direct3d9 object. if(!(createDevice())) + { + mpWindow.disposeAndClear(); return false; + } mpWindow->Show(); -- cgit v1.2.3