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