[vtkusers] wxVTKRenderWindowInteractor example (was Re: X Error of failed request: GLXBadDrawable)
Mathieu Malaterre
mathieu.malaterre at gmail.com
Fri Jun 27 09:45:53 EDT 2008
Here is a short wx example to demonstrate the issue:
1. You can hit the X limit pretty easily replacing
wxVTKRenderWindowInteractor with wxVTKRenderWindow (in which case each
renderwindow will creates its own X Display)
2. The issue I can still not work around can be reproduced using the
following python-wx script (*). Even using the complicated (ref Charl
Boath) finalization scheme it seems that something is not getting
clean up here. Could an opengl guru recommend a way to track down the
opengl call that might be leaked ?
Basically all I am doing is create enough widget on the first notebook
page, so that when user click on page 2:
-> I get rid of all widget from page 1
-> all widget defined on page 2 are getting created until we hit the
hardcoded limit
Thanks !
-Mathieu
Ps: you might have to tweak grid=(15,15) for your particular opengl driver
(*)
import wx
from vtk import *
# important to use wxVTKRenderWindowInteractor here since it implement
the wx.GetXDisplay() trick
from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor
class Page(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
grid=(15,15)
sizer = wx.GridSizer(rows=grid[0], cols=grid[1], hgap=1, vgap=1)
n = grid[0]*grid[1]
sphere = vtkSphereSource()
sphereMapper = vtkPolyDataMapper()
sphereMapper.SetInput(sphere.GetOutput())
sphereActor = vtkActor()
sphereActor.SetMapper(sphereMapper)
self._wlist=[]
for i in range(0,n):
ren = vtkRenderer()
ren.AddActor(sphereActor)
renWin = wxVTKRenderWindowInteractor(self,-1, size=(10,10))
self._wlist.append( renWin )
renWin.GetRenderWindow().AddRenderer(ren)
sizer.Add( renWin, 1, wx.EXPAND)
self.SetSizer(sizer)
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Simple Notebook Example")
p = wx.Panel(self)
nb = wx.Notebook(p)
nb.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.MyPageChanged,id=nb.GetId())
self._page1 = Page(nb)
self._page2 = Page(nb)
nb.AddPage(self._page1, "Page 1")
nb.AddPage(self._page2, "Page 2")
sizer = wx.BoxSizer()
sizer.Add(nb, 1, wx.EXPAND)
p.SetSizer(sizer)
def MyPageChanged(self,event=None):
# We should first Finalize the old ones:
print event.GetOldSelection()
if event.GetOldSelection() == 0:
for w in self._page1._wlist:
renderers = w.GetRenderWindow().GetRenderers()
numRenderers = renderers.GetNumberOfItems()
renderers.InitTraversal()
for i in range(0,numRenderers):
w.GetRenderWindow().RemoveRenderer(renderers.GetNextItem())
w.GetRenderWindow().Finalize()
w.SetRenderWindow(None)
del w
event.Skip()
if __name__ == "__main__":
app = wx.App()
MainFrame().Show()
app.MainLoop()
On Thu, Jun 26, 2008 at 4:55 PM, Mathieu Malaterre
<mathieu.malaterre at gmail.com> wrote:
> Hello there,
>
> I am currently stuck on the following problem: when creating a lot
> of vtkRenderWindow (vtkXOpenGLRenderWindow in my case), there are two
> issues:
>
> 1. X has a limited number of Display. And you get an error like that:
>
> ...
> Xlib: connection to ":0.0" refused by server
> Xlib: Maximum number of clients reached
> ERROR: In /home/mmalaterre/Projects/VTK52/Rendering/vtkXOpenGLRenderWindow.cxx,
> line 1592
> vtkXOpenGLRenderWindow (0x2494140): bad X server connection. DISPLAY=:0
> ...
>
> This can easily be worked around by reusing the same DisplayId for
> all your vtkRenderWindow (see SetDisplayId/GetDisplayId).
>
> 2. Once you get pass the first problem, it seem that OpenGL (or nvidia
> implementation in my case) has also a limited number of available
> context. So when creating a lot of vtkRenderWindow you get:
>
> ...
> The error was 'GLXBadDrawable'.
> (Details: serial 403 error_code 158 request_code 143 minor_code 5)
> (Note to programmers: normally, X errors are reported asynchronously;
> that is, you will receive the error a while after causing it.
> To debug your program, run it with the --sync command line
> option to change this behavior. You can then get a meaningful
> backtrace from your debugger if you break on the gdk_x_error() function.)
> ...
>
> I have not been able to work around this issue. Has anyone deal with
> this before ? Is there a solution or at least a work around ?
>
> Thanks for suggestions !
> --
> Mathieu
> Ps: at least on my machine it seems opengl context are leaked even
> after the process was aborted, I cannot even start glxinfo anymore:
>
>
> $ glxinfo
> name of display: :0.0
> X Error of failed request: GLXBadDrawable
> Major opcode of failed request: 143 (GLX)
> Minor opcode of failed request: 5 (X_GLXMakeCurrent)
> Serial number of failed request: 18
> Current serial number in output stream: 18
>
--
Mathieu
More information about the vtkusers
mailing list