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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions