mapAndCopyBufferRange

open override fun mapAndCopyBufferRange(target: Int, offset: Int, length: Int, source: ByteArray, srcOffset: Int = 0, access: Int)

Upload length bytes from source (starting at srcOffset) into the buffer object currently bound to target, at byte offset within the buffer. Implemented via glMapBufferRange(... access) + memcpy + glUnmapBuffer where supported (JVM / Android with GLES3+); falls back to bufferSubData on JS / older runtimes.

The mapping path lets the driver hand back fresh-mapped staging memory directly when the previous transfer is still in flight (no implicit synchronization), saving a driver round-trip vs. the bufferData(null) + bufferData(data) orphan idiom.

Caller passes the access mask explicitly so the same primitive can be used for "rename the whole buffer" (WRITE | INVALIDATE_BUFFER | UNSYNCHRONIZED) and "patch a sub-range" (WRITE | INVALIDATE_RANGE) patterns.