All writes to valid_buffer_range are protected by a mutex. Only the reads are not. I've got no idea what to do with invalidate_buffer. If we added mutexes everywhere, it would slow down the driver. I think that calling BufferData in one thread and using the buffer for rendering in some other thread is a race condition in the application and should be fixed in the app.