[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: [PATCH] winex11: Don't create a temporary context each time X11DRV_wglBindTexImageARB is called.
From:       Miklós Máté <mtmkls () gmail ! com>
Date:       2016-02-29 22:20:50
Message-ID: 56D4C442.1070606 () gmail ! com
[Download RAW message or body]

On 02/29/2016 06:10 PM, Matteo Bruni wrote:
> 2016-02-29 3:59 GMT+01:00 Ken Thomases <ken@codeweavers.com>:
> > On Feb 26, 2016, at 5:29 PM, Miklós Máté <mtmkls@gmail.com> wrote:
> > 
> > > @@ -2320,6 +2322,7 @@ static BOOL X11DRV_wglDestroyPbufferARB( struct \
> > > wgl_pbuffer *object ) TRACE("(%p)\n", object);
> > > 
> > > pglXDestroyPbuffer(gdi_display, object->drawable);
> > > +    pglXDestroyContext(gdi_display, object->tmp_context);
> > I think you need to check if object->tmp_context is non-zero before calling \
> > glXDestroyContext() to avoid a GLXBadContext error.
Mesa handles ctx=0 by doing nothing. I guess the blob drivers do the same.

> > 
> > 
> > > +        if (!object->tmp_context) {
> > > +            object->tmp_context = pglXCreateNewContext(gdi_display, \
> > > object->fmt->fbconfig, object->fmt->render_type, prev_context, True); +         \
> > > object->prev_context = prev_context; +        } else if (object->prev_context \
> > > != prev_context) { +            pglXDestroyContext(gdi_display, \
> > > object->tmp_context); +            object->tmp_context = \
> > > pglXCreateNewContext(gdi_display, object->fmt->fbconfig, \
> > > object->fmt->render_type, prev_context, True); +            \
> > > object->prev_context = prev_context; +        }
> > Those two branches are mostly the same.  This could be reduced to:
> > 
> > if (!object->tmp_context || object->prev_context != prev_context) {
> > if (object->tmp_context)
> > pglXDestroyContext(gdi_display, object->tmp_context);
> > object->tmp_context = pglXCreateNewContext(gdi_display, object->fmt->fbconfig, \
> > object->fmt->render_type, prev_context, True); object->prev_context = \
> > prev_context; }
I don't think this improves readability, but whatever.

> > 
> > 
> > Is it necessary, when a context is destroyed, to go through all wgl_pbuffer \
> > structs looking for any whose prev_context matches the one being destroyed and \
> > clear it?  Otherwise, you risk having a stale reference that could be reused for \
> > a different context and not realize you need to recreate tmp_context.  Of course, \
> > enumerating all of them in a thread-safe manner is going to require a lot of \
> > added infrastructure and complexity.
> Good point, that's necessary in principle and it shouldn't be too hard
> to do by keeping a wgl_pbuffers list (similarly to context_list for
> wgl_context, you should probably reuse the same context_section
> critical section for synchronization).
> 
> The other points brought up by Ken are valid too of course.
If a context is destroyed, and a new context is created, what are the 
chances that the two pointers end up being the same?

MM


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic