gfx-rs/wgpu · error

Buffer range invalid for GLES

Error message

Buffer range invalid for GLES

What it means

Panic in the GLES map_buffer: the requested mapping range is invalid under GL constraints (e.g. non-zero offset or size mismatch not representable by glMapBufferRange), so the mapping cannot proceed. The faulty input is the buffer range passed to map.

Source

Thrown at wgpu-hal/src/gles/device.rs:871

                slice.as_mut_ptr()
            }
            Some(raw) => {
                let gl = &self.shared.context.lock();
                unsafe { gl.bind_buffer(buffer.target, Some(raw)) };
                let mut map_state = buffer.map_state.lock();
                let ptr = if let Some(map_read_allocation) = map_state.data.as_mut() {
                    let slice = map_read_allocation.as_mut_slice();
                    unsafe { self.shared.get_buffer_sub_data(gl, buffer.target, 0, slice) };
                    slice.as_mut_ptr()
                } else {
                    map_state.offset_of_current_mapping = range.start;
                    // glMapBufferRange throws an error if length is 0.
                    // We want to allow mapping 0-sized buffer slices, so perform a workaround
                    // if the range length is 0. The resulting pointer must never be dereferenced.
                    let range_start: i32 = range
                        .start
                        .try_into()
                        .expect("Buffer range invalid for GLES");
                    let range_length: i32 = (range.end - range.start)
                        .try_into()
                        .expect("Buffer range invalid for GLES");
                    if range_length != 0 {
                        map_state.mapped = true;
                        unsafe {
                            gl.map_buffer_range(
                                buffer.target,
                                range_start,
                                range_length,
                                buffer.map_flags,
                            )
                        }
                    } else {
                        ptr::dangling_mut()
                    }
                };
                unsafe { gl.bind_buffer(buffer.target, None) };

View on GitHub (pinned to 3e11ff59bf)

Solutions

  1. Map the whole buffer on GLES (offset 0, full size) by allocating dedicated staging buffers
  2. Avoid sub-range mapping with exotic offsets on the GL backend
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at wgpu-hal/src/gles/device.rs:871 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of gfx-rs/wgpu@3e11ff59bf (2026-09-03). Data as JSON: /api/errors/f5cb2399fdb34360. Report an issue: GitHub.