даже так — без одной операции копирования вряд ли обойтись
нет, почему, если на видеокарте лежат (а тем более в unified memory на SoC). В терории. Другое дело, что на практике зачастую платформенные абстракции не дают простого способа получить сырой адрес вместо хендла, и какие-то могут принять хостовый, а какие-то GPU адрес. На андроиде было плохо - сначала был GraphicsBuffer, потом его сделали приватным и ничего не было, пока не появился ImageReader.
Неприятно это всё, потому что на уровне драйверов и железа обычно преград никаких нет.
Помню, у меня горело от того, что было расширение для EGL, чтобы получить из OpenGL буфера его хендл (PRIME) в линуксе - и можно было передать в VAAPI для кодирования видео на линуксе, а для GLX такого не было. По-нормальному что-то сложно показалось, для прототипа накостылил штуку, которая хукала IOCTL и воровала хендл буфера оттуда, когда он создавался через GL API
А потом пригорало, что на Google Pixel нет “драйвера” (на самом деле - юзерспейсной либы, драйвер-то один и тот же) OpenCL, а если его тащить либой в приложении - то контекст из GL не шарился. Это я уже потом осознал, что память-то unified, можно просто поинтер взять.