texstore: fix regression stricter check for memcpy path for unorm88 and unorm1616

According to https://bugs.freedesktop.org/show_bug.cgi?id=34280
commit 5d1387b2da causes the font corruption
problems people have been seeing under various apps and gnome-shell on r200
cards.

This commit changed (loosened) the check for using the memcpy path in the
former al88 / al1616 texstore functions, which are now also used to
store rg texures. This patch restores the old strict check in case of
al textures. I've no idea why this fixes things, since I don't know the
code in question at all. But after seeing the bisect in bfdo34280 point
to this commit, I gave this fix a try and it fixes the font issues seen on
r200 cards.

[airlied:
r200 has no native working A8, so it does an internal storage format of AL88
however srcFormat == internalFormat == ALPHA when we get to this point,
so it copies, but it wants to store into an AL88 not ALPHA so fails,
I'll also push a piglit test for this on r200].

Many thanks to Nicolas Kaiser who did all the hard work of tracking this down!

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
(cherry picked from commit e338a1b0ce)
This commit is contained in:
Hans de Goede 2011-04-10 22:21:03 +02:00 committed by Ian Romanick
parent 5f8729859e
commit 157f4a9d28

View file

@ -2056,8 +2056,11 @@ _mesa_texstore_unorm88(TEXSTORE_PARAMS)
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
(dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_RG88) &&
baseInternalFormat == srcFormat &&
((dstFormat == MESA_FORMAT_AL88 &&
baseInternalFormat == GL_LUMINANCE_ALPHA &&
srcFormat == GL_LUMINANCE_ALPHA) ||
(dstFormat == MESA_FORMAT_RG88 &&
baseInternalFormat == srcFormat)) &&
srcType == GL_UNSIGNED_BYTE &&
littleEndian) {
/* simple memcpy path */
@ -2175,8 +2178,11 @@ _mesa_texstore_unorm1616(TEXSTORE_PARAMS)
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
(dstFormat == MESA_FORMAT_AL1616 || dstFormat == MESA_FORMAT_RG1616) &&
baseInternalFormat == srcFormat &&
((dstFormat == MESA_FORMAT_AL1616 &&
baseInternalFormat == GL_LUMINANCE_ALPHA &&
srcFormat == GL_LUMINANCE_ALPHA) ||
(dstFormat == MESA_FORMAT_RG1616 &&
baseInternalFormat == srcFormat)) &&
srcType == GL_UNSIGNED_SHORT &&
littleEndian) {
/* simple memcpy path */