Skip to content

Disposing shared CanvasDevice leads to crash on resize #1003

@riverar

Description

@riverar

Disposing a shared CanvasDevice (despite documentation warning against it) causes a crash when an app's resize events fire.

Expected behavior

Per docs, I expect subsequent GetSharedDevice() calls to safely recreate and return a new device.

If the Canvas itself is a component using the shared device, then the docs are wrong because there would never be a scenario where "no other components are using it".

Actual behavior

App crashes.

Steps to reproduce / Code

Repro.zip

Native stack

(lots of text)
 	KernelBase.dll!RaiseException()	Unknown
 	Microsoft.Graphics.Canvas.dll!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo) Line 82	C++
 	Microsoft.Graphics.Canvas.dll!ThrowHR(HRESULT hr) Line 87	C++
 	[Inline Frame] Microsoft.Graphics.Canvas.dll!ClosablePtr::EnsureNotClosed() Line 74	C++
 	[Inline Frame] Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::ResourceWrapper::GetResource() Line 77	C++
>	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::CanvasDevice::GetD2DDevice() Line 875	C++
 	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasImageSource::SetDevice(ABI::Microsoft::Graphics::Canvas::ICanvasDevice * device) Line 237	C++
 	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasImageSource::CanvasImageSource(ABI::Microsoft::Graphics::Canvas::ICanvasResourceCreator * resourceCreator, float width, float height, float dpi, ABI::Microsoft::Graphics::Canvas::CanvasAlphaMode alphaMode, ABI::Microsoft::UI::Xaml::Media::Imaging::ISurfaceImageSourceFactory * surfaceImageSourceFactory, std::shared_ptr drawingSessionFactory) Line 199	C++
 	Microsoft.Graphics.Canvas.dll!Microsoft::WRL::Details::Make &>(ABI::Microsoft::Graphics::Canvas::ICanvasResourceCreator * & , float & , float & , float & , ABI::Microsoft::Graphics::Canvas::CanvasAlphaMode & , ABI::Microsoft::UI::Xaml::Media::Imaging::ISurfaceImageSourceFactory * && , std::shared_ptr & ) Line 2455	C++
 	[Inline Frame] Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasImageSourceFactory::CreateWithWidthAndHeightAndDpiAndAlphaMode::__l2::::operator()() Line 144	C++
 	Microsoft.Graphics.Canvas.dll!ExceptionBoundary<>(ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasImageSourceFactory::CreateWithWidthAndHeightAndDpiAndAlphaMode::__l2:: && fn) Line 221	C++
 	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasImageSourceFactory::CreateWithWidthAndHeightAndDpiAndAlphaMode(ABI::Microsoft::Graphics::Canvas::ICanvasResourceCreator * resourceCreator, float width, float height, float dpi, ABI::Microsoft::Graphics::Canvas::CanvasAlphaMode alphaMode, ABI::Microsoft::Graphics::Canvas::UI::Xaml::ICanvasImageSource * * imageSource) Line 157	C++
 	Microsoft.Graphics.Canvas.dll!CanvasControlAdapter::CreateCanvasImageSource(ABI::Microsoft::Graphics::Canvas::ICanvasDevice * device, float width, float height, float dpi, ABI::Microsoft::Graphics::Canvas::CanvasAlphaMode alphaMode) Line 100	C++
 	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasControl::CreateOrUpdateRenderTarget(ABI::Microsoft::Graphics::Canvas::ICanvasDevice * device, ABI::Microsoft::Graphics::Canvas::CanvasAlphaMode newAlphaMode, float newDpi, ABI::Windows::Foundation::Size newSize, ABI::Microsoft::Graphics::Canvas::UI::Xaml::BaseControl::RenderTarget * renderTarget) Line 256	C++
 	[Inline Frame] Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::BaseControl::UpdateCurrentRenderTarget(ABI::Microsoft::Graphics::Canvas::ICanvasDevice *) Line 735	C++
 	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::BaseControl::RunWithRenderTarget< &>(const ABI::Windows::UI::Color & clearColor, const ABI::Windows::Foundation::Size & renderTargetSize, float dpi, ABI::Microsoft::Graphics::Canvas::ICanvasDevice * device, ABI::Microsoft::Graphics::Canvas::UI::Xaml::RunWithDeviceFlags flags, ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasControl::DrawControl::__l2:: & fn) Line 702	C++
 	[Inline Frame] Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::BaseControl::RunWithRenderTarget::__l2::::operator()(ABI::Microsoft::Graphics::Canvas::ICanvasDevice *) Line 580	C++
 	[Inline Frame] Microsoft.Graphics.Canvas.dll!std::invoke(ABI::Microsoft::Graphics::Canvas::UI::Xaml::BaseControl::RunWithRenderTarget::__l2:: &) Line 1714	C++
 	Microsoft.Graphics.Canvas.dll!std::_Func_impl_no_alloc<,void,ABI::Microsoft::Graphics::Canvas::ICanvasDevice *,enum ABI::Microsoft::Graphics::Canvas::UI::Xaml::RunWithDeviceFlags>::_Do_call(ABI::Microsoft::Graphics::Canvas::ICanvasDevice * && <_Args_0>, ABI::Microsoft::Graphics::Canvas::UI::Xaml::RunWithDeviceFlags && <_Args_1>) Line 878	C++
 	[Inline Frame] Microsoft.Graphics.Canvas.dll!std::_Func_class::operator()(ABI::Microsoft::Graphics::Canvas::ICanvasDevice * <_Args_0>, ABI::Microsoft::Graphics::Canvas::UI::Xaml::RunWithDeviceFlags <_Args_1>) Line 920	C++
 	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::RecreatableDeviceManager::RunWithDevice(ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasControl * sender, ABI::Microsoft::Graphics::Canvas::UI::Xaml::DeviceCreationOptions deviceCreationOptions, std::function runWithDeviceFunction) Line 186	C++
 	[Inline Frame] Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::BaseControl::RunWithRenderTarget(ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasControl::DrawControl::__l2:: &&) Line 577	C++
 	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasControl::DrawControl() Line 222	C++
 	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasControl::OnCompositionRendering::__l2::() Line 196	C++
 	Microsoft.Graphics.Canvas.dll!ExceptionBoundary(void)>(ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasControl::OnCompositionRendering::__l2::void (void) && fn) Line 222	C++
 	Microsoft.Graphics.Canvas.dll!ABI::Microsoft::Graphics::Canvas::UI::Xaml::CanvasControl::OnCompositionRendering(IInspectable * __formal, IInspectable * __formal) Line 217	C++
 	[Inline Frame] Microsoft.Graphics.Canvas.dll!Microsoft::WRL::Callback::__l2::::operator()(IInspectable * &&) Line 335	C++
 	Microsoft.Graphics.Canvas.dll!Microsoft::WRL::Details::DelegateArgTraits>::*)(IInspectable *,ABI::Windows::ApplicationModel::ISuspendingEventArgs *)>::DelegateInvokeHelper,,1,IInspectable *,ABI::Windows::ApplicationModel::ISuspendingEventArgs *>::Invoke(IInspectable * , ABI::Windows::ApplicationModel::ISuspendingEventArgs * ) Line 245	C++
 	Microsoft.ui.xaml.dll!DirectUI::CEventSourceBase,IInspectable,IInspectable>::Raise(IInspectable * pSource, IInspectable * pArgs) Line 272	C++
 	Microsoft.ui.xaml.dll!DirectUI::DXamlCore::OnRenderingEvent(IInspectable * pArgs) Line 2432	C++
 	Microsoft.ui.xaml.dll!DirectUI::DXamlCore::RaiseEvent(CDependencyObject * target, CEventArgs * pCoreArgs, DirectUI::ManagedEvent eventId) Line 2179	C++
 	[Inline Frame] Microsoft.ui.xaml.dll!AgCoreCallbacks::RaiseEvent(CDependencyObject *) Line 97	C++
 	[Inline Frame] Microsoft.ui.xaml.dll!FxCallbacks::JoltHelper_RaiseEvent(CDependencyObject *) Line 880	C++
 	Microsoft.ui.xaml.dll!CCoreServices::CallPerFrameCallback(float time) Line 4289	C++
 	Microsoft.ui.xaml.dll!CCoreServices::NWDrawTree(HWWalk * pHWWalk, CWindowRenderTarget * pRenderTarget, VisualTree * pVisualTree, bool forceRedraw, bool * pFrameDrawn) Line 6271	C++
 	Microsoft.ui.xaml.dll!CCoreServices::NWDrawMainTree(CWindowRenderTarget * pIRenderTarget, bool forceRedraw, bool * pFrameDrawn) Line 6009	C++
 	Microsoft.ui.xaml.dll!CWindowRenderTarget::Draw(CCoreServices * forceRedraw, bool pFrameDrawn, bool *) Line 130	C++
 	Microsoft.ui.xaml.dll!CXcpBrowserHost::OnTick() Line 339	C++
 	Microsoft.ui.xaml.dll!CXcpDispatcher::Tick() Line 1146	C++
 	Microsoft.ui.xaml.dll!CXcpDispatcher::OnReentrancyProtectedWindowMessage(unsigned int msg, unsigned __int64 lParam, __int64) Line 759	C++
 	[Inline Frame] Microsoft.ui.xaml.dll!CDeferredInvoke::DispatchQueuedMessage(bool *) Line 141	C++
 	Microsoft.ui.xaml.dll!CXcpDispatcher::MessageTimerCallback() Line 1254	C++
 	[Inline Frame] Microsoft.ui.xaml.dll!CXcpDispatcher::MessageTimerCallbackStatic(void *) Line 1223	C++
 	[Inline Frame] Microsoft.ui.xaml.dll!CXcpDispatcher::Init::__l46::::operator()(ABI::Microsoft::UI::Dispatching::IDispatcherQueueTimer *) Line 324	C++
 	Microsoft.ui.xaml.dll!Microsoft::WRL::Details::DelegateArgTraits,IInspectable *>::*)(ABI::Microsoft::UI::Dispatching::IDispatcherQueueTimer *,IInspectable *)>::DelegateInvokeHelper,ABI::Windows::Foundation::ITypedEventHandler,Microsoft::WRL::FtmBase>,`CXcpDispatcher::Init'::`46':: &,1,ABI::Microsoft::UI::Dispatching::IDispatcherQueueTimer *,IInspectable *>::Invoke(ABI::Microsoft::UI::Dispatching::IDispatcherQueueTimer * , IInspectable * ) Line 354	C++

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions