From b0475520facc7abf072ec8290c0f0d6646ee9167 Mon Sep 17 00:00:00 2001 From: Rukai Date: Mon, 15 Jun 2020 00:58:12 +1000 Subject: [PATCH] Fix validation errors + panics on empty buffers --- wgpu-core/src/device/life.rs | 32 ++++++++++++++++++-------------- wgpu-core/src/device/mod.rs | 4 +++- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/wgpu-core/src/device/life.rs b/wgpu-core/src/device/life.rs index 8f8a3173b7..bae0a170c2 100644 --- a/wgpu-core/src/device/life.rs +++ b/wgpu-core/src/device/life.rs @@ -683,21 +683,25 @@ impl LifetimeTracker { resource::BufferMapState::Waiting(pending_mapping) => pending_mapping, _ => panic!("No pending mapping."), }; - log::debug!("Buffer {:?} map state -> Active", buffer_id); - let host = mapping.op.host; - let status = match super::map_buffer(raw, buffer, mapping.sub_range.clone(), host) { - Ok(ptr) => { - buffer.map_state = resource::BufferMapState::Active { - ptr, - sub_range: mapping.sub_range, - host, - }; - resource::BufferMapAsyncStatus::Success - } - Err(e) => { - log::error!("Mapping failed {:?}", e); - resource::BufferMapAsyncStatus::Error + let status = if mapping.sub_range.size.map_or(true, |x| x != 0) { + log::debug!("Buffer {:?} map state -> Active", buffer_id); + let host = mapping.op.host; + match super::map_buffer(raw, buffer, mapping.sub_range.clone(), host) { + Ok(ptr) => { + buffer.map_state = resource::BufferMapState::Active { + ptr, + sub_range: mapping.sub_range, + host, + }; + resource::BufferMapAsyncStatus::Success + } + Err(e) => { + log::error!("Mapping failed {:?}", e); + resource::BufferMapAsyncStatus::Error + } } + } else { + resource::BufferMapAsyncStatus::Success }; pending_callbacks.push((mapping.op, status)); } diff --git a/wgpu-core/src/device/mod.rs b/wgpu-core/src/device/mod.rs index 4e14561717..7adcef67a8 100644 --- a/wgpu-core/src/device/mod.rs +++ b/wgpu-core/src/device/mod.rs @@ -2767,7 +2767,9 @@ impl Global { hal::memory::Dependencies::empty(), iter::once(transition_src).chain(iter::once(transition_dst)), ); - comb.copy_buffer(&stage_buffer, &buffer.raw, iter::once(region)); + if buffer.size > 0 { + comb.copy_buffer(&stage_buffer, &buffer.raw, iter::once(region)); + } } device .pending_writes