Ответ 1
Лучший способ - использовать OpenCL/OpenGL interop, если ваша реализация OpenCL поддерживает его. Это позволяет OpenCL получать доступ к некоторым объектам OpenGL (объекты буфера и текстуры/рендерингбуферы). Вы не сможете напрямую обращаться к фреймбуферу OpenGL по умолчанию (т.е. К дисплею), но вы сможете получить доступ к изображению, привязанному к фреймбуферу. Оттуда вы можете в OpenGL сделать фреймбуфер blit для стандартного фреймбуфера. Ничего не коснется памяти ЦП.
Чтобы узнать подробности, вам нужно будет изучить особенности CL/GL interop. Основная идея заключается в том, что вы создаете renderbuffer в OpenGL (который вы связываете с FBO). Затем вы передаете этот renderbuffer в OpenCL и выполняете свои вычисления в renderbuffer. После этого вы выполните glBlitFramebuffer
, чтобы скопировать данные из renderbuffer в стандартный фреймбуфер, затем смените буферы, чтобы отобразить его.