Skip to content

Commit 53bda09

Browse files
SYNC POINT: merge
5 parents c2af157 + e1013d0 + 984c1ea + a5d9a59 + 8d36adc commit 53bda09

3 files changed

Lines changed: 35 additions & 22 deletions

File tree

wgpu-core/src/device/queue.rs

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,9 @@ impl Queue {
650650
buffer_offset: u64,
651651
buffer_size: wgt::BufferSize,
652652
) -> Result<(), TransferError> {
653+
if !matches!(&*buffer.map_state.lock(), BufferMapState::Idle) {
654+
todo!();
655+
}
653656
buffer.check_usage(wgt::BufferUsages::COPY_DST)?;
654657
if buffer_size.get() % wgt::COPY_BUFFER_ALIGNMENT != 0 {
655658
return Err(TransferError::UnalignedCopySize(buffer_size.get()));
@@ -692,27 +695,34 @@ impl Queue {
692695

693696
self.validate_write_buffer_impl(&buffer, buffer_offset, staging_buffer.size)?;
694697

695-
let region = hal::BufferCopy {
696-
src_offset: 0,
697-
dst_offset: buffer_offset,
698-
size: staging_buffer.size,
699-
};
700-
let barriers = iter::once(hal::BufferBarrier {
701-
buffer: staging_buffer.raw(),
702-
usage: hal::StateTransition {
703-
from: wgt::BufferUses::MAP_WRITE,
704-
to: wgt::BufferUses::COPY_SRC,
705-
},
706-
})
707-
.chain(transition.map(|pending| pending.into_hal(&buffer, snatch_guard)))
708-
.collect::<Vec<_>>();
709-
let encoder = pending_writes.activate();
710-
unsafe {
711-
encoder.transition_buffers(&barriers);
712-
encoder.copy_buffer_to_buffer(staging_buffer.raw(), dst_raw, &[region]);
713-
}
698+
if buffer
699+
.usage
700+
.intersects(wgt::BufferUsages::MAP_READ | wgt::BufferUsages::MAP_WRITE)
701+
{
702+
let asdf = buffer.raw(&self.device.snatchable_lock.read()).unwrap();
703+
} else {
704+
let region = hal::BufferCopy {
705+
src_offset: 0,
706+
dst_offset: buffer_offset,
707+
size: staging_buffer.size,
708+
};
709+
let barriers = iter::once(hal::BufferBarrier {
710+
buffer: staging_buffer.raw(),
711+
usage: hal::StateTransition {
712+
from: wgt::BufferUses::MAP_WRITE,
713+
to: wgt::BufferUses::COPY_SRC,
714+
},
715+
})
716+
.chain(transition.map(|pending| pending.into_hal(&buffer, snatch_guard)))
717+
.collect::<Vec<_>>();
718+
let encoder = pending_writes.activate();
719+
unsafe {
720+
encoder.transition_buffers(&barriers);
721+
encoder.copy_buffer_to_buffer(staging_buffer.raw(), dst_raw, &[region]);
722+
}
714723

715-
pending_writes.insert_buffer(&buffer);
724+
pending_writes.insert_buffer(&buffer);
725+
}
716726

717727
// Ensure the overwritten bytes are marked as initialized so
718728
// they don't need to be nulled prior to mapping or binding.

wgpu-core/src/device/resource.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,10 @@ impl Device {
990990

991991
let buffer_use = if !desc.mapped_at_creation {
992992
wgt::BufferUses::empty()
993-
} else if desc.usage.contains(wgt::BufferUsages::MAP_WRITE) {
993+
} else if desc
994+
.usage
995+
.intersects(wgt::BufferUsages::MAP_WRITE | wgt::BufferUsages::MAP_READ)
996+
{
994997
// buffer is mappable, so we are just doing that at start
995998
let map_size = buffer.size;
996999
let mapping = if map_size == 0 {

wgpu-core/src/resource.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ impl Buffer {
816816
range,
817817
host,
818818
} => {
819-
#[allow(clippy::collapsible_if)]
819+
#[cfg_attr(not(feature = "trace"), expect(clippy::collapsible_if))]
820820
if host == HostMap::Write {
821821
#[cfg(feature = "trace")]
822822
if let Some(ref mut trace) = *device.trace.lock() {

0 commit comments

Comments
 (0)