@@ -286,12 +286,20 @@ pub enum BufferAccessError {
286286 min : wgt:: BufferAddress ,
287287 } ,
288288 #[ error(
289- "Buffer access out of bounds: last index {index} would overrun the buffer (limit: {max})"
289+ "Buffer access out of bounds: start offset {index} would overrun the buffer (limit: {max})"
290290 ) ]
291- OutOfBoundsOverrun {
291+ OutOfBoundsStartOffsetOverrun {
292292 index : wgt:: BufferAddress ,
293293 max : wgt:: BufferAddress ,
294294 } ,
295+ #[ error(
296+ "Buffer access out of bounds: start offset {index} + size {size} would overrun the buffer (limit: {max})"
297+ ) ]
298+ OutOfBoundsEndOffsetOverrun {
299+ index : wgt:: BufferAddress ,
300+ size : wgt:: BufferAddress ,
301+ max : wgt:: BufferAddress ,
302+ } ,
295303 #[ error( "Buffer map range start {start} is greater than end {end}" ) ]
296304 NegativeRange {
297305 start : wgt:: BufferAddress ,
@@ -335,7 +343,8 @@ impl WebGpuError for BufferAccessError {
335343 | Self :: UnalignedOffset { .. }
336344 | Self :: UnalignedRangeSize { .. }
337345 | Self :: OutOfBoundsUnderrun { .. }
338- | Self :: OutOfBoundsOverrun { .. }
346+ | Self :: OutOfBoundsStartOffsetOverrun { .. }
347+ | Self :: OutOfBoundsEndOffsetOverrun { .. }
339348 | Self :: NegativeRange { .. }
340349 | Self :: MapAborted
341350 | Self :: MapStartOffsetOverrun { .. }
@@ -660,7 +669,7 @@ impl Buffer {
660669 if range. end > self . size {
661670 return Err ( (
662671 op,
663- BufferAccessError :: OutOfBoundsOverrun {
672+ BufferAccessError :: OutOfBoundsStartOffsetOverrun {
664673 index : range. end ,
665674 max : self . size ,
666675 } ,
@@ -766,15 +775,22 @@ impl Buffer {
766775 ref range,
767776 ..
768777 } => {
778+ if offset > range. end {
779+ return Err ( BufferAccessError :: OutOfBoundsStartOffsetOverrun {
780+ index : offset,
781+ max : range. end ,
782+ } ) ;
783+ }
769784 if offset < range. start {
770785 return Err ( BufferAccessError :: OutOfBoundsUnderrun {
771786 index : offset,
772787 min : range. start ,
773788 } ) ;
774789 }
775- if offset + range_size > range. end {
776- return Err ( BufferAccessError :: OutOfBoundsOverrun {
777- index : offset + range_size - 1 ,
790+ if range_size > offset - range. start {
791+ return Err ( BufferAccessError :: OutOfBoundsEndOffsetOverrun {
792+ index : offset,
793+ size : range_size,
778794 max : range. end ,
779795 } ) ;
780796 }
0 commit comments