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