Утечка памяти при использовании 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)
Другие вопросы по тегам