2012-01-03 1 views
2

можно узнать выделенную область памяти контекста OpenGL? Предположительно, этот диапазон памяти должен быть доступен с помощью mmap() из другого процесса. Может ли эта техника работать, или есть фундаментальные проблемы с ней?Доступ к видеопамяти с mmap(), зная контекст OpenGL и визуальный ID

Обновление Мы используем систему GNU/Linux с современной установкой X11 и можем выбрать производителя видеокарты, чьи драйверы поддерживают такой трюк.

ответ

3

Ну, есть бесчисленное множество причин, почему это не будет работать.

Во-первых, «выделенный диапазон памяти контекста OpenGL» всегда меняется. Контексты OpenGL выделяют новую память и освобождают ее по мере ее принятия.

Во-вторых, я бы не стал доверять OpenGL-драйверу, чтобы выжить в таких условиях памяти, как это. Несколько контекстов OpenGL могут сосуществовать, но только потому, что они все знают друг о друге, и водитель может поэтому компенсировать их. Очень маловероятно, что контекст может ассимилировать изменения, сделанные другим контекстом.

В-третьих, графические процессоры часто работают с графической памятью. Даже если вы можете использовать mmap на GPU-памяти (что само маловероятно), вы, вероятно, потеряете много производительности, когда сможете. И память GPU перетасовывается гораздо больше, чем память процессора.

Возможно, вы пытаетесь сделать графику на основе IPC. Лучше всего было бы, чтобы графическая система была собственным процессом, с которым вы общаетесь с помощью методов IPC, вместо того, чтобы пытаться разговаривать с OpenGL через IPC.

0

Зависит от ОС и водителя. Это возможно с помощью X-server. Хотя комбинация X-сервера, драйвера дисплея и openGL означает, что он может перемещать память для определенного объекта вокруг карты, когда он ее рисует.

Простой способ, вероятно, использовать openGL pixel/vertex buffer и получить указатель на буфер

+0

Это не будет работать. Отображение буфера не гарантирует получение адреса памяти GPU. Или адрес памяти процессора. –

+0

@Nicol - вы не можете mmap адрес буфера, но это единственный способ получить действительный адрес памяти буфера openGL, который отображается в его адресном пространстве процессора –

0

Возможно ли узнать выделенную область памяти контекста OpenGL?

Я думаю, что вы запрашиваете доступ к памяти, где контекст OpenGL сохраняет свои объекты и вывод рендеринга.

№. Контекст OpenGL представляет собой абстрактную конструкцию и имеет ее память на совершенно другой машине и/или архитектуре.

В дополнение к этому не существует стандартной или даже общей схемы памяти для содержимого контекста OpenGL. Если вас интересует только результат рендеринга, вы можете нажать на устройство framebuffer (/dev/fb…), хотя производительность будет хуже, чем просто считывать содержимое фреймбуфера с помощью glReadPixels. Аналогично идет выбор диапазона памяти PCI, что практически совпадает с нажатием на устройство фреймбуфера.

Смежные вопросы