xpra icon
Bug tracker and wiki

This bug tracker and wiki are being discontinued
please use https://github.com/Xpra-org/xpra instead.


Ticket #1770: gl-reinit.patch

File gl-reinit.patch, 3.7 KB (added by Antoine Martin, 2 years ago)

example glcontext re-init handler

  • xpra/client/gl/gl_window_backing_base.py

     
    724724
    725725
    726726    def present_fbo(self, x, y, w, h, flush=0):
     727        import random
     728        if int(20*random.random())==0:
     729            raise Exception("test handler")
    727730        log("present_fbo: adding %s to pending paint list (size=%i), flush=%s, paint_screen=%s",
    728731            (x, y, w, h), len(self.pending_fbo_paint), flush, self.paint_screen)
    729732        self.pending_fbo_paint.append((x, y, w, h))
  • xpra/platform/xposix/gl_context.py

     
    6060class GLXWindowContext(object):
    6161
    6262    def __init__(self, glx_context, xid):
    63         self.context = glx_context
     63        self.context = glx_context.context
     64        self.reinit = glx_context.reinit
    6465        self.xid = xid
    6566        self.xdisplay = get_xdisplay()
    6667        self.valid = False
     
    7172            raise Exception("glXMakeCurrent failed")
    7273        self.valid = True
    7374
    74     def __exit__(self, *_args):
     75    def __exit__(self, exception_type, exception_value, traceback):
    7576        self.valid = False
    7677        if self.context:
    7778            context_type = type(self.context)
     
    7879            null_context = cast(0, context_type)
    7980            log("glXMakeCurrent: NULL for xid=%#x", self.xid)
    8081            GLX.glXMakeCurrent(self.xdisplay, 0, null_context)
     82            if exception_type:
     83                log("%s exception: %s", self, (exception_type, exception_value, traceback))
     84                log.warn("Warning: re-initializing GLX context")
     85                log.warn(" following %s", exception_value)
     86                self.context = self.reinit()
    8187
    8288    def swap_buffers(self):
    8389        assert self.valid
     
    9096class GLXContext(object):
    9197
    9298    def __init__(self, alpha=False):
     99        self.alpha = alpha
     100        self.context = None
     101        self.init()
     102
     103    def destroy(self):
     104        c = self.context
     105        if c:
     106            self.context = None
     107            GLX.glXDestroyContext(self.xdisplay, c)
     108
     109    def reinit(self):
     110        self.destroy()
     111        self.init()
     112        return self.context
     113
     114    def init(self):
    93115        display = display_get_default()
    94116        screen = display.get_default_screen()
    95117        bpc = 8
     
    98120            GLX.GLX_RED_SIZE        : bpc,
    99121            GLX.GLX_GREEN_SIZE      : bpc,
    100122            GLX.GLX_BLUE_SIZE       : bpc,
    101             GLX.GLX_ALPHA_SIZE      : int(alpha)*bpc,
     123            GLX.GLX_ALPHA_SIZE      : int(self.alpha)*bpc,
    102124            GLX.GLX_DOUBLEBUFFER    : int(DOUBLE_BUFFERED),
    103125            })
    104126        self.props = {}
     
    150172                raise
    151173        self.props["vendor"] = getstr(GL_VENDOR)
    152174        self.props["renderer"] = getstr(GL_RENDERER)
    153         log("GLXContext(%s) context=%s, props=%s", alpha, self.context, self.props)
     175        log("GLXContext(%s) context=%s, props=%s", self.alpha, self.context, self.props)
    154176
    155177    def check_support(self, force_enable=False):
    156178        i = self.props
     
    175197
    176198    def get_paint_context(self, gdk_window):
    177199        assert self.context and gdk_window
    178         return GLXWindowContext(self.context, get_xwindow(gdk_window))
     200        return GLXWindowContext(self, get_xwindow(gdk_window))
    179201
    180     def destroy(self):
    181         c = self.context
    182         if c:
    183             self.context = None
    184             GLX.glXDestroyContext(self.xdisplay, c)
    185 
    186202    def __repr__(self):
    187203        return "GLXContext(%s)" % self.props
    188204