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.

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.

Appendix: 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)