Как часто, ответ - «Это зависит». В некоторых ситуациях glMapBuffer действительно выделит память через malloc , скопирует туда данные для вашего использования и glUnmapBuffer освободит ее.
Однако распространенный способ реализации glMapBuffer - это отображение памяти. Если вы не знаете, что это такое, посмотрите документацию syscalls mmap (* nix-систем, таких как Linux, MacOS X) или CreateFileMap . То, что там происходит, довольно интересно: современные операционные системы управляют адресным пространством запущенных процессов в виртуальной памяти. Каждый раз, когда к какой-то «памяти» обращаются, управление памятью ОС использует полученный адрес в качестве индекса в таблице перевода, чтобы перенаправить операцию в оперативную память системы, пространство подкачки и т. Д. (Конечно, детали довольно сложны, управление памятью одна из самых сложных вещей в ядре, чтобы понять). Драйвер может установить свой собственный обработчик доступа. Таким образом, процесс может mmap
что-то, управляемое драйвером, в свое адресное пространство, и каждый раз, когда он выполняет доступ к нему, вызывается обработчик mmap драйвера. Это позволяет драйверу отображать некоторую память графического процессора (через DMA) в адресное пространство процесса и вести необходимый учет. В этой ситуации glMapBuffer создаст такое отображение памяти, а полученный вами указатель будет указывать на некоторое адресное пространство в вашем процессе, которое было отображено в память DMA, зарезервированную для графического процессора.