Wgpu: underflow on creating an empty buffer.

Created on 9 Jun 2020  路  6Comments  路  Source: gfx-rs/wgpu

Description
Creating an empty buffer results in an underflow (0u64 - 1)

thread 'main' panicked at 'attempt to subtract with overflow', /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/gfx-memory-0.1.3/src/allocator/general.rs:484:29
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:78
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1069
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1504
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:198
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:218
  10: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:511
  11: rust_begin_unwind
             at src/libstd/panicking.rs:419
  12: core::panicking::panic_fmt
             at src/libcore/panicking.rs:111
  13: core::panicking::panic
             at src/libcore/panicking.rs:54
  14: <gfx_memory::allocator::general::GeneralAllocator<B> as gfx_memory::allocator::Allocator<B>>::alloc
             at /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/gfx-memory-0.1.3/src/allocator/general.rs:484
  15: gfx_memory::heaps::memory_type::MemoryType<B>::alloc
             at /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/gfx-memory-0.1.3/src/heaps/memory_type.rs:92
  16: gfx_memory::heaps::Heaps<B>::allocate_from
             at /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/gfx-memory-0.1.3/src/heaps/mod.rs:168
  17: gfx_memory::heaps::Heaps<B>::allocate
             at /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/gfx-memory-0.1.3/src/heaps/mod.rs:137
  18: wgpu_core::device::Device<B>::create_buffer
             at /home/rukai/.cargo/git/checkouts/wgpu-53e70f8674b08dd4/eaf8f4a/wgpu-core/src/device/mod.rs:347
  19: wgpu_core::device::<impl wgpu_core::hub::Global<G>>::device_create_buffer
             at /home/rukai/.cargo/git/checkouts/wgpu-53e70f8674b08dd4/eaf8f4a/wgpu-core/src/device/mod.rs:595
  20: wgpu::backend::direct::<impl wgpu::Context for wgpu_core::hub::Global<wgpu_core::hub::IdentityManagerFactory>>::device_create_buffer
             at /home/rukai/.cargo/git/checkouts/wgpu-rs-40ea39809c03c5d8/7b866b1/src/backend/direct.rs:522
  21: wgpu::Device::create_buffer
             at /home/rukai/.cargo/git/checkouts/wgpu-rs-40ea39809c03c5d8/7b866b1/src/lib.rs:1124
  22: wgpu::Device::create_buffer_with_data
             at /home/rukai/.cargo/git/checkouts/wgpu-rs-40ea39809c03c5d8/7b866b1/src/lib.rs:1133
  23: canon_collision::wgpu::buffers::Buffers::new
             at canon_collision/src/wgpu/buffers.rs:60
  24: canon_collision::wgpu::buffers::Buffers::new_fighter_frame
             at canon_collision/src/wgpu/buffers.rs:112
  25: canon_collision::wgpu::WgpuGraphics::draw_fighter_selector
             at canon_collision/src/wgpu/mod.rs:1549
  26: canon_collision::wgpu::WgpuGraphics::menu_render
             at canon_collision/src/wgpu/mod.rs:1238
  27: canon_collision::wgpu::WgpuGraphics::render
             at canon_collision/src/wgpu/mod.rs:614
  28: canon_collision::wgpu::WgpuGraphics::update
             at canon_collision/src/wgpu/mod.rs:511
  29: canon_collision::main::{{closure}}
             at canon_collision/src/main.rs:44
  30: winit::platform_impl::platform::sticky_exit_callback
             at /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.22.2/src/platform_impl/linux/mod.rs:698
  31: winit::platform_impl::platform::x11::EventLoop<T>::run_return
             at /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.22.2/src/platform_impl/linux/x11/mod.rs:299
  32: winit::platform_impl::platform::x11::EventLoop<T>::run
             at /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.22.2/src/platform_impl/linux/x11/mod.rs:390
  33: winit::platform_impl::platform::EventLoop<T>::run
             at /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.22.2/src/platform_impl/linux/mod.rs:645
  34: winit::event_loop::EventLoop<T>::run
             at /home/rukai/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.22.2/src/event_loop.rs:149
  35: canon_collision::main
             at canon_collision/src/main.rs:43
  36: std::rt::lang_start::{{closure}}
             at /home/rukai/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/rt.rs:67
  37: std::rt::lang_start_internal::{{closure}}
             at src/libstd/rt.rs:52
  38: std::panicking::try::do_call
             at src/libstd/panicking.rs:331
  39: std::panicking::try
             at src/libstd/panicking.rs:274
  40: std::panic::catch_unwind
             at src/libstd/panic.rs:394
  41: std::rt::lang_start_internal
             at src/libstd/rt.rs:51
  42: std::rt::lang_start
             at /home/rukai/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/rt.rs:67
  43: main
  44: __libc_start_main
  45: _start

Repro steps
Let me know if you need a self contained repro but hopefully the stack trace is enough.

Platform
Latest commit of wgpu.

bug

Most helpful comment

All good, looks straightforward ill make a PR.

All 6 comments

Ack, copy buffer with data and friends need zero size buffer checks. @kvark what is the intended behavior here, fail with an assert?

Pretty sure its meant to succeed.
https://github.com/gfx-rs/wgpu-rs/pull/257

Oh haha forgot about this one as well
https://github.com/gfx-rs/wgpu/pull/140

The original implementation (which got deleted somehow) put the check in the wgpu crate
Shouldnt it have gone in wgpu-core device_create_buffer though?

Yes, we need this back into device_create_buffer. Sorry about accidentally removing this!

All good, looks straightforward ill make a PR.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

porky11 picture porky11  路  13Comments

kvark picture kvark  路  11Comments

m4b picture m4b  路  14Comments

Aeledfyr picture Aeledfyr  路  23Comments

ZKing1000 picture ZKing1000  路  23Comments