2017-12-18 8 views
1

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.

Antwort

1

Als hilfreich anonymen Coder wies darauf hin, gibt es eine glXDestroyPixmap Funktion, die nicht für glXCreatePixmap in der Khronos Dokumentation erwähnt wird. (https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glXCreatePixmap.xml)

Mit dieser Funktion, um die GLXPixmap nach der Freigabe freizugeben, wurde das Speicherleck behoben.

EDIT: Dies war das fix:

cdef void releaseTexImage(GLXPixmap glxpixmap): 
    glx.glXReleaseTexImageEXT(window_info.display, glxpixmap, GLX_FRONT_EXT) 
    glXDestroyPixmap(window_info.display, glxpixmap)