From 4060ce4f3eb5efada5142f93927e39fca85be843 Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied@redhat.com>
Date: Mon, 5 Apr 2010 07:30:11 +1000
Subject: [PATCH] dri/st: add hacky tfp format override v2

this fixes piglit tfp on r300g
---
 .../state_trackers/dri/common/dri_drawable.h       |    1 +
 src/gallium/state_trackers/dri/drm/dri2.c          |   13 ++++++++++++-
 2 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.h b/src/gallium/state_trackers/dri/common/dri_drawable.h
index 98abeb9..f008a92 100644
--- a/src/gallium/state_trackers/dri/common/dri_drawable.h
+++ b/src/gallium/state_trackers/dri/common/dri_drawable.h
@@ -64,6 +64,7 @@ struct dri_drawable
    unsigned int desired_fences;
    unsigned int cur_fences;
 
+   enum pipe_format format_tfp_override;
    /* used only by DRI1 */
    struct pipe_surface *dri1_surface;
 };
diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
index c632f0f..653868c 100644
--- a/src/gallium/state_trackers/dri/drm/dri2.c
+++ b/src/gallium/state_trackers/dri/drm/dri2.c
@@ -78,15 +78,22 @@ dri2_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
    struct dri_context *ctx = dri_context(pDRICtx);
    struct dri_drawable *drawable = dri_drawable(dPriv);
    struct pipe_texture *pt;
+   int st_format;
+
+   drawable->format_tfp_override = (drawable->stvis.color_format == PIPE_FORMAT_B8G8R8A8_UNORM && format == __DRI_TEXTURE_FORMAT_RGB) ? PIPE_FORMAT_B8G8R8X8_UNORM : 0;
+   st_format = drawable->format_tfp_override;
+   if (!st_format)
+      st_format = drawable->stvis.color_format;
 
    dri_st_framebuffer_validate_att(drawable->stfb, ST_ATTACHMENT_FRONT_LEFT);
+   drawable->format_tfp_override = 0;
 
    pt = drawable->textures[ST_ATTACHMENT_FRONT_LEFT];
 
    if (pt) {
       ctx->st->teximage(ctx->st,
             (target == GL_TEXTURE_2D) ? ST_TEXTURE_2D : ST_TEXTURE_RECT,
-            0, drawable->stvis.color_format, pt, FALSE);
+            0, st_format, pt, FALSE);
    }
 }
 
@@ -114,6 +121,10 @@ dri2_drawable_get_format(struct dri_drawable *drawable,
 
    switch (statt) {
    case ST_ATTACHMENT_FRONT_LEFT:
+      if (drawable->format_tfp_override) {
+	 format = drawable->format_tfp_override;
+	 break;
+      }
    case ST_ATTACHMENT_BACK_LEFT:
    case ST_ATTACHMENT_FRONT_RIGHT:
    case ST_ATTACHMENT_BACK_RIGHT:
-- 
1.6.6.1

