Утечка памяти при использовании GLX_EXT_texture_from_pixmap
Я пишу композитный оконный менеджер X11 с использованием Cython. У меня работают самые важные части, но создание текстур GL из растровых изображений доставляет мне проблемы. Привязка текстур работает и корректно отображается, но приложение очень быстро теряет память.
После получения именованного изображения из окна Texture
объект создан с функцией, которая принимает X11 Pixmap
,
texture = Texture.create_from_pixmap(pixmap.id, (256, 256))
Texture.create_from_pixmap
звонки bindTexImage
, который создает GLXPixmap
от X11 Pixmap
, привязывает его к текстуре и возвращает GLXPixmap
, это GLXPixmap
сохраняется как переменная класса в Texture
экземпляр объекта, который будет освобожден, когда Texture
удален
cdef GLXPixmap bindTexImage(Pixmap pixmap):
cdef int *pixmap_attribs = [
GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT,
0x8000
]
cdef GLXPixmap glxpixmap
glxpixmap = glXCreatePixmap(window_info.display, configs[0], pixmap, pixmap_attribs)
# Commenting out this line fixes the memory leak
glx.glXBindTexImageEXT(window_info.display, glxpixmap, GLX_FRONT_EXT, NULL)
return glxpixmap
cdef void releaseTexImage(GLXPixmap glxpixmap):
glx.glXReleaseTexImageEXT(window_info.display, glxpixmap, GLX_FRONT_EXT)
При отладке проблемы я обнаружил, что удаление вызова glXBindTexImageEXT
устраняет утечку памяти, но я еще недостаточно знаком с OpenGL, GLX и X11, чтобы знать, где и почему происходит утечка памяти.
Стоит отметить, что я вставил операторы print в функции bind и release, чтобы убедиться, что GLXPixmap
выпущен должным образом, и, насколько я могу судить, это так.
В случае необходимости полный код можно найти здесь: https://github.com/jakogut/kivywm
РЕДАКТИРОВАТЬ: при перечитывании спецификации ( https://www.khronos.org/registry/OpenGL/extensions/EXT/GLX_EXT_texture_from_pixmap.txt)
Я наткнулся на этот абзац, который кажется уместным:
... Хранилище для растрового изображения GLX будет освобождено, если оно не является текущим для любого клиента, и все цветовые буферы, связанные с объектом текстуры, были освобождены.
1 ответ
Как отметил полезный анонимный кодер, существует glXDestroyPixmap
функция, которая не упоминается в документации Khronos для glXCreatePixmap
, ( https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glXCreatePixmap.xml)
Использование этой функции для освобождения GLXPixmap после его выпуска решило проблему утечки памяти.
РЕДАКТИРОВАТЬ: Это было исправить:
cdef void releaseTexImage(GLXPixmap glxpixmap):
glx.glXReleaseTexImageEXT(window_info.display, glxpixmap, GLX_FRONT_EXT)
glXDestroyPixmap(window_info.display, glxpixmap)