Quick answer: OpenGL glMapBufferRange returning stale data on Intel Arc / Aurora drivers? You’re missing the GL_MAP_INVALIDATE_BUFFER_BIT or GL_MAP_FLUSH_EXPLICIT_BIT — the driver caches.

An OpenGL renderer streams vertex data via mapped buffers. On Intel’s recent driver, the GPU reads previous-frame data. Buffer invalidation is missing.

Invalidate Before Map

glMapBufferRange(GL_ARRAY_BUFFER, 0, size,
  GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);

Tells the driver the old contents are gone — it allocates a fresh region. No stale reads possible.

Explicit Flush

For range updates, use GL_MAP_FLUSH_EXPLICIT_BIT + glFlushMappedBufferRange. The driver delays propagation until you explicitly flush, batching writes.

Unsynchronized Streaming

GL_MAP_UNSYNCHRONIZED_BIT skips driver sync — you guarantee the GPU isn’t reading the range you write. Combined with fence sync, you can chain updates without stalls.

Vendor Quirks

Different vendors implement caching differently. NVIDIA forgives missing INVALIDATE; Intel and AMD don’t. Always set the right flags from the start.

Verifying

RenderDoc capture shows your buffer with the expected contents per frame. No frame-old data in the draw call.

“OpenGL mapped buffers need explicit invalidation. Don’t rely on driver heroics.”

Build a tiny BufferStreamer class that wraps mapping with the right flags — you stop forgetting them and your renderer behaves identically across vendors.