2017-12-18 18 views
1

私はCythonを使って合成X11ウィンドウマネージャを書いています。私は最も重要なビットが働いていますが、ピックスマップからGLテクスチャを作成することは困っています。テクスチャバインディングが動作し、適切にレンダリングされますが、アプリケーションはメモリを非常に迅速にリークします。GLX_EXT_texture_from_pixmapを使ったメモリリーク

ウィンドウから名前付きピックスマップを取得した後、Textureオブジェクトは、X11 Pixmapを受け入れる関数で作成されます。

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

Texture.create_from_pixmap X11 PixmapからGLXPixmapを作成し、呼び出しbindTexImageは、テクスチャにそれを結合し、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ことがわかりました。

GLXPixmapが適切にリリースされていることを確認するためにprint文をbind関数とrelease関数の両方に挿入したことに言及することは重要です。

それは関連性の場合

は、完全なコードはここで見つけることができます:https://github.com/jakogut/kivywm

EDIT:

:関連すると思われる( https://www.khronos.org/registry/OpenGL/extensions/EXT/GLX_EXT_texture_from_pixmap.txt

が、私はこのパラグラフに出くわしてきた仕様を、再読で

... GLXピックスマップのストレージは、クライアントに現在の でなく、テクスチャオブジェクト にバインドされているすべてのカラーバッファが解放されているときに解放されます。

答えて

1

役立つ匿名コーダが指摘したように、glXCreatePixmap用クロノスのドキュメントに記載されていないglXDestroyPixmap機能があります。 (https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glXCreatePixmap.xml

GLXPixmapを解放した後にこの関数を使用してメモリリークを解決しました。

EDIT:これは修正した:

cdef void releaseTexImage(GLXPixmap glxpixmap): 
    glx.glXReleaseTexImageEXT(window_info.display, glxpixmap, GLX_FRONT_EXT) 
    glXDestroyPixmap(window_info.display, glxpixmap) 
関連する問題