内存泄漏使用GLX_EXT_texture_from_pixmap

问题描述 投票:1回答:1

我正在使用Cython编写一个合成X11窗口管理器。我有最重要的部分工作,但从pixmaps创建GL纹理给我带来麻烦。纹理绑定可以正常工作,但应用程序可以非常快速地泄漏内存。

从窗口获取命名的像素图后,使用接受X11 Texture的函数创建Pixmap对象。

texture = Texture.create_from_pixmap(pixmap.id, (256, 256))

Texture.create_from_pixmapbindTexImage,它从X11 GLXPixmap创造一个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,以了解内存泄漏的位置或原因。

值得一提的是,我已经在bind和release函数中插入了print语句,以验证GLXPixmap是否正确释放,据我所知,它是。

如果它是相关的,可以在这里找到完整的代码:https://github.com/jakogut/kivywm

编辑:重读规范(https://www.khronos.org/registry/OpenGL/extensions/EXT/GLX_EXT_texture_from_pixmap.txt

我偶然发现了这段似乎相关的内容:

...当GLX像素图不是任何客户端的当前存储时,将释放GLX像素图的存储,并且已释放绑定到纹理对象的所有颜色缓冲区。

opengl cython x11 window-managers glx
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.