Доступ к данным на графическом процессоре из библиотеки dll?

#memory #dll #gpu

#память #dll #графический процессор

Вопрос:

Вот проблема: плагин, который изменяет координаты вершин (их много) для 3D-приложения. Все вершины уже находятся в памяти графического процессора, поэтому кажется довольно расточительным отправлять туда еще одну копию, выполнять вычисления, отправлять результаты обратно в основную память и, наконец, заставлять хост-приложение отправлять их еще раз на графический процессор для обновления. В какой-то момент мне действительно нужны вычисленные значения, но проблема производительности заключается в быстром обновлении дисплея. Как только деформация будет выполнена, мне все равно, сколько времени потребуется, чтобы получить обновленные координаты в основную память.

Возможно ли это вообще? Я только начал изучать OpenGL / OpenCL, поэтому я не запрашиваю подробного объяснения процесса. Только выполнимо ли это обычным способом или только с помощью какого-то эзотерического взлома, или вообще нет.

Спасибо за вашу помощь!

Ответ №1:

Да, это возможно с помощью OpenGL и OpenCL. Сначала вам нужно создать буфер вершин в OpenGL. Затем вы можете создать контекст OpenCL, который может обмениваться данными с контекстом OpenGL. Вы можете использовать clEnqueueAcquireGLObjects для получения указателя на буфер. Очевидно, что это еще не все, взаимодействие с Google OpenGL OpenCL или общий контекст OpenGL OpenCL для необходимого кода.

Примечание: у вас могут возникнуть проблемы с получением контекста GL, если это для закрытого исходного кода и предварительно созданного приложения.

Комментарии:

1. Извините, я должен был быть более конкретным (и не публиковать так поздно). Плагин (dll) подключается к приложению через свой SDK, который не предоставляет доступ к тому, что он отправляет на графический процессор. Поэтому мне интересно, что для этого может потребоваться некоторый взлом.

2. Я не думаю, что это возможно без дескрипторов OpenGL для объектов контекста и буфера. Они содержат ячейки памяти и размер данных. Без них это было бы похоже на поиск чего-то в оперативной памяти, вы бы не знали, с чего начать / прекратить поиск, размер и т. Д. с дополнительной сложностью нахождения в видеопамяти. Кстати, поскольку вы говорите о .dll, я предполагаю, что вы используете Windows, есть вероятность, что приложение использует DirectX. Он также имеет взаимодействие с OpenCL, но я никогда не изучал его

3. Спасибо за ваш ответ. Вы подтверждаете то, чего я боялся. Приложение 3D имеет версии как для Windows, так и для Mac и использует OpenGL (и написано на C). На данный момент я работаю только над Windows. После поиска еще в отрывочной документации их SDK ничего не говорится о доступе к данным на стороне графического процессора. Мне придется вернуться к этому, когда я узнаю больше. Еще раз спасибо за вашу помощь 🙂