<html>
<head>
<base href="https://bugs.freedesktop.org/" />
</head>
<body>
<p>
<div>
<b><a class="bz_bug_link
bz_status_NEW "
title="NEW - Unify the format conversion code"
href="https://bugs.freedesktop.org/show_bug.cgi?id=84566#c14">Comment # 14</a>
on <a class="bz_bug_link
bz_status_NEW "
title="NEW - Unify the format conversion code"
href="https://bugs.freedesktop.org/show_bug.cgi?id=84566">bug 84566</a>
from <span class="vcard"><a class="email" href="mailto:itoral@igalia.com" title="Iago Toral <itoral@igalia.com>"> <span class="fn">Iago Toral</span></a>
</span></b>
<pre>(In reply to Jason Ekstrand from <a href="show_bug.cgi?id=84566#c13">comment #13</a>)
<span class="quote">> (In reply to Iago Toral from <a href="show_bug.cgi?id=84566#c12">comment #12</a>)
> > (In reply to Jason Ekstrand from <a href="show_bug.cgi?id=84566#c11">comment #11</a>)
> > > (In reply to Iago Toral from <a href="show_bug.cgi?id=84566#c10">comment #10</a>)
> > > > (In reply to Iago Toral from <a href="show_bug.cgi?id=84566#c9">comment #9</a>)
> > > > > Jason, piglit tests hit cases where they attempt to convert GL format and
> > > > > data type combinations that do not match any of the existing mesa formats.
> > > > >
> > > > > For example GL_RGB + GL_UNSIGNED_BYTE_2_3_3_REV (BBGG GRRR). The Only mesa
> > > > > format of this kind is MESA_FORMAT_B2G3R3_UNORM (RRRG GGBB).
> > > > >
> > > > > This means that we don't have pack and unpack functions for these types,
> > > > > which we need to use a master conversion function. I think the natural thing
> > > > > to do would be to add new mesa_format types for these, together with their
> > > > > format_pack.c and format_unpack.c functions (which should be auto-generated
> > > > > too). I suppose it is okay to add new mesa_format enums, right?
> > > >
> > > > BTW, as an added bonus, with this approach we will speed up conversion for
> > > > some of these types too. For example, the way Mesa currently handles
> > > > GL_UNSIGNED_BYTE_2_3_3_REV to GL_RGBA UBYTE involves two conversions
> > > > (2_3_3_REV -> RGBA FLOAT -> RGBA_UBYTE), while we would be able to do that
> > > > in one go via the auto-generated unpack function.
> > >
> > > How many formats like this are there? If it's only a few, then it probably
> > > makes sense to add the few mesa_formats that we need.
> >
> > I don't know yet. For that I would have enable the master convertion
> > function for all code paths, then run all the piglit tests and then check
> > the cases that hit the assertion I have one by one removing duplicate cases,
> > so it would take some time.
> >
> > In any case, even if these were a significant bunch: do we have a good
> > alternative? If we don't create mesa_formats for these types we would have
> > to handle them as exceptions to the process (and this kind of defeats the
> > purpose of a master function). We would have to handle conversions from and
> > to these types through different paths and write the conversions functions
> > we need by hand...
>
> You should know once you write a gl_format_and_type_to_mesa_format function.</span >
I have that already, but it is not enough. At the moment, if I have detected
that a format is not an array format, I do something like this to decide if it
has a matching mesa format:
for (int f = 1; f < MESA_FORMAT_COUNT; f++)
if (_mesa_format_matches_format_and_type(f, format, type, swap_bytes))
return f;
So the cases that don't match simply continue and hit an assertion.
<span class="quote">> I don't think there will be many. I think OpenGL only specifies about 8
> packed formats (plus swizzling) and we should already have most of them.</span >
Let's assume they are not that many then.
On a different note, I have just noticed that the driver can select a different
texture format than the internal format specified by the client (glTexImage*),
when the specified format is not supported. This creates a requirement for
swizzle transformations where we need to do src->baseinternal->rgba->dst, but
the master function, as it is right now, does not know about the internal
format (only knows src and dst, so it does src->rgba->dst), so it fails for
some of these cases.
For example, in one case I see that the client specifies MESA_FORMAT_I_SINT8
(swizzle 0000) as the internal format for the texture, but the driver does not
support that and uses MESA_FORMAT_RGBA_SINT8 (swizzle 0123) instead. A master
function that only knows about MESA_FORMAT_RGBA_SINT8 and does not know that
the format requested by the client was MESA_FORMAT_I_SINT8 will not produce
correct results since it would not be able to compute the right swizzle
transform for _mesa_swizzle_and_convert.
So my proposal is to pass the baseinternalformat to the master converter. If
there are cases where we do not care about an internalformat we can just pass
_mesa_get_format_base_format(dstFormat) and then have the master converter
compute a different swizzle when the provided internal format is different from
_mesa_get_format_base_format(dstFormat), which is what various parts of
texstore are doing now.
Sounds reasonable?</pre>
</div>
</p>
<hr>
<span>You are receiving this mail because:</span>
<ul>
<li>You are the QA Contact for the bug.</li>
</ul>
</body>
</html>