<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Dec 16, 2014 at 4:01 AM, Iago Toral <span dir="ltr"><<a href="mailto:itoral@igalia.com" target="_blank">itoral@igalia.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, 2014-12-16 at 08:29 +0100, Iago Toral wrote:<br>
> On Mon, 2014-12-15 at 10:19 -0800, Jason Ekstrand wrote:<br>
> ><br>
> ><br>
> > On Mon, Dec 15, 2014 at 3:12 AM, Iago Toral <<a href="mailto:itoral@igalia.com">itoral@igalia.com</a>> wrote:<br>
> >  Â  Â  Â  Â On Fri, 2014-12-12 at 11:36 -0800, Jason Ekstrand wrote:<br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â > On Tue, Dec 9, 2014 at 4:07 AM, Iago Toral Quiroga<br>
> >  Â  Â  Â  Â <<a href="mailto:itoral@igalia.com">itoral@igalia.com</a>><br>
> >  Â  Â  Â  Â > wrote:<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â For glReadPixels with a Luminance destination format<br>
> >  Â  Â  Â  Â we<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â compute luminance<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â values from RGBA as L=R+G+B. This, however, requires<br>
> >  Â  Â  Â  Â ad-hoc<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â implementation,<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â since pack/unpack functions or<br>
> >  Â  Â  Â  Â _mesa_swizzle_and_convert won't<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â do this<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â (and thus, neither will _mesa_format_convert). This<br>
> >  Â  Â  Â  Â patch adds<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â helpers<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â to do this computation so they can be used to<br>
> >  Â  Â  Â  Â support<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â conversion to luminance<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â formats.<br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â The current implementation of glReadPixels does this<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â computation as part<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â of the span functions in pack.c (see<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â _mesa_pack_rgba_span_float), that do<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â this together with other things like type<br>
> >  Â  Â  Â  Â conversion, etc. We<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â do not want<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â to use these functions but use _mesa_format_convert<br>
> >  Â  Â  Â  Â instead<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â (later patches<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â will remove the color span functions), so we need to<br>
> >  Â  Â  Â  Â extract<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â this functionality<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â as helpers.<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â ---<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â  src/mesa/main/pack.c | 63<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â ++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â  src/mesa/main/pack.h |  9 ++++++++<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â  2 files changed, 72 insertions(+)<br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â diff --git a/src/mesa/main/pack.c<br>
> >  Â  Â  Â  Â b/src/mesa/main/pack.c<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â index de6ab27..fa4046c 100644<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â --- a/src/mesa/main/pack.c<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +++ b/src/mesa/main/pack.c<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â @@ -4334,4 +4334,67 @@ _mesa_rebase_rgba_uint(GLuint<br>
> >  Â  Â  Â  Â n, GLuint<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[][4], GLenum baseFormat)<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â  Â  Â }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â  }<br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +void<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +_mesa_pack_luminance_from_rgba_float(GLuint n,<br>
> >  Â  Â  Â  Â GLfloat<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[][4],<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â GLvoid<br>
> >  Â  Â  Â  Â *dstAddr, GLenum<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â dst_format,<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â GLbitfield<br>
> >  Â  Â  Â  Â transferOps)<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +{<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â int i;<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â GLfloat *dst = (GLfloat *) dstAddr;<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â switch (dst_format) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â case GL_LUMINANCE:<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  if (transferOps & IMAGE_CLAMP_BIT) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â for (i = 0; i < n; i++) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  GLfloat sum = rgba[i][RCOMP] +<br>
> >  Â  Â  Â  Â rgba[i][GCOMP] +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[i][BCOMP];<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  dst[i] = CLAMP(sum, 0.0F, 1.0F);<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  } else {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â for (i = 0; i < n; i++) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  dst[i] = rgba[i][RCOMP] +<br>
> >  Â  Â  Â  Â rgba[i][GCOMP] +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[i][BCOMP];<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  return;<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â case GL_LUMINANCE_ALPHA:<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  if (transferOps & IMAGE_CLAMP_BIT) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â for (i = 0; i < n; i++) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  GLfloat sum = rgba[i][RCOMP] +<br>
> >  Â  Â  Â  Â rgba[i][GCOMP] +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[i][BCOMP];<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  dst[2*i] = CLAMP(sum, 0.0F, 1.0F);<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  dst[2*i+1] = rgba[i][ACOMP];<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  } else {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â for (i = 0; i < n; i++) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  dst[2*i] = rgba[i][RCOMP] +<br>
> >  Â  Â  Â  Â rgba[i][GCOMP] +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[i][BCOMP];<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  dst[2*i+1] = rgba[i][ACOMP];<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  return;<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â default:<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  assert(!"Unsupported format");<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +}<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +void<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +_mesa_pack_luminance_from_rgba_integer(GLuint n,<br>
> >  Â  Â  Â  Â GLuint<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[][4],<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â GLvoid<br>
> >  Â  Â  Â  Â *dstAddr,<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â GLenum dst_format)<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +{<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â int i;<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â GLuint *dst = (GLuint *) dstAddr;<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â switch (dst_format) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â case GL_LUMINANCE:<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  for (i = 0; i < n; i++) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â dst[i] = rgba[i][RCOMP] + rgba[i][GCOMP] +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[i][BCOMP];<br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â > I know this is getting old, but don't we need to do some<br>
> >  Â  Â  Â  Â clamping<br>
> >  Â  Â  Â  Â > here?  If we do, then we have to handle signed vs. unsigned<br>
> >  Â  Â  Â  Â > seperately.  Yeah, that's annoying.<br>
> ><br>
> ><br>
> >  Â  Â  Â  Â You are right, reviewing the original code it looks like it<br>
> >  Â  Â  Â  Â ends up<br>
> >  Â  Â  Â  Â clamping the result of the triple addition to the type of the<br>
> >  Â  Â  Â  Â dst when<br>
> >  Â  Â  Â  Â the type of the dst has a different size.<br>
> ><br>
> >  Â  Â  Â  Â In our case, we call this function from the implementation of<br>
> >  Â  Â  Â  Â glreadpixels when an integer dst luminance format is involved.<br>
> >  Â  Â  Â  Â In that<br>
> >  Â  Â  Â  Â case we convert to RGBA_INT RGBA_UINT first depending on the<br>
> >  Â  Â  Â  Â type of the<br>
> >  Â  Â  Â  Â luminance format and then we call this function, so I think we<br>
> >  Â  Â  Â  Â only need<br>
> >  Â  Â  Â  Â to handle clamping when we pack from RGBA_INT to short and<br>
> >  Â  Â  Â  Â when we pack<br>
> >  Â  Â  Â  Â from RGBA_UINT to unsigned short (meaning that we do not need<br>
> >  Â  Â  Â  Â to handle<br>
> >  Â  Â  Â  Â scenarios where we convert from int to ushort for example).<br>
> >  Â  Â  Â  Â I'll fix<br>
> >  Â  Â  Â  Â this.<br>
> ><br>
> ><br>
> > Yeah, RGBA_[U]INT in is the only case that matters there.  What were<br>
> > you thinking here?  Personally, I'd probably just make this function<br>
> > clamp and then not special case it.  That said, I'm up for other<br>
> > solutions too.<br>
><br>
> My plan was:<br>
><br>
> 1) Add a "GLenum type" parameter so we can detect if we are in the int<br>
> case (GL_BYTE, GL_SHORT, etc) or the uint case (GL_UNSIGNED_BYTE,<br>
> GL_UNSIGNED_SHORT, etc).<br>
><br>
> 2) If we are clamping uints we use _mesa_unsigned_to_unsigned to clamp.<br>
> If we are clamping ints, we use _mesa_signed_to_signed. This is because<br>
> glReadPixels converts from the render buffer format to RGBA UINT when<br>
> the dst type is uint and to RGBA INT otherwise before calling this<br>
> function.<br>
><br>
> It would look something like this (pseudocode):<br>
><br>
> void<br>
> _mesa_pack_luminance_from_rgba_integer(GLuint n, GLuint rgba[][4],<br>
>  Â  GLvoid *dstAddr, GLenum dst_format, GLenum dst_type)<br>
> {<br>
>  Â  // Compute L = R + G + B as we do now, without clamping<br>
><br>
>  Â  // Handle clamping if necessary (only if the dst_type has<br>
>  Â  // a different size<br>
>  Â  int bits = bits = _mesa_sizeof_type(dst_type) * 8;<br>
>  Â  if (bits < 32) {<br>
>  Â  Â  Â int components = _mesa_components_in_format(dst_format);<br>
>  Â  Â  Â int is_signed = !_mesa_is_type_unsigned(dst_type);<br>
>  Â  Â  Â if (is_signed)<br>
>  Â  Â  Â  Â  for (i = 0; i < n; i++) {<br>
>  Â  Â  Â  Â  Â  Â dst[i*components] =<br>
>  Â  Â  Â  Â  Â  Â  Â  _mesa_signed_to_signed(dst[i*components], bits);<br>
>  Â  Â  Â } else {<br>
>  Â  Â  Â  Â  for (i = 0; i < n; i++) {<br>
>  Â  Â  Â  Â  Â  Â dst[i*components] =<br>
>  Â  Â  Â  Â  Â  Â  Â  _mesa_unsigned_to_unsigned(dst[i*components], bits);<br>
>  Â  Â  Â }<br>
>  Â  }<br>
> }<br>
><br>
> We could add the unsigned_to_signed and signed_to_unsigned paths too if<br>
> you prefer it that way, but they won't be used as far as I can see. In<br>
> that case we would also need to add a src_type parameter.<br>
<br>
</div></div>Well, in the end I could not do it like this. There is a subtle problem<br>
with the RB format -> RGBA conversion that we do before we pack the<br>
luminance values. The problem is that we do not want this conversion to<br>
ever do int->uint clamping because we want to compute L=R+G+B with<br>
unclamped values first, then clamp the result.<br>
<br>
For example, if we have a signed integer render buffer and a pixel in<br>
that buffer has this value:<br>
r=-5, g=6, b=1<br>
<br>
when we convert this to RGBA we want to have<br>
r=-5, g=6, b=1, a = 1<br>
<br>
instead of<br>
r=0, g=6, b=1, a = 1<br>
<br>
which is what we would get if we convert to RGBA UINT. Then we would<br>
compute L = R+G+B = 2, and this is the value we should clamp to the type<br>
of the dst if we need to.<br>
<br>
So in the end I have to consider signed<->unsigned conversions when we<br>
compute L anyway.<br>
<br>
Here is a pastebin with the actual implementation of the luminance<br>
packing helper:<br>
<a href="http://pastebin.com/gB0aLtzx" target="_blank">http://pastebin.com/gB0aLtzx</a><br>
<br>
I tested this with a few examples and seems to produce correct results.<br>
Notice that this is currently broken in master, because pack.c defines<br>
stuff like this:<br>
<br>
#define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)<br>
#define FN_NAME pack_short_from_uint_rgba<br>
<br>
#define SRC_CONVERT(x) CLAMP((int)x, -128, 127)<br>
#define FN_NAME pack_byte_from_uint_rgba<br>
<br>
which does not do the right thing when 'x' is expanded to be an<br>
expression that adds R, G and B components.<br></blockquote><div><br></div><div>Yes, I think that works but is a bit more complicated than needed.  Why can't we just do a 64-bit add of the components and then clamp to a 32-bit value.  If the final value is 8 or 16 bits, it will get clamped again, but that shouldn't be a problem.  We will have to differentiate between signed and unsigned, but that's ok.  It would be much simpler.  Would that work or am I missing something?<br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class="HOEnZb"><font color="#888888"><br>
Iago<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> ><br>
> ><br>
> >  Â  Â  Â  Â Iago<br>
> ><br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  return;<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â case GL_LUMINANCE_ALPHA:<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  for (i = 0; i < n; i++) {<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â dst[2*i] = rgba[i][RCOMP] + rgba[i][GCOMP]<br>
> >  Â  Â  Â  Â +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[i][BCOMP];<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â dst[2*i+1] = rgba[i][ACOMP];<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  return;<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â default:<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  assert(!"Unsupported format");<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â }<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +}<br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â diff --git a/src/mesa/main/pack.h<br>
> >  Â  Â  Â  Â b/src/mesa/main/pack.h<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â index 2173b65..2783f23 100644<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â --- a/src/mesa/main/pack.h<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +++ b/src/mesa/main/pack.h<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â @@ -155,4 +155,13 @@ _mesa_rebase_rgba_float(GLuint<br>
> >  Â  Â  Â  Â n, GLfloat<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[][4], GLenum baseFormat);<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â  extern void<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â  _mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4],<br>
> >  Â  Â  Â  Â GLenum<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â baseFormat);<br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +extern void<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +_mesa_pack_luminance_from_rgba_float(GLuint n,<br>
> >  Â  Â  Â  Â GLfloat<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[][4],<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â GLvoid<br>
> >  Â  Â  Â  Â *dstAddr, GLenum<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â dst_format,<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â GLbitfield<br>
> >  Â  Â  Â  Â transferOps);<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +extern void<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +_mesa_pack_luminance_from_rgba_integer(GLuint n,<br>
> >  Â  Â  Â  Â GLuint<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â rgba[][4],<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â GLvoid<br>
> >  Â  Â  Â  Â *dstAddr,<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â GLenum dst_format);<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â +<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â  #endif<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â --<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â 1.9.1<br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â _______________________________________________<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â mesa-dev mailing list<br>
> >  Â  Â  Â  Â >  Â  Â  Â  Â <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> >  Â  Â  Â  Â ><br>
> >  Â  Â  Â  Â  <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
> ><br>
> ><br>
> ><br>
><br>
><br>
> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
<br>
<br>
</div></div></blockquote></div></div></div>