gfx-rs / wgpu

A cross-platform, safe, pure-Rust graphics API.
https://wgpu.rs
Apache License 2.0
12.24k stars 898 forks source link

Panic creating oversized textures on DX11 and DX12 #1010

Open Dinnerbone opened 3 years ago

Dinnerbone commented 3 years ago

Description When creating a new texture, the dx11 and dx12 backends may panic. Vulkan does not and seems to work fine. Not tested Metal.

Repro steps You can reproduce it with our project:

You may change -g dx11 to -g dx12/etc to try other backends.

Expected vs observed behavior Expected gleaming textures, not screaming gestures.

Extra materials Panic in dx11:

thread 'main' panicked at 'failed to bind memory: Failed to bind object to memory range: Wrong memory', C:\Users\dinne\.cargo\git\checkouts\wgpu-53e70f8674b08dd4\7ac706f\wgpu-core\src\device\mod.rs:962:18
stack backtrace:
   0:     0x7ff61125f919 - std::backtrace_rs::backtrace::dbghelp::trace
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\..\..\backtrace\src\backtrace\dbghelp.rs:98
   1:     0x7ff61125f919 - std::backtrace_rs::backtrace::trace_unsynchronized
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66
   2:     0x7ff61125f919 - std::sys_common::backtrace::_print_fmt
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:79
   3:     0x7ff61125f919 - std::sys_common::backtrace::_print::{{impl}}::fmt
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:58
   4:     0x7ff611278d6b - core::fmt::write
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\core\src\fmt\mod.rs:1082
   5:     0x7ff61125b1f4 - std::io::Write::write_fmt<std::sys::windows::stdio::Stderr>
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\io\mod.rs:1514
   6:     0x7ff6112629bb - std::sys_common::backtrace::_print
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:61
   7:     0x7ff6112629bb - std::sys_common::backtrace::print
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:48
   8:     0x7ff6112629bb - std::panicking::default_hook::{{closure}}
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:200
   9:     0x7ff6112625f9 - std::panicking::default_hook
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:219
  10:     0x7ff61126319f - std::panicking::rust_panic_with_hook
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:569
  11:     0x7ff611262d05 - std::panicking::begin_panic_handler::{{closure}}
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:476
  12:     0x7ff6112601cf - std::sys_common::backtrace::__rust_end_short_backtrace<closure-0,!>
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:153
  13:     0x7ff611262cb9 - std::panicking::begin_panic_handler
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:475
  14:     0x7ff611262c6c - std::panicking::begin_panic_fmt
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:429
  15:     0x7ff610356e30 - wgpu_core::device::DeviceError::from_bind
                               at C:\Users\dinne\.cargo\git\checkouts\wgpu-53e70f8674b08dd4\7ac706f\wgpu-core\src\device\mod.rs:962
  16:     0x7ff60fed90a1 - core::ops::function::FnOnce::call_once<fn(gfx_hal::device::BindError) -> wgpu_core::device::DeviceError,tuple<gfx_hal::device::BindError>>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ops\function.rs:227
  17:     0x7ff60fcc929f - core::result::Result<tuple<>, gfx_hal::device::BindError>::map_err<tuple<>,gfx_hal::device::BindError,wgpu_core::device::DeviceError,fn(gfx_hal::device::BindError) -> wgpu_core::device::DeviceError>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\result.rs:595
  18:     0x7ff61001dd0c - wgpu_core::device::Device<gfx_backend_dx11::Backend>::create_texture<gfx_backend_dx11::Backend>
                               at C:\Users\dinne\.cargo\git\checkouts\wgpu-53e70f8674b08dd4\7ac706f\wgpu-core\src\device\mod.rs:582
  19:     0x7ff60fe59346 - wgpu_core::hub::Global<wgpu_core::hub::IdentityManagerFactory>::device_create_texture<wgpu_core::hub::IdentityManagerFactory,gfx_backend_dx11::Backend>
                               at C:\Users\dinne\.cargo\git\checkouts\wgpu-53e70f8674b08dd4\7ac706f\wgpu-core\src\device\mod.rs:1333
  20:     0x7ff60ff14e11 - wgpu::backend::direct::{{impl}}::device_create_texture
                               at C:\Users\dinne\.cargo\git\checkouts\wgpu-rs-40ea39809c03c5d8\e3eadca\src\backend\direct.rs:926
  21:     0x7ff60ff45cd4 - wgpu::Device::create_texture
                               at C:\Users\dinne\.cargo\git\checkouts\wgpu-rs-40ea39809c03c5d8\e3eadca\src\lib.rs:1530
  22:     0x7ff60fc44bd0 - ruffle_render_wgpu::WgpuRenderBackend<ruffle_render_wgpu::target::TextureTarget>::register_bitmap<ruffle_render_wgpu::target::TextureTarget>
                               at W:\personal\ruffle\render\wgpu\src\lib.rs:703
  23:     0x7ff60fc42c9b - ruffle_render_wgpu::{{impl}}::register_bitmap_jpeg_2<ruffle_render_wgpu::target::TextureTarget>
                               at W:\personal\ruffle\render\wgpu\src\lib.rs:840
  24:     0x7ff6108ab67f - ruffle_core::display_object::movie_clip::MovieClipData::define_bits_jpeg_2
                               at W:\personal\ruffle\core\src\display_object\movie_clip.rs:2343
  25:     0x7ff6108381da - ruffle_core::display_object::movie_clip::{{impl}}::preload::{{closure}}
                               at W:\personal\ruffle\core\src\display_object\movie_clip.rs:203
  26:     0x7ff6107ff98b - ruffle_core::tag_utils::decode_tags<slice<u8>*,closure-0>
                               at W:\personal\ruffle\core\src\tag_utils.rs:304
  27:     0x7ff61089ef33 - ruffle_core::display_object::movie_clip::MovieClip::preload
                               at W:\personal\ruffle\core\src\display_object\movie_clip.rs:392
  28:     0x7ff61094bb79 - ruffle_core::player::{{impl}}::preload::{{closure}}
                               at W:\personal\ruffle\core\src\player.rs:795
  29:     0x7ff610956047 - ruffle_core::player::{{impl}}::mutate_with_update_context::{{closure}}<closure-0,tuple<>>
                               at W:\personal\ruffle\core\src\player.rs:1154
  30:     0x7ff610958a9f - ruffle_core::player::GcArena::mutate<closure-0,tuple<>>
                               at C:\Users\dinne\.cargo\registry\src\github.com-1ecc6299db9ec823\gc-arena-0.2.0\src\arena.rs:161
  31:     0x7ff6109515b1 - ruffle_core::player::Player::mutate_with_update_context<closure-0,tuple<>>
                               at W:\personal\ruffle\core\src\player.rs:1101
  32:     0x7ff61075982e - ruffle_core::player::Player::preload
                               at W:\personal\ruffle\core\src\player.rs:792
  33:     0x7ff610759674 - ruffle_core::player::Player::set_root_movie
                               at W:\personal\ruffle\core\src\player.rs:413
  34:     0x7ff60fc3a6cb - exporter::take_screenshot
                               at W:\personal\ruffle\exporter\src\main.rs:120
  35:     0x7ff60fc3cc83 - exporter::capture_multiple_swfs
                               at W:\personal\ruffle\exporter\src\main.rs:292
  36:     0x7ff60fc3e4e1 - exporter::main
                               at W:\personal\ruffle\exporter\src\main.rs:396
  37:     0x7ff60fc61c3b - core::ops::function::FnOnce::call_once<fn() -> core::result::Result<tuple<>, alloc::boxed::Box<Error>>,tuple<>>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ops\function.rs:227
  38:     0x7ff60fc5905e - std::sys_common::backtrace::__rust_begin_short_backtrace<fn() -> core::result::Result<tuple<>, alloc::boxed::Box<Error>>,core::result::Result<tuple<>, alloc::boxed::Box<Error>>>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys_common\backtrace.rs:137
  39:     0x7ff60fc4bfd1 - std::rt::lang_start::{{closure}}<core::result::Result<tuple<>, alloc::boxed::Box<Error>>>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\rt.rs:66
  40:     0x7ff6112634b6 - core::ops::function::impls::{{impl}}::call_once
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\library\core\src\ops\function.rs:280
  41:     0x7ff6112634b6 - std::panicking::try::do_call
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:373
  42:     0x7ff6112634b6 - std::panicking::try
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:337
  43:     0x7ff6112634b6 - std::panic::catch_unwind
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panic.rs:379
  44:     0x7ff6112634b6 - std::rt::lang_start_internal
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\rt.rs:51
  45:     0x7ff60fc4bfa3 - std::rt::lang_start<core::result::Result<tuple<>, alloc::boxed::Box<Error>>>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\rt.rs:65
  46:     0x7ff60fc3f610 - main
  47:     0x7ff6114d6814 - invoke_main
                               at D:\agent\_work\9\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78
  48:     0x7ff6114d6814 - __scrt_common_main_seh
                               at D:\agent\_work\9\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288
  49:     0x7ff9b32f7034 - BaseThreadInitThunk
  50:     0x7ff9b39bcec1 - RtlUserThreadStart
error: process didn't exit successfully: `W:\personal\ruffle\target\debug\exporter.exe w:\swfs\newgrounds.com\376000 out_5 -g dx11` (exit code: 0xc0000409, STATUS_STACK_BUFFER_OVERRUN)

Panic in dx12:

thread 'main' panicked at 'attempt to add with overflow', C:\Users\dinne\.cargo\registry\src\github.com-1ecc6299db9ec823\gfx-memory-0.2.2\src\heaps\mod.rs:136:27
stack backtrace:
   0:     0x7ff61125f919 - std::backtrace_rs::backtrace::dbghelp::trace
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\..\..\backtrace\src\backtrace\dbghelp.rs:98
   1:     0x7ff61125f919 - std::backtrace_rs::backtrace::trace_unsynchronized
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66
   2:     0x7ff61125f919 - std::sys_common::backtrace::_print_fmt
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:79
   3:     0x7ff61125f919 - std::sys_common::backtrace::_print::{{impl}}::fmt
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:58
   4:     0x7ff611278d6b - core::fmt::write
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\core\src\fmt\mod.rs:1082
   5:     0x7ff61125b1f4 - std::io::Write::write_fmt<std::sys::windows::stdio::Stderr>
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\io\mod.rs:1514
   6:     0x7ff6112629bb - std::sys_common::backtrace::_print
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:61
   7:     0x7ff6112629bb - std::sys_common::backtrace::print
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:48
   8:     0x7ff6112629bb - std::panicking::default_hook::{{closure}}
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:200
   9:     0x7ff6112625f9 - std::panicking::default_hook
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:219
  10:     0x7ff61126319f - std::panicking::rust_panic_with_hook
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:569
  11:     0x7ff611262d05 - std::panicking::begin_panic_handler::{{closure}}
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:476
  12:     0x7ff6112601cf - std::sys_common::backtrace::__rust_end_short_backtrace<closure-0,!>
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\sys_common\backtrace.rs:153
  13:     0x7ff611262cb9 - std::panicking::begin_panic_handler
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:475
  14:     0x7ff611275fb0 - core::panicking::panic_fmt
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\core\src\panicking.rs:85
  15:     0x7ff611275efc - core::panicking::panic
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\core\src\panicking.rs:50
  16:     0x7ff61003a320 - gfx_memory::heaps::{{impl}}::allocate::{{closure}}<gfx_backend_dx12::Backend>
                               at C:\Users\dinne\.cargo\registry\src\github.com-1ecc6299db9ec823\gfx-memory-0.2.2\src\heaps\mod.rs:136
  17:     0x7ff6100456ce - core::ops::function::impls::{{impl}}::call_mut<tuple<tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>*, u32>*>,closure-2>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ops\function.rs:269
  18:     0x7ff60fdb27aa - core::iter::traits::iterator::Iterator::find::check::{{closure}}<tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>*, u32>,mut closure-2*>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2208
  19:     0x7ff610006fd9 - core::iter::adapters::filter_map_try_fold::{{closure}}<tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>*>,tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>*, u32>,tuple<>,core::iter::LoopS
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\mod.rs:1115
  20:     0x7ff610001b0b - core::iter::adapters::filter_try_fold::{{closure}}<tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>*>,tuple<>,core::iter::LoopState<tuple<>, tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backen
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\mod.rs:980
  21:     0x7ff610018318 - core::iter::adapters::{{impl}}::try_fold::enumerate::{{closure}}<gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>*,tuple<>,core::iter::LoopState<tuple<>, tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backen
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\mod.rs:1276
  22:     0x7ff6100cfca9 - core::iter::traits::iterator::Iterator::try_fold<core::slice::Iter<gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>>,tuple<>,closure-0,core::iter::LoopState<tuple<>, tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:1871
  23:     0x7ff610017b8a - core::iter::adapters::{{impl}}::try_fold<core::slice::Iter<gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>>,tuple<>,closure-0,core::iter::LoopState<tuple<>, tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Ba
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\mod.rs:1283
  24:     0x7ff60fff675f - core::iter::adapters::{{impl}}::try_fold<core::iter::adapters::Enumerate<core::slice::Iter<gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>>>,closure-0,tuple<>,closure-0,core::iter::LoopState<tuple<>, tuple<usize, gfx_memory::heaps::m
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\mod.rs:1029
  25:     0x7ff60fff7073 - core::iter::adapters::{{impl}}::try_fold<tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>*, u32>,core::iter::adapters::Filter<core::iter::adapters::Enumerate<core::slice::Iter<gfx_memory::heaps::memory_type::MemoryType<gf
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\mod.rs:1145
  26:     0x7ff60fffb251 - core::iter::traits::iterator::Iterator::find<core::iter::adapters::FilterMap<core::iter::adapters::Filter<core::iter::adapters::Enumerate<core::slice::Iter<gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>>>, closure-0>, closure-1>,mut
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2212
  27:     0x7ff60fff63ad - core::iter::adapters::{{impl}}::next<core::iter::adapters::FilterMap<core::iter::adapters::Filter<core::iter::adapters::Enumerate<core::slice::Iter<gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>>>, closure-0>, closure-1>,closure-2>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\mod.rs:992
  28:     0x7ff610011c5e - core::iter::adapters::{{impl}}::next<tuple<u32, tuple<usize, gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Backend>*, u32>>,core::iter::adapters::Filter<core::iter::adapters::FilterMap<core::iter::adapters::Filter<core::iter::adapters::Enum
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\mod.rs:844
  29:     0x7ff60fff9c26 - core::iter::traits::iterator::Iterator::fold_first<core::iter::adapters::Map<core::iter::adapters::Filter<core::iter::adapters::FilterMap<core::iter::adapters::Filter<core::iter::adapters::Enumerate<core::slice::Iter<gfx_memory::heaps::memory_type::Memory
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2042
  30:     0x7ff60fffbed7 - core::iter::traits::iterator::Iterator::max_by<core::iter::adapters::Map<core::iter::adapters::Filter<core::iter::adapters::FilterMap<core::iter::adapters::Filter<core::iter::adapters::Enumerate<core::slice::Iter<gfx_memory::heaps::memory_type::MemoryType
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2534
  31:     0x7ff60fffa5df - core::iter::traits::iterator::Iterator::max_by_key<core::iter::adapters::Filter<core::iter::adapters::FilterMap<core::iter::adapters::Filter<core::iter::adapters::Enumerate<core::slice::Iter<gfx_memory::heaps::memory_type::MemoryType<gfx_backend_dx12::Bac
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2506
  32:     0x7ff610039633 - gfx_memory::heaps::Heaps<gfx_backend_dx12::Backend>::allocate<gfx_backend_dx12::Backend>
                               at C:\Users\dinne\.cargo\registry\src\github.com-1ecc6299db9ec823\gfx-memory-0.2.2\src\heaps\mod.rs:133
  33:     0x7ff61001e9ad - wgpu_core::device::Device<gfx_backend_dx12::Backend>::create_texture<gfx_backend_dx12::Backend>
                               at C:\Users\dinne\.cargo\git\checkouts\wgpu-53e70f8674b08dd4\7ac706f\wgpu-core\src\device\mod.rs:572
  34:     0x7ff60fe57ef6 - wgpu_core::hub::Global<wgpu_core::hub::IdentityManagerFactory>::device_create_texture<wgpu_core::hub::IdentityManagerFactory,gfx_backend_dx12::Backend>
                               at C:\Users\dinne\.cargo\git\checkouts\wgpu-53e70f8674b08dd4\7ac706f\wgpu-core\src\device\mod.rs:1333
  35:     0x7ff60ff14cb6 - wgpu::backend::direct::{{impl}}::device_create_texture
                               at C:\Users\dinne\.cargo\git\checkouts\wgpu-rs-40ea39809c03c5d8\e3eadca\src\backend\direct.rs:926
  36:     0x7ff60ff45cd4 - wgpu::Device::create_texture
                               at C:\Users\dinne\.cargo\git\checkouts\wgpu-rs-40ea39809c03c5d8\e3eadca\src\lib.rs:1530
  37:     0x7ff60fc44bd0 - ruffle_render_wgpu::WgpuRenderBackend<ruffle_render_wgpu::target::TextureTarget>::register_bitmap<ruffle_render_wgpu::target::TextureTarget>
                               at W:\personal\ruffle\render\wgpu\src\lib.rs:703
  38:     0x7ff60fc42c9b - ruffle_render_wgpu::{{impl}}::register_bitmap_jpeg_2<ruffle_render_wgpu::target::TextureTarget>
                               at W:\personal\ruffle\render\wgpu\src\lib.rs:840
  39:     0x7ff6108ab67f - ruffle_core::display_object::movie_clip::MovieClipData::define_bits_jpeg_2
                               at W:\personal\ruffle\core\src\display_object\movie_clip.rs:2343
  40:     0x7ff6108381da - ruffle_core::display_object::movie_clip::{{impl}}::preload::{{closure}}
                               at W:\personal\ruffle\core\src\display_object\movie_clip.rs:203
  41:     0x7ff6107ff98b - ruffle_core::tag_utils::decode_tags<slice<u8>*,closure-0>
                               at W:\personal\ruffle\core\src\tag_utils.rs:304
  42:     0x7ff61089ef33 - ruffle_core::display_object::movie_clip::MovieClip::preload
                               at W:\personal\ruffle\core\src\display_object\movie_clip.rs:392
  43:     0x7ff61094bb79 - ruffle_core::player::{{impl}}::preload::{{closure}}
                               at W:\personal\ruffle\core\src\player.rs:795
  44:     0x7ff610956047 - ruffle_core::player::{{impl}}::mutate_with_update_context::{{closure}}<closure-0,tuple<>>
                               at W:\personal\ruffle\core\src\player.rs:1154
  45:     0x7ff610958a9f - ruffle_core::player::GcArena::mutate<closure-0,tuple<>>
                               at C:\Users\dinne\.cargo\registry\src\github.com-1ecc6299db9ec823\gc-arena-0.2.0\src\arena.rs:161
  46:     0x7ff6109515b1 - ruffle_core::player::Player::mutate_with_update_context<closure-0,tuple<>>
                               at W:\personal\ruffle\core\src\player.rs:1101
  47:     0x7ff61075982e - ruffle_core::player::Player::preload
                               at W:\personal\ruffle\core\src\player.rs:792
  48:     0x7ff610759674 - ruffle_core::player::Player::set_root_movie
                               at W:\personal\ruffle\core\src\player.rs:413
  49:     0x7ff60fc3a6cb - exporter::take_screenshot
                               at W:\personal\ruffle\exporter\src\main.rs:120
  50:     0x7ff60fc3bb7c - exporter::capture_single_swf
                               at W:\personal\ruffle\exporter\src\main.rs:226
  51:     0x7ff60fc3e3a7 - exporter::main
                               at W:\personal\ruffle\exporter\src\main.rs:394
  52:     0x7ff60fc61c3b - core::ops::function::FnOnce::call_once<fn() -> core::result::Result<tuple<>, alloc::boxed::Box<Error>>,tuple<>>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ops\function.rs:227
  53:     0x7ff60fc5905e - std::sys_common::backtrace::__rust_begin_short_backtrace<fn() -> core::result::Result<tuple<>, alloc::boxed::Box<Error>>,core::result::Result<tuple<>, alloc::boxed::Box<Error>>>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys_common\backtrace.rs:137
  54:     0x7ff60fc4bfd1 - std::rt::lang_start::{{closure}}<core::result::Result<tuple<>, alloc::boxed::Box<Error>>>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\rt.rs:66
  55:     0x7ff6112634b6 - core::ops::function::impls::{{impl}}::call_once
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\library\core\src\ops\function.rs:280
  56:     0x7ff6112634b6 - std::panicking::try::do_call
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:373
  57:     0x7ff6112634b6 - std::panicking::try
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panicking.rs:337
  58:     0x7ff6112634b6 - std::panic::catch_unwind
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\panic.rs:379
  59:     0x7ff6112634b6 - std::rt::lang_start_internal
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39\/library\std\src\rt.rs:51
  60:     0x7ff60fc4bfa3 - std::rt::lang_start<core::result::Result<tuple<>, alloc::boxed::Box<Error>>>
                               at C:\Users\dinne\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\rt.rs:65
  61:     0x7ff60fc3f610 - main
  62:     0x7ff6114d6814 - invoke_main
                               at D:\agent\_work\9\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78
  63:     0x7ff6114d6814 - __scrt_common_main_seh
                               at D:\agent\_work\9\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288
  64:     0x7ff9b32f7034 - BaseThreadInitThunk
  65:     0x7ff9b39bcec1 - RtlUserThreadStart
error: process didn't exit successfully: `W:\personal\ruffle\target\debug\exporter.exe w:\swfs\newgrounds.com\376000\376149_longcatgame202c.swf -g dx12` (exit code: 0xc0000409, STATUS_STACK_BUFFER_OVERRUN)

Platform Windows 10 x64 gfx-backend-dx11 0.6.11 gfx-backend-dx12 0.6.11

kvark commented 3 years ago

This is a problem with missing validation in wgpu for texture sizes. WebGPU proper needs to have a limit(s) for this, with a baseline of 8K x 8K. Your texture has one of the sizes more than 16K, so it's not very portable. DX maximum texture size is fixed at 16K. In wgpu, we need both expose a limit, and add internal validation to check against gfx-hal limits.

parasyte commented 2 years ago

It is the case that attempting to create large textures always panics. There is no non-panicking way to try creating textures. The caller is responsible for testing the texture descriptor against device or adapter limits, which is not obvious and quite error-prone.

Would it be reasonable for Device::create_texture and friends to return Result<Texture>?

FWIW, here's the backtrace with wgpu_hal:

running 1 test
test test_large_textures ... FAILED

failures:

---- test_large_textures stdout ----
thread 'test_large_textures' panicked at 'wgpu error: Validation Error

Caused by:
    In Device::create_texture
      note: label = `pixels_source_texture`
    Dimension 64000 value 64000 exceeds the limit of 16384

', C:\Users\jay\.cargo\registry\src\github.com-1ecc6299db9ec823\wgpu-0.11.1\src\backend\direct.rs:2195:5
stack backtrace:
   0: std::panicking::begin_panic_handler
             at /rustc/532d2b14c05f9bc20b2d27cbb5f4550d28343a36\/library\std\src\panicking.rs:498
   1: core::panicking::panic_fmt
             at /rustc/532d2b14c05f9bc20b2d27cbb5f4550d28343a36\/library\core\src\panicking.rs:107
   2: wgpu::backend::direct::default_error_handler
             at C:\Users\jay\.cargo\registry\src\github.com-1ecc6299db9ec823\wgpu-0.11.1\src\backend\direct.rs:2195
   3: core::ops::function::Fn::call<void (*)(enum$<wgpu::Error>),tuple$<enum$<wgpu::Error> > >
             at /rustc/532d2b14c05f9bc20b2d27cbb5f4550d28343a36\library\core\src\ops\function.rs:70
   4: alloc::boxed::impl$46::call<tuple$<enum$<wgpu::Error> >,dyn$<wgpu::UncapturedErrorHandler,assoc$<Output,tuple$<> > > >,alloc::alloc::Global>
             at /rustc/532d2b14c05f9bc20b2d27cbb5f4550d28343a36\library\alloc\src\boxed.rs:1744
   5: wgpu::backend::direct::ErrorSinkRaw::handle_error
             at C:\Users\jay\.cargo\registry\src\github.com-1ecc6299db9ec823\wgpu-0.11.1\src\backend\direct.rs:2183
   6: wgpu::backend::direct::Context::handle_error<enum$<wgpu_core::resource::CreateTextureError> >
             at C:\Users\jay\.cargo\registry\src\github.com-1ecc6299db9ec823\wgpu-0.11.1\src\backend\direct.rs:184
   7: wgpu::backend::direct::impl$3::device_create_texture
             at C:\Users\jay\.cargo\registry\src\github.com-1ecc6299db9ec823\wgpu-0.11.1\src\backend\direct.rs:1375
   8: wgpu::Device::create_texture
             at C:\Users\jay\.cargo\registry\src\github.com-1ecc6299db9ec823\wgpu-0.11.1\src\lib.rs:1802
   9: pixels::builder::create_backing_texture
             at .\src\builder.rs:378
  10: pixels::builder::impl$0::build_impl::generator$0<pixels_mocks::Rwh>
             at .\src\builder.rs:269
  11: core::future::from_generator::impl$1::poll<pixels::builder::impl$0::build_impl::generator$0>
             at /rustc/532d2b14c05f9bc20b2d27cbb5f4550d28343a36\library\core\src\future\mod.rs:80
  12: pollster::block_on<core::future::from_generator::GenFuture<pixels::builder::impl$0::build_impl::generator$0> >
             at C:\Users\jay\.cargo\registry\src\github.com-1ecc6299db9ec823\pollster-0.2.4\src\lib.rs:132
  13: pixels::builder::PixelsBuilder<pixels_mocks::Rwh>::build<pixels_mocks::Rwh>
             at .\src\builder.rs:320
  14: pixels::Pixels::new<pixels_mocks::Rwh>
             at .\src\lib.rs:199
  15: test::test_large_textures
             at .\tests\test.rs:8
  16: test::test_large_textures::closure$0
             at .\tests\test.rs:4
  17: core::ops::function::FnOnce::call_once<test::test_large_textures::closure$0,tuple$<> >
             at /rustc/532d2b14c05f9bc20b2d27cbb5f4550d28343a36\library\core\src\ops\function.rs:227
  18: core::ops::function::FnOnce::call_once
             at /rustc/532d2b14c05f9bc20b2d27cbb5f4550d28343a36\library\core\src\ops\function.rs:227
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
kvark commented 2 years ago

No, unfortunately. We settled early on to follow WebGPU error model. Users would need to understand what limits are, and how they are applied. Note also that wgpu doesn't internally panic, it produces an error and triggers the default error handler. That handler panics by default.

parasyte commented 2 years ago

Is this how errors are expected to be handled by callers? https://docs.rs/wgpu/latest/wgpu/struct.Device.html#method.on_uncaptured_error

kvark commented 2 years ago

Honestly, errors like this one aren't expected to be handled by callers, since they know in advance (based on limits) which textures can or can't be created. Idiomatic way of handling errors in WebGPU is via pushErrorScope. We have it implemented in Gecko, but not wgpu-rs yet. It wasn't really requested much, but we need to get to it.