Re: Possible bug in PyOpenGL wrapper of glGenTextures?

Karl Koscher <[email protected]> Mon, 8 Sep 2014 15:31:31 -0700
Newsgroups gmane.comp.python.opengl.devel
Message-ID <CAM-SrY92+2ctK4EruHrP_3JuwgyW52MEkGsRK4kiBnBnnDchtQ@mail.gmail.com>
--001a11c36748a60c540502956228
Content-Type: multipart/alternative; boundary=001a11c36748a60c510502956226

--001a11c36748a60c510502956226
Content-Type: text/plain; charset=UTF-8

Thanks for the quick response. Attached is a simple Python script which
will reproduce the bug without any special hardware. I'm running gnuradio
3.7.2.2 and PyOpenGL 3.1.0a3 for Python 2.7. AFAIK this is only a problem
on Windows. Here's the traceback:

Traceback (most recent call last):

  File "C:\Program Files
(x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\plotter_base.py",
line 209, in _on_paint

    for fcn in self._draw_fcns: fcn[1]()

  File "C:\Program Files
(x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\plotter_base.py",
line 61, in draw

    self._draw()

  File "C:\Program Files
(x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\grid_plotter_base.py",
line 239, in _draw_grid

    for tick in self._get_ticks(self.x_min, self.x_max, self.x_step,
self.x_scalar)]

  File "C:\Program Files
(x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\grid_plotter_base.py",
line 341, in _get_tick_label

    return gltext.Text(tick_str, font_size=TICK_TEXT_FONT_SIZE)

  File "C:\Program Files
(x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\gltext.py", line
340, in __init__

    self._initText()

  File "C:\Program Files
(x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\gltext.py", line
376, in _initText

    self._centered)

  File "C:\Program Files
(x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\gltext.py", line
73, in __init__

    self.createTexture()

  File "C:\Program Files
(x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\gltext.py", line
229, in createTexture

    self._texture = glGenTextures(1)

  File
"C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\latebind.py",
line 61, in __call__

    return self.wrapperFunction( self.baseFunction, *args, **named )

  File
"C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\GL\exceptional.py",
line 189, in glGenTextures

    baseFunction( count, textures)

  File
"C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\latebind.py",
line 45, in __call__

    return self._finalCall( *args, **named )

  File
"C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\wrapper.py",
line 571, in wrapperCall

    pyArgs = tuple( calculate_pyArgs( args ))

  File
"C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\wrapper.py",
line 356, in calculate_pyArgs

    yield converter(args[index], self, args)

  File
"C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\converters.py",
line 134, in __call__

    return self.function( incoming )

  File
"C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\arrays\arraydatatype.py",
line 141, in asArray

    return cls.getHandler(value).asArray( value, typeCode or
cls.typeConstant )

  File
"C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\arrays\arraydatatype.py",
line 52, in __call__

    typ, repr(value)[:50]

TypeError: ("No array-type handler for type <class 'ctypes.c_ulong'>
(value: c_ulong(0L)) registered", <OpenGL.converters.CallFuncPyConverter
object at 0x041F6930>)


I've also attached a patch which seems to fix the problem.



On Mon, Sep 8, 2014 at 6:34 AM, Mike C. Fletcher <[email protected]>
wrote:

>  On 09/08/2014 03:48 AM, Karl Koscher wrote:
>
> I'm running GNU Radio on Windows and was trying to figure out why the WX
> FFT display wasn't working. It looks like glGenTextures(1) is the culprit.
> An argument of 1 is special-cased for backwards-compatibility, but this
> seems to break. Commenting this special case out fixes the FFT display.
>
>  I think the problem is that a single ulong is passed in to the
> underlying function, but it always expects an array of ulongs. I think an
> array should still be passed in, with the first element of the array
> returned in the special case (instead of the array itself).
>
>  Of course, this is all voodoo magic to me, so perhaps there's a good
> reason for the code the way it is. It would be nice for it to work on
> Windows without hacking the code, though.
>
>
> In ctypes, passing in a <ulong> variable acts as a single-element *ulong,
> so that *shouldn't* be the issue. However, it is always possible that we've
> got a bug in the handling. Thing is, I can't see anything wrong with the
> gnuradio code, and without a traceback or other error to tell me *what*
> went wrong, I can't investigate further.  I'm assuming that gnuradio would
> require a piece of hardware to run, which suggests I wouldn't be able to
> reproduce the error easily here.
>
> What would help is:
>
>    - report your (gnuradio and) PyOpenGL version
>    - include a traceback
>    - include the patch for what you changed to make it work
>
> It *looks* like the wrapper is actually entirely unneeded these days (it
> basically duplicates the code in the automated wrapping), but without
> knowing *how* the code is failing I can't actually be sure eliminating the
> wrapper entirely would fix your problem.  From what I can see gnuradio is
> only ever calling glGenTextures(1) in a very standard/simple way.
>
> Take care,
> Mike
>
> --
> ________________________________________________
>   Mike C. Fletcher
>   Designer, VR Plumber, Coder
>   http://www.vrplumber.com
>   http://blog.vrplumber.com
>
>
>
> ------------------------------------------------------------------------------
> Want excitement?
> Manually upgrade your production database.
> When you want reliability, choose Perforce
> Perforce version control. Predictably reliable.
>
> http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk
> _______________________________________________
> PyOpenGL Homepage
> http://pyopengl.sourceforge.net
> _______________________________________________
> PyOpenGL-Devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/pyopengl-devel
>
>

--001a11c36748a60c510502956226
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Thanks for the quick response. Attached is a simple Python=
 script which will reproduce the bug without any special hardware. I&#39;m =
running gnuradio 3.7.2.2 and PyOpenGL 3.1.0a3 for Python 2.7. AFAIK this is=
 only a problem on Windows. Here&#39;s the traceback:<div><br></div><div><d=
iv>Traceback (most recent call last):</div><div><br></div><div>=C2=A0 File =
&quot;C:\Program Files (x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plot=
ter\plotter_base.py&quot;, line 209, in _on_paint</div><div><br></div><div>=
=C2=A0 =C2=A0 for fcn in self._draw_fcns: fcn[1]()</div><div><br></div><div=
>=C2=A0 File &quot;C:\Program Files (x86)\gnuradio\lib\site-packages\gnurad=
io\wxgui\plotter\plotter_base.py&quot;, line 61, in draw</div><div><br></di=
v><div>=C2=A0 =C2=A0 self._draw()</div><div><br></div><div>=C2=A0 File &quo=
t;C:\Program Files (x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\=
grid_plotter_base.py&quot;, line 239, in _draw_grid</div><div><br></div><di=
v>=C2=A0 =C2=A0 for tick in self._get_ticks(self.x_min, self.x_max, self.x_=
step, self.x_scalar)]</div><div><br></div><div>=C2=A0 File &quot;C:\Program=
 Files (x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\grid_plotter=
_base.py&quot;, line 341, in _get_tick_label</div><div><br></div><div>=C2=
=A0 =C2=A0 return gltext.Text(tick_str, font_size=3DTICK_TEXT_FONT_SIZE)</d=
iv><div><br></div><div>=C2=A0 File &quot;C:\Program Files (x86)\gnuradio\li=
b\site-packages\gnuradio\wxgui\plotter\gltext.py&quot;, line 340, in __init=
__</div><div><br></div><div>=C2=A0 =C2=A0 self._initText()</div><div><br></=
div><div>=C2=A0 File &quot;C:\Program Files (x86)\gnuradio\lib\site-package=
s\gnuradio\wxgui\plotter\gltext.py&quot;, line 376, in _initText</div><div>=
<br></div><div>=C2=A0 =C2=A0 self._centered)</div><div><br></div><div>=C2=
=A0 File &quot;C:\Program Files (x86)\gnuradio\lib\site-packages\gnuradio\w=
xgui\plotter\gltext.py&quot;, line 73, in __init__</div><div><br></div><div=
>=C2=A0 =C2=A0 self.createTexture()</div><div><br></div><div>=C2=A0 File &q=
uot;C:\Program Files (x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotte=
r\gltext.py&quot;, line 229, in createTexture</div><div><br></div><div>=C2=
=A0 =C2=A0 self._texture =3D glGenTextures(1)</div><div><br></div><div>=C2=
=A0 File &quot;C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\Ope=
nGL\latebind.py&quot;, line 61, in __call__</div><div><br></div><div>=C2=A0=
 =C2=A0 return self.wrapperFunction( self.baseFunction, *args, **named )</d=
iv><div><br></div><div>=C2=A0 File &quot;C:\Python27\lib\site-packages\pyop=
engl-3.1.0a3-py2.7.egg\OpenGL\GL\exceptional.py&quot;, line 189, in glGenTe=
xtures</div><div><br></div><div>=C2=A0 =C2=A0 baseFunction( count, textures=
)</div><div><br></div><div>=C2=A0 File &quot;C:\Python27\lib\site-packages\=
pyopengl-3.1.0a3-py2.7.egg\OpenGL\latebind.py&quot;, line 45, in __call__</=
div><div><br></div><div>=C2=A0 =C2=A0 return self._finalCall( *args, **name=
d )</div><div><br></div><div>=C2=A0 File &quot;C:\Python27\lib\site-package=
s\pyopengl-3.1.0a3-py2.7.egg\OpenGL\wrapper.py&quot;, line 571, in wrapperC=
all</div><div><br></div><div>=C2=A0 =C2=A0 pyArgs =3D tuple( calculate_pyAr=
gs( args ))</div><div><br></div><div>=C2=A0 File &quot;C:\Python27\lib\site=
-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\wrapper.py&quot;, line 356, in =
calculate_pyArgs</div><div><br></div><div>=C2=A0 =C2=A0 yield converter(arg=
s[index], self, args)</div><div><br></div><div>=C2=A0 File &quot;C:\Python2=
7\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\converters.py&quot;, =
line 134, in __call__</div><div><br></div><div>=C2=A0 =C2=A0 return self.fu=
nction( incoming )</div><div><br></div><div>=C2=A0 File &quot;C:\Python27\l=
ib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\arrays\arraydatatype.py&=
quot;, line 141, in asArray</div><div><br></div><div>=C2=A0 =C2=A0 return c=
ls.getHandler(value).asArray( value, typeCode or cls.typeConstant )</div><d=
iv><br></div><div>=C2=A0 File &quot;C:\Python27\lib\site-packages\pyopengl-=
3.1.0a3-py2.7.egg\OpenGL\arrays\arraydatatype.py&quot;, line 52, in __call_=
_</div><div><br></div><div>=C2=A0 =C2=A0 typ, repr(value)[:50]</div><div><b=
r></div><div>TypeError: (&quot;No array-type handler for type &lt;class &#3=
9;ctypes.c_ulong&#39;&gt; (value: c_ulong(0L)) registered&quot;, &lt;OpenGL=
.converters.CallFuncPyConverter object at 0x041F6930&gt;)</div></div><div><=
br></div><div><br></div><div>I&#39;ve also attached a patch which seems to =
fix the problem.</div><div><br></div><div><br></div></div><div class=3D"gma=
il_extra"><br><div class=3D"gmail_quote">On Mon, Sep 8, 2014 at 6:34 AM, Mi=
ke C. Fletcher <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]=
om" target=3D"_blank">[email protected]</a>&gt;</span> wrote:<br><bloc=
kquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #cc=
c solid;padding-left:1ex">
 =20
   =20
 =20
  <div text=3D"#000000" bgcolor=3D"#FFFFFF"><div><div class=3D"h5">
    <div>On 09/08/2014 03:48 AM, Karl Koscher
      wrote:<br>
    </div>
    <blockquote type=3D"cite">
      <div dir=3D"ltr">I&#39;m running GNU Radio on Windows and was trying =
to
        figure out why the WX FFT display wasn&#39;t working. It looks like
        glGenTextures(1) is the culprit. An argument of 1 is
        special-cased for backwards-compatibility, but this seems to
        break. Commenting this special case out fixes the FFT display.
        <div><br>
        </div>
        <div>I think the problem is that a single ulong is passed in to
          the underlying function, but it always expects an array of
          ulongs. I think an array should still be passed in, with the
          first element of the array returned in the special case
          (instead of the array itself).=C2=A0</div>
        <div><br>
        </div>
        <div>Of course, this is all voodoo magic to me, so perhaps
          there&#39;s a good reason for the code the way it is. It would be
          nice for it to work on Windows without hacking the code,
          though.<br>
        </div>
      </div>
    </blockquote>
    <br></div></div>
    In ctypes, passing in a &lt;ulong&gt; variable acts as a
    single-element *ulong, so that *shouldn&#39;t* be the issue. However, i=
t
    is always possible that we&#39;ve got a bug in the handling. Thing is, =
I
    can&#39;t see anything wrong with the gnuradio code, and without a
    traceback or other error to tell me *what* went wrong, I can&#39;t
    investigate further.=C2=A0 I&#39;m assuming that gnuradio would require=
 a
    piece of hardware to run, which suggests I wouldn&#39;t be able to
    reproduce the error easily here.<br>
    <br>
    What would help is:<br>
    <ul>
      <li>report your (gnuradio and) PyOpenGL version</li>
      <li>include a traceback</li>
      <li>include the patch for what you changed to make it work<br>
      </li>
    </ul>
    It *looks* like the wrapper is actually entirely unneeded these days
    (it basically duplicates the code in the automated wrapping), but
    without knowing *how* the code is failing I can&#39;t actually be sure
    eliminating the wrapper entirely would fix your problem.=C2=A0 From wha=
t
    I can see gnuradio is only ever calling glGenTextures(1) in a very
    standard/simple way.<br>
    <br>
    Take care,<br>
    Mike<span class=3D"HOEnZb"><font color=3D"#888888"><br>
    <br>
    <pre cols=3D"72">--=20
________________________________________________
  Mike C. Fletcher
  Designer, VR Plumber, Coder
  <a href=3D"http://www.vrplumber.com" target=3D"_blank">http://www.vrplumb=
er.com</a>
  <a href=3D"http://blog.vrplumber.com" target=3D"_blank">http://blog.vrplu=
mber.com</a>
</pre>
  </font></span></div>

<br>-----------------------------------------------------------------------=
-------<br>
Want excitement?<br>
Manually upgrade your production database.<br>
When you want reliability, choose Perforce<br>
Perforce version control. Predictably reliable.<br>
<a href=3D"http://pubads.g.doubleclick.net/gampad/clk?id=3D157508191&amp;iu=
=3D/4140/ostg.clktrk" target=3D"_blank">http://pubads.g.doubleclick.net/gam=
pad/clk?id=3D157508191&amp;iu=3D/4140/ostg.clktrk</a><br>__________________=
_____________________________<br>
PyOpenGL Homepage<br>
<a href=3D"http://pyopengl.sourceforge.net" target=3D"_blank">http://pyopen=
gl.sourceforge.net</a><br>
_______________________________________________<br>
PyOpenGL-Devel mailing list<br>
<a href=3D"mailto:[email protected]">PyOpenGL-Devel@list=
s.sourceforge.net</a><br>
<a href=3D"https://lists.sourceforge.net/lists/listinfo/pyopengl-devel" tar=
get=3D"_blank">https://lists.sourceforge.net/lists/listinfo/pyopengl-devel<=
/a><br>
<br></blockquote></div><br></div>

--001a11c36748a60c510502956226--
--001a11c36748a60c540502956228
Content-Type: text/plain; charset=US-ASCII; name="opengl-patch.diff"
Content-Disposition: attachment; filename="opengl-patch.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hzuduunx0

LS0tIE9wZW5HTC9HTC9leGNlcHRpb25hbC5weQlNb24gU2VwICA4IDE1OjI2OjIxIDIwMTQKKysr
IE9wZW5HTC9HTC9leGNlcHRpb25hbC1uZXcucHkJTW9uIFNlcCAgOCAxNToyNDoyNCAyMDE0CkBA
IC0xODIsMTIgKzE4MiwxMiBAQAogICAgICIiIgogICAgIGlmIGNvdW50IDw9IDA6CiAgICAgICAg
IHJhaXNlIFZhbHVlRXJyb3IoICIiIkNhbid0IGdlbmVyYXRlIDAgb3IgZmV3ZXIgdGV4dHVyZXMi
IiIgKQotICAgIGVsaWYgY291bnQgPT0gMSBhbmQgX2NvbmZpZ2ZsYWdzLlNJWkVfMV9BUlJBWV9V
TlBBQ0s6Ci0gICAgICAgICMgdGhpcyB0cmFkaXRpb25hbGx5IHJldHVybmVkIGEgc2luZ2xlIGlu
dC9sb25nLCBzbyB3ZSdsbCBjb250aW51ZSB0bwotICAgICAgICAjIGRvIHNvLCBldmVuIHRob3Vn
aCBpdCB3b3VsZCBiZSBlYXNpZXIgbm90IHRvIGJvdGhlci4KLSAgICAgICAgdGV4dHVyZXMgPSBj
b25zdGFudHMuR0x1aW50KCAwICkKLSAgICAgICAgYmFzZUZ1bmN0aW9uKCBjb3VudCwgdGV4dHVy
ZXMpCi0gICAgICAgIHJldHVybiB0ZXh0dXJlcy52YWx1ZQorICAgICNlbGlmIGNvdW50ID09IDEg
YW5kIF9jb25maWdmbGFncy5TSVpFXzFfQVJSQVlfVU5QQUNLOgorICAgICMgICAgIyB0aGlzIHRy
YWRpdGlvbmFsbHkgcmV0dXJuZWQgYSBzaW5nbGUgaW50L2xvbmcsIHNvIHdlJ2xsIGNvbnRpbnVl
IHRvCisgICAgIyAgICAjIGRvIHNvLCBldmVuIHRob3VnaCBpdCB3b3VsZCBiZSBlYXNpZXIgbm90
IHRvIGJvdGhlci4KKyAgICAjICAgIHRleHR1cmVzID0gY29uc3RhbnRzLkdMdWludCggMCApCisg
ICAgIyAgIGJhc2VGdW5jdGlvbiggY291bnQsIHRleHR1cmVzKQorICAgICMgICByZXR1cm4gdGV4
dHVyZXMudmFsdWUKICAgICBlbHNlOgogICAgICAgICB0ZXh0dXJlcyA9IGFycmF5cy5HTHVpbnRB
cnJheS56ZXJvcyggKGNvdW50LCkpCiAgICAgICAgIGJhc2VGdW5jdGlvbiggY291bnQsIHRleHR1
cmVzKQo=
--001a11c36748a60c540502956228
Content-Type: text/plain; charset=US-ASCII; name="fft_gui_test.py"
Content-Disposition: attachment; filename="fft_gui_test.py"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hzudvyzp1

IyEvdXNyL2Jpbi9lbnYgcHl0aG9uDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIw0KIyBHbnVyYWRpbyBQeXRob24gRmxvdyBHcmFwaA0KIyBUaXRsZTog
RmZ0IEd1aSBUZXN0DQojIEdlbmVyYXRlZDogTW9uIFNlcCAwOCAxNToyNjoyNSAyMDE0DQojIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpmcm9tIGdu
dXJhZGlvIGltcG9ydCBhbmFsb2cNCmZyb20gZ251cmFkaW8gaW1wb3J0IGVuZ19ub3RhdGlvbg0K
ZnJvbSBnbnVyYWRpbyBpbXBvcnQgZ3INCmZyb20gZ251cmFkaW8gaW1wb3J0IHd4Z3VpDQpmcm9t
IGdudXJhZGlvLmVuZ19vcHRpb24gaW1wb3J0IGVuZ19vcHRpb24NCmZyb20gZ251cmFkaW8uZmZ0
IGltcG9ydCB3aW5kb3cNCmZyb20gZ251cmFkaW8uZmlsdGVyIGltcG9ydCBmaXJkZXMNCmZyb20g
Z251cmFkaW8ud3hndWkgaW1wb3J0IGZmdHNpbmsyDQpmcm9tIGdyY19nbnVyYWRpbyBpbXBvcnQg
d3hndWkgYXMgZ3JjX3d4Z3VpDQpmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXINCmlt
cG9ydCB3eA0KDQpjbGFzcyBmZnRfZ3VpX3Rlc3QoZ3JjX3d4Z3VpLnRvcF9ibG9ja19ndWkpOg0K
DQogICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KICAgICAgICBncmNfd3hndWkudG9wX2Jsb2NrX2d1
aS5fX2luaXRfXyhzZWxmLCB0aXRsZT0iRmZ0IEd1aSBUZXN0IikNCg0KICAgICAgICAjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAgICAgICAjIFZh
cmlhYmxlcw0KICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIw0KICAgICAgICBzZWxmLnNhbXBfcmF0ZSA9IHNhbXBfcmF0ZSA9IDQ0MTAwDQoN
CiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMNCiAgICAgICAgIyBCbG9ja3MNCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgICAgICAgc2VsZi53eGd1aV9mZnRzaW5rMl8wID0g
ZmZ0c2luazIuZmZ0X3NpbmtfYygNCiAgICAgICAgCXNlbGYuR2V0V2luKCksDQogICAgICAgIAli
YXNlYmFuZF9mcmVxPTAsDQogICAgICAgIAl5X3Blcl9kaXY9MTAsDQogICAgICAgIAl5X2RpdnM9
MTAsDQogICAgICAgIAlyZWZfbGV2ZWw9MCwNCiAgICAgICAgCXJlZl9zY2FsZT0yLjAsDQogICAg
ICAgIAlzYW1wbGVfcmF0ZT1zYW1wX3JhdGUsDQogICAgICAgIAlmZnRfc2l6ZT0xMDI0LA0KICAg
ICAgICAJZmZ0X3JhdGU9MTUsDQogICAgICAgIAlhdmVyYWdlPUZhbHNlLA0KICAgICAgICAJYXZn
X2FscGhhPU5vbmUsDQogICAgICAgIAl0aXRsZT0iRkZUIFBsb3QiLA0KICAgICAgICAJcGVha19o
b2xkPUZhbHNlLA0KICAgICAgICApDQogICAgICAgIHNlbGYuQWRkKHNlbGYud3hndWlfZmZ0c2lu
azJfMC53aW4pDQogICAgICAgIHNlbGYuYW5hbG9nX3NpZ19zb3VyY2VfeF8wID0gYW5hbG9nLnNp
Z19zb3VyY2VfYyhzYW1wX3JhdGUsIGFuYWxvZy5HUl9DT1NfV0FWRSwgMTAwMCwgMSwgMCkNCg0K
ICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
Iw0KICAgICAgICAjIENvbm5lY3Rpb25zDQogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICAgICAgIHNlbGYuY29ubmVjdCgoc2VsZi5h
bmFsb2dfc2lnX3NvdXJjZV94XzAsIDApLCAoc2VsZi53eGd1aV9mZnRzaW5rMl8wLCAwKSkNCg0K
DQojIFFUIHNpbmsgY2xvc2UgbWV0aG9kIHJlaW1wbGVtZW50YXRpb24NCg0KICAgIGRlZiBnZXRf
c2FtcF9yYXRlKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5zYW1wX3JhdGUNCg0KICAgIGRl
ZiBzZXRfc2FtcF9yYXRlKHNlbGYsIHNhbXBfcmF0ZSk6DQogICAgICAgIHNlbGYuc2FtcF9yYXRl
ID0gc2FtcF9yYXRlDQogICAgICAgIHNlbGYuYW5hbG9nX3NpZ19zb3VyY2VfeF8wLnNldF9zYW1w
bGluZ19mcmVxKHNlbGYuc2FtcF9yYXRlKQ0KICAgICAgICBzZWxmLnd4Z3VpX2ZmdHNpbmsyXzAu
c2V0X3NhbXBsZV9yYXRlKHNlbGYuc2FtcF9yYXRlKQ0KDQppZiBfX25hbWVfXyA9PSAnX19tYWlu
X18nOg0KICAgIGltcG9ydCBjdHlwZXMNCiAgICBpbXBvcnQgc3lzDQogICAgaWYgc3lzLnBsYXRm
b3JtLnN0YXJ0c3dpdGgoJ2xpbnV4Jyk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHgxMSA9
IGN0eXBlcy5jZGxsLkxvYWRMaWJyYXJ5KCdsaWJYMTEuc28nKQ0KICAgICAgICAgICAgeDExLlhJ
bml0VGhyZWFkcygpDQogICAgICAgIGV4Y2VwdDoNCiAgICAgICAgICAgIHByaW50ICJXYXJuaW5n
OiBmYWlsZWQgdG8gWEluaXRUaHJlYWRzKCkiDQogICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKG9w
dGlvbl9jbGFzcz1lbmdfb3B0aW9uLCB1c2FnZT0iJXByb2c6IFtvcHRpb25zXSIpDQogICAgKG9w
dGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQ0KICAgIHRiID0gZmZ0X2d1aV90ZXN0
KCkNCiAgICB0Yi5TdGFydChUcnVlKQ0KICAgIHRiLldhaXQoKQ0KDQo=
--001a11c36748a60c540502956228
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

------------------------------------------------------------------------------
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk
--001a11c36748a60c540502956228
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
PyOpenGL Homepage
http://pyopengl.sourceforge.net
_______________________________________________
PyOpenGL-Devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pyopengl-devel

--001a11c36748a60c540502956228--