@@ -3,13 +3,49 @@ use wgt::BufferAddress;
33
44use 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]
1041pub 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,
0 commit comments