使用 GLX_EXT_texture_from_pixmap 内存泄漏
Memory leak using GLX_EXT_texture_from_pixmap
我正在使用 Cython 编写一个合成 X11 window 管理器。我已经让最重要的部分工作了,但是从像素图创建 GL 纹理给我带来了麻烦。纹理绑定有效并正确呈现,但应用程序很快就会泄漏内存。
从 window 获取命名像素图后,将使用接受 X11 Pixmap
.
的函数创建一个 Texture
对象
texture = Texture.create_from_pixmap(pixmap.id, (256, 256))
Texture.create_from_pixmap
调用 bindTexImage
,从 X11 Pixmap
创建一个 GLXPixmap
,将其绑定到纹理,returns GLXPixmap
.这个GLXPixmap
在Texture
对象实例中保存为一个class变量,当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 还不够熟悉,无法知道内存在哪里或为什么漏水
值得一提的是,我在绑定和释放函数中都插入了打印语句,以验证 GLXPixmap
是否被正确释放,据我所知,它是。
如果相关,可以在此处找到完整代码:https://github.com/jakogut/kivywm
编辑:在重新阅读规范时 (https://www.khronos.org/registry/OpenGL/extensions/EXT/GLX_EXT_texture_from_pixmap.txt)
我偶然发现了这一段,它似乎很相关:
...The storage for the GLX pixmap will be freed when it is not current
to any client and all color buffers that are bound to a texture object
have been released.
正如一位乐于助人的匿名编码员指出的那样,glXCreatePixmap
的 Khronos 文档中没有提到一个 glXDestroyPixmap
函数。 (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)
我正在使用 Cython 编写一个合成 X11 window 管理器。我已经让最重要的部分工作了,但是从像素图创建 GL 纹理给我带来了麻烦。纹理绑定有效并正确呈现,但应用程序很快就会泄漏内存。
从 window 获取命名像素图后,将使用接受 X11 Pixmap
.
Texture
对象
texture = Texture.create_from_pixmap(pixmap.id, (256, 256))
Texture.create_from_pixmap
调用 bindTexImage
,从 X11 Pixmap
创建一个 GLXPixmap
,将其绑定到纹理,returns GLXPixmap
.这个GLXPixmap
在Texture
对象实例中保存为一个class变量,当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 还不够熟悉,无法知道内存在哪里或为什么漏水
值得一提的是,我在绑定和释放函数中都插入了打印语句,以验证 GLXPixmap
是否被正确释放,据我所知,它是。
如果相关,可以在此处找到完整代码:https://github.com/jakogut/kivywm
编辑:在重新阅读规范时 (https://www.khronos.org/registry/OpenGL/extensions/EXT/GLX_EXT_texture_from_pixmap.txt)
我偶然发现了这一段,它似乎很相关:
...The storage for the GLX pixmap will be freed when it is not current to any client and all color buffers that are bound to a texture object have been released.
正如一位乐于助人的匿名编码员指出的那样,glXCreatePixmap
的 Khronos 文档中没有提到一个 glXDestroyPixmap
函数。 (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)