Skip to content

Commit 9aba3f6

Browse files
WIP: redo it all AGAIN
1 parent 99a8028 commit 9aba3f6

2 files changed

Lines changed: 42 additions & 4 deletions

File tree

wgpu-core/src/buffer_region_overrun.rs

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,49 @@ use wgt::BufferAddress;
33

44
use crate::command::{CopySide, TransferError};
55

6+
#[derive(Clone, Debug, Error)]
7+
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8+
pub enum BufferRegion {
9+
Range(BufferRange),
10+
Whole { buffer_size: BufferAddress },
11+
}
12+
13+
#[derive(Clone, Debug)]
14+
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15+
pub struct BufferRange {
16+
pub start_offset: BufferAddress,
17+
pub size: BufferAddress,
18+
}
19+
20+
#[derive(Clone, Debug, Error)]
21+
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22+
pub struct BufferRegionOutOfBoundsError {
23+
pub range: BufferRange,
24+
pub region: BufferRegion,
25+
pub kind: BufferRegionOutOfBoundsErrorKind,
26+
}
27+
28+
#[derive(Clone, Debug)]
29+
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
30+
#[non_exhaustive]
31+
pub enum BufferRegionOutOfBoundsErrorKind {
32+
StartOffsetUnderrun,
33+
StartOffsetOverrun,
34+
EndOffsetOverrun,
35+
}
36+
637
/// Error encountered while checking offsets against a buffer.
738
#[derive(Clone, Debug, Error)]
839
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
940
#[non_exhaustive]
1041
pub enum BufferRegionOverrunError {
42+
#[error("start offset ({offset}) would underrun of size {buffer_size}")]
43+
StartOffsetUnderrun {
44+
start_offset: BufferAddress,
45+
region: BufferRegion,
46+
},
1147
#[error("start offset ({offset}) is out-of-bounds for buffer of size {buffer_size}")]
12-
StartOffset {
48+
StartOffsetOverrun {
1349
offset: BufferAddress,
1450
buffer_size: BufferAddress,
1551
},
@@ -19,7 +55,7 @@ pub enum BufferRegionOverrunError {
1955
size,
2056
buffer_size
2157
)]
22-
EndOffset {
58+
EndOffsetOverrun {
2359
offset: BufferAddress,
2460
size: BufferAddress,
2561
buffer_size: BufferAddress,
@@ -43,7 +79,7 @@ impl BufferRegionOverrunError {
4379
buffer_size: BufferAddress,
4480
) -> Result<BufferOverrunEndOffsetChecker, Self> {
4581
if start_offset >= buffer_size {
46-
return Err(Self::StartOffset {
82+
return Err(Self::StartOffsetOverrun {
4783
offset: start_offset,
4884
buffer_size,
4985
});
@@ -74,7 +110,7 @@ impl BufferOverrunEndOffsetChecker {
74110

75111
// NOTE: Should never underflow because of our earlier check.
76112
if size > buffer_size - start_offset {
77-
return Err(BufferRegionOverrunError::EndOffset {
113+
return Err(BufferRegionOverrunError::EndOffsetOverrun {
78114
offset: start_offset,
79115
size,
80116
buffer_size,

wgpu-core/src/resource.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,8 @@ pub enum BufferAccessError {
281281
UnalignedOffset { offset: wgt::BufferAddress },
282282
#[error("Buffer range size invalid: range_size {range_size} must be multiple of 4")]
283283
UnalignedRangeSize { range_size: wgt::BufferAddress },
284+
#[error("Mapped range ")]
285+
OutOfBounds(BufferRegionOverrunError),
284286
#[error("Buffer access out of bounds: index {index} would underrun the buffer (limit: {min})")]
285287
OutOfBoundsStartOffsetUnderrun {
286288
index: wgt::BufferAddress,

0 commit comments

Comments
 (0)