Ich schreibe einen Compositing X11 Window Manager mit Cython. Ich habe die wichtigsten Teile in Arbeit, aber die Erstellung von GL-Texturen aus Pixmaps bereitet mir Probleme. Die Texturbindung funktioniert ordnungsgemäß und wird ordnungsgemäß gerendert, aber die Anwendung verliert sehr schnell Speicher.Speicherverlust mit GLX_EXT_texture_from_pixmap
Nachdem ein benannter Pixmap aus einem Fenster abgerufen wurde, wird ein Texture
Objekt mit einer Funktion erstellt, die X11 Pixmap
akzeptiert.
texture = Texture.create_from_pixmap(pixmap.id, (256, 256))
Texture.create_from_pixmap
nennt bindTexImage
, die eine GLXPixmap
aus dem X11 Pixmap
schafft, bindet es an die Textur und gibt den GLXPixmap
. Diese GLXPixmap
wird als Klassenvariable in der Texture
Objektinstanz gespeichert, die freigegeben wird, wenn die Texture
gelöscht wird.
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)
das Problem bei der Fehlersuche, fand ich, dass das Gespräch zu glXBindTexImageEXT
fixiert den Speicherverlust zu entfernen, aber ich bin noch nicht vertraut genug mit OpenGL, GLX und X11 zu wissen, wo oder warum der Speicher undicht ist.
Es ist erwähnenswert, dass ich Print-Anweisungen sowohl in die Binde-und Freigabe-Funktionen eingefügt haben, um zu überprüfen, dass die GLXPixmap
ordnungsgemäß freigegeben wird, und soweit ich das beurteilen kann, ist es.
Falls relevant es ist, kann vollständiger Code hier: https://github.com/jakogut/kivywm
EDIT: die Spezifikation In rereading (https://www.khronos.org/registry/OpenGL/extensions/EXT/GLX_EXT_texture_from_pixmap.txt)
ich auf diesem Absatz gestolpert, die relevant scheint:
... Der Speicher für das GLX-Pixmap wird freigegeben, wenn es nicht aktuell zu einem Client ist und alle Farbpuffer, die an ein Texturobjekt gebunden sind, freigegeben wurden.