[Mesa-dev] [PATCH 1/4] glx: Call __glXInitVertexArrayState() with a usable gc.

Matt Turner mattst88 at gmail.com
Thu Jul 7 23:49:02 UTC 2016


On Thu, Jul 7, 2016 at 2:34 PM, Ian Romanick <idr at freedesktop.org> wrote:
> On 07/07/2016 09:44 AM, Matt Turner wrote:
>> On Wed, Jun 29, 2016 at 2:16 PM, Ian Romanick <idr at freedesktop.org> wrote:
>>> On 06/29/2016 02:04 AM, Colin McDonald wrote:
>>>> I'm not familiar with the code, other than diving in to fix these
>>>> indirect multi-texture problems, so you will know much more about it
>>>> than me.
>>>>
>>>> But, my understanding is that __glXInitVertexArrayState needs info
>>>> from the server, obtained by calls to _indirect_glGetString &
>>>> __indirect_glGetIntegerv. Those routines need the current context
>>>> from __glXGetCurrentContext, so __glXSetCurrentContext(gc) must have
>>>> been called first.
>>>>
>>>> I see your point about a "layering violation".  I think that to avoid
>>>> that would require a more substantial restructuring, so that the
>>>> indirect layer can run some initialisation code (ie
>>>> __glXInitVertexArrayState or similar) separate from the bind
>>>> callback, once a usable context has been setup.
>>>
>>> Maybe...  *If* __glXGetCurrentContext is the only problem, then I think
>>> a small refactor of __indirect_glGetString could also solve the problem.
>>>  Just make a new function
>>>
>>> const GLubyte *do_GetString(Display *dpy, struct glx_context *gc,
>>>                             GLenum name);
>>>
>>> that both __indirect_glGetString and indirect_bind_context call.  It
>>> might even be worth folding the contents of __glXGetString into the new
>>> function... though that's probably a follow-up patch.
>>
>> I tried that (see attached p.patch)... and I get another segfault.
>
> I think it should be possible to elide the __glXFlushRenderBuffer call.
> Since the context is being made current, its buffer of rendering
> commands must be empty.  Does the attached patch help?

Thanks. That gets us past that problem... and on to the next!

Fun, fun. __glXInitVertexArrayState(gc) contains

   if (__glExtensionBitIsEnabled(gc, GL_ARB_vertex_program_bit)) {
      __indirect_glGetProgramivARB(GL_VERTEX_PROGRAM_ARB,
                                   GL_MAX_PROGRAM_ATTRIBS_ARB,
                                   &vertex_program_attribs);
   }

Notice __glExtensionBitIsEnabled takes an explicit gc, passed into
__glXInitVertexArrayState. __indirect_glGetProgramivARB on the other
hand calls __glXGetCurrentContext and gets the dummyContext. I've
plumbed gc into a do_GetProgramivARB, and I see a similar call to
__indirect_glGetIntegerv that has the same problem. That looks like
the only other one at least.

__indirect_glGetProgramivARB is code-gen'd, so I just want to add
'handcode="client"' to GetProgramivARB's XML in gl_API.xml. That in
turn necessitates adding a dpy parameter to
__glXInitVertexArrayState().

Ultimately, we segfault in __glXSetupVendorRequest() because it tries
to get dpy from gc->currentDpy.

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7667eb9 in __glXSetupVendorRequest (gc=0x662080, code=17,
vop=1307, cmdlen=8) at indirect.c:191
191    LockDisplay(dpy);
(gdb) p dpy
$40 = (Display * const) 0x0
(gdb) bt
#0  0x00007ffff7667eb9 in __glXSetupVendorRequest (gc=0x662080,
code=17, vop=1307, cmdlen=8) at indirect.c:191
#1  0x00007ffff769aacb in do_GetProgramivARB (dpy=0x64fc60,
gc=0x662080, target=34336, pname=34989, params=0x7fffffffdab4) at
../../../mesa/src/glx/single2.c:537
#2  0x00007ffff7691944 in __glXInitVertexArrayState (dpy=0x64fc60,
gc=0x662080) at ../../../mesa/src/glx/indirect_vertex_array.c:198
#3  0x00007ffff7688c97 in indirect_bind_context (gc=0x662080,
old=0x7ffff78cf6c0 <dummyContext>, draw=27262978, read=27262978) at
../../../mesa/src/glx/indirect_glx.c:160
#4  0x00007ffff766278a in MakeContextCurrent (dpy=0x64fc60,
draw=27262978, read=27262978, gc_user=0x662080) at
../../../mesa/src/glx/glxcurrent.c:228
#5  0x00007ffff70c1af0 in fgPlatformOpenWindow () from /usr/lib64/libglut.so.3
#6  0x00007ffff70bbb06 in fgOpenWindow () from /usr/lib64/libglut.so.3
#7  0x00007ffff70ba42b in fgCreateWindow () from /usr/lib64/libglut.so.3
#8  0x00007ffff70bbc00 in glutCreateWindow () from /usr/lib64/libglut.so.3
#9  0x00000000004022c8 in main (argc=1, argv=0x7fffffffe0f8) at arbvparray.c:294

I'm not sure this is tractable.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: p.patch
Type: text/x-patch
Size: 7242 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160707/eb02b709/attachment.bin>


More information about the mesa-dev mailing list