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'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:<div><br></div><div><d=
iv>Traceback (most recent call last):</div><div><br></div><div>=C2=A0 File =
"C:\Program Files (x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plot=
ter\plotter_base.py", 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 "C:\Program Files (x86)\gnuradio\lib\site-packages\gnurad=
io\wxgui\plotter\plotter_base.py", 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", 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 "C:\Program=
Files (x86)\gnuradio\lib\site-packages\gnuradio\wxgui\plotter\grid_plotter=
_base.py", 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 "C:\Program Files (x86)\gnuradio\li=
b\site-packages\gnuradio\wxgui\plotter\gltext.py", line 340, in __init=
__</div><div><br></div><div>=C2=A0 =C2=A0 self._initText()</div><div><br></=
div><div>=C2=A0 File "C:\Program Files (x86)\gnuradio\lib\site-package=
s\gnuradio\wxgui\plotter\gltext.py", line 376, in _initText</div><div>=
<br></div><div>=C2=A0 =C2=A0 self._centered)</div><div><br></div><div>=C2=
=A0 File "C:\Program Files (x86)\gnuradio\lib\site-packages\gnuradio\w=
xgui\plotter\gltext.py", 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", 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 "C:\Python27\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\Ope=
nGL\latebind.py", 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 "C:\Python27\lib\site-packages\pyop=
engl-3.1.0a3-py2.7.egg\OpenGL\GL\exceptional.py", 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 "C:\Python27\lib\site-packages\=
pyopengl-3.1.0a3-py2.7.egg\OpenGL\latebind.py", 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 "C:\Python27\lib\site-package=
s\pyopengl-3.1.0a3-py2.7.egg\OpenGL\wrapper.py", 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 "C:\Python27\lib\site=
-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\wrapper.py", 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 "C:\Python2=
7\lib\site-packages\pyopengl-3.1.0a3-py2.7.egg\OpenGL\converters.py", =
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 "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 "C:\Python27\lib\site-packages\pyopengl-=
3.1.0a3-py2.7.egg\OpenGL\arrays\arraydatatype.py", line 52, in __call_=
_</div><div><br></div><div>=C2=A0 =C2=A0 typ, repr(value)[:50]</div><div><b=
r></div><div>TypeError: ("No array-type handler for type <class =
9;ctypes.c_ulong'> (value: c_ulong(0L)) registered", <OpenGL=
.converters.CallFuncPyConverter object at 0x041F6930>)</div></div><div><=
br></div><div><br></div><div>I'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"><<a href=3D"mailto:[email protected]=
om" target=3D"_blank">[email protected]</a>></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'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.
<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'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 <ulong> variable acts as a
single-element *ulong, so that *shouldn't* be the issue. However, i=
t
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.=C2=A0 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.<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'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&iu=
=3D/4140/ostg.clktrk" target=3D"_blank">http://pubads.g.doubleclick.net/gam=
pad/clk?id=3D157508191&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--