Bug#746272: xserver-xorg-video-ati: libGL error: failed to load driver: r300

Elimar Riesebieter riesebie at lxtec.de
Fri May 2 05:58:12 PDT 2014


tags 746272 patch
thx

* Michel Dänzer <michel at daenzer.net> [2014-05-02 12:11 +0900]:

[...]
> 
> The bug is https://bugs.freedesktop.org/show_bug.cgi?id=71789 .
> 

I can confirm that the patches from [0] solved the problem. I've
patched Debian's mesa 10.1.1. Some Cairo-Dock icons are looking  bit
froggy now. But this I have to investigate further. Foobillardplus
plays fine. Please find attached "quilt refreshed" patches. I didn't
have time to test those patches on other platforms, though.

[0] http://lists.freedesktop.org/archives/mesa-dev/2013-December/050218.html

Thanks Michel ;-)

Elimar
-- 
  The path to source is always uphill!
                                -unknown-

-------------- next part --------------
>From b3c5896e87036bdfd744e3b1b768a58c3e38ac2b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <michel.daenzer at amd.com>
Date: Mon, 25 Nov 2013 10:13:42 +0900
Subject: [PATCH 1/2] st/dri: Use packed RGB formats
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/gallium/state_trackers/dri/common/dri_drawable.c |  8 ++++----
 src/gallium/state_trackers/dri/drm/dri2.c            | 20 ++++++++++----------
 2 files changed, 14 insertions(+), 14 deletions(-)

Index: mesa-10.1.1/src/gallium/state_trackers/dri/common/dri_drawable.c
===================================================================
--- mesa-10.1.1.orig/src/gallium/state_trackers/dri/common/dri_drawable.c	2014-05-02 10:11:15.327163064 +0200
+++ mesa-10.1.1/src/gallium/state_trackers/dri/common/dri_drawable.c	2014-05-02 10:11:15.305162415 +0200
@@ -231,11 +231,11 @@
       if (format == __DRI_TEXTURE_FORMAT_RGB)  {
          /* only need to cover the formats recognized by dri_fill_st_visual */
          switch (internal_format) {
-         case PIPE_FORMAT_B8G8R8A8_UNORM:
-            internal_format = PIPE_FORMAT_B8G8R8X8_UNORM;
+         case PIPE_FORMAT_BGRA8888_UNORM:
+            internal_format = PIPE_FORMAT_BGRX8888_UNORM;
             break;
-         case PIPE_FORMAT_A8R8G8B8_UNORM:
-            internal_format = PIPE_FORMAT_X8R8G8B8_UNORM;
+         case PIPE_FORMAT_ARGB8888_UNORM:
+            internal_format = PIPE_FORMAT_XRGB8888_UNORM;
             break;
          default:
             break;
Index: mesa-10.1.1/src/gallium/state_trackers/dri/drm/dri2.c
===================================================================
--- mesa-10.1.1.orig/src/gallium/state_trackers/dri/drm/dri2.c	2014-05-02 10:11:15.327163064 +0200
+++ mesa-10.1.1/src/gallium/state_trackers/dri/drm/dri2.c	2014-05-02 10:11:15.308162504 +0200
@@ -129,10 +129,10 @@
        * may occur as the stvis->color_format.
        */
       switch(format) {
-      case PIPE_FORMAT_B8G8R8A8_UNORM:
+      case PIPE_FORMAT_BGRA8888_UNORM:
 	 depth = 32;
 	 break;
-      case PIPE_FORMAT_B8G8R8X8_UNORM:
+      case PIPE_FORMAT_BGRX8888_UNORM:
 	 depth = 24;
 	 break;
       case PIPE_FORMAT_B5G6R5_UNORM:
@@ -403,10 +403,10 @@
 
    switch (format) {
       case 32:
-         pf = PIPE_FORMAT_B8G8R8A8_UNORM;
+         pf = PIPE_FORMAT_BGRA8888_UNORM;
          break;
       case 24:
-         pf = PIPE_FORMAT_B8G8R8X8_UNORM;
+         pf = PIPE_FORMAT_BGRX8888_UNORM;
          break;
       case 16:
          pf = PIPE_FORMAT_Z16_UNORM;
@@ -549,13 +549,13 @@
       pf = PIPE_FORMAT_B5G6R5_UNORM;
       break;
    case __DRI_IMAGE_FORMAT_XRGB8888:
-      pf = PIPE_FORMAT_B8G8R8X8_UNORM;
+      pf = PIPE_FORMAT_BGRX8888_UNORM;
       break;
    case __DRI_IMAGE_FORMAT_ARGB8888:
-      pf = PIPE_FORMAT_B8G8R8A8_UNORM;
+      pf = PIPE_FORMAT_BGRA8888_UNORM;
       break;
    case __DRI_IMAGE_FORMAT_ABGR8888:
-      pf = PIPE_FORMAT_R8G8B8A8_UNORM;
+      pf = PIPE_FORMAT_RGBA8888_UNORM;
       break;
    default:
       pf = PIPE_FORMAT_NONE;
@@ -670,13 +670,13 @@
       pf = PIPE_FORMAT_B5G6R5_UNORM;
       break;
    case __DRI_IMAGE_FORMAT_XRGB8888:
-      pf = PIPE_FORMAT_B8G8R8X8_UNORM;
+      pf = PIPE_FORMAT_BGRX8888_UNORM;
       break;
    case __DRI_IMAGE_FORMAT_ARGB8888:
-      pf = PIPE_FORMAT_B8G8R8A8_UNORM;
+      pf = PIPE_FORMAT_BGRA8888_UNORM;
       break;
    case __DRI_IMAGE_FORMAT_ABGR8888:
-      pf = PIPE_FORMAT_R8G8B8A8_UNORM;
+      pf = PIPE_FORMAT_RGBA8888_UNORM;
       break;
    default:
       pf = PIPE_FORMAT_NONE;
-------------- next part --------------
>From d159715c15cd8ce40bdc1e3386d84cc38576f43a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <michel.daenzer at amd.com>
Date: Tue, 26 Nov 2013 19:46:55 +0900
Subject: [PATCH 2/2] r300g: Big endian fixes
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/gallium/drivers/r300/r300_blit.c          |  4 ++-
 src/gallium/drivers/r300/r300_context.h       |  2 ++
 src/gallium/drivers/r300/r300_state.c         | 20 +++++++++---
 src/gallium/drivers/r300/r300_state_derived.c | 15 +++++----
 src/gallium/drivers/r300/r300_texture.c       | 44 +++++++++++++++++++++++++--
 src/gallium/drivers/r300/r300_texture.h       |  3 ++
 src/gallium/drivers/r300/r300_transfer.c      |  6 ++--
 7 files changed, 77 insertions(+), 17 deletions(-)

Index: mesa-10.1.1/src/gallium/drivers/r300/r300_blit.c
===================================================================
--- mesa-10.1.1.orig/src/gallium/drivers/r300/r300_blit.c	2014-05-02 10:11:15.444166511 +0200
+++ mesa-10.1.1/src/gallium/drivers/r300/r300_blit.c	2014-05-02 10:11:15.410165510 +0200
@@ -185,7 +185,9 @@
     union util_color uc;
 
     memset(&uc, 0, sizeof(uc));
-    util_pack_color(color->f, fb->cbufs[0]->format, &uc);
+    util_pack_color(color->f,
+                    r300_get_hw_format(fb->cbufs[0]->format, PIPE_BIND_RENDER_TARGET),
+                    &uc);
 
     if (fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16A16_FLOAT ||
         fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16X16_FLOAT) {
Index: mesa-10.1.1/src/gallium/drivers/r300/r300_context.h
===================================================================
--- mesa-10.1.1.orig/src/gallium/drivers/r300/r300_context.h	2014-05-02 10:11:15.444166511 +0200
+++ mesa-10.1.1/src/gallium/drivers/r300/r300_context.h	2014-05-02 10:11:15.412165568 +0200
@@ -45,6 +45,8 @@
 struct r300_stencilref_context;
 
 enum colormask_swizzle {
+    COLORMASK_ARGB,
+    COLORMASK_XRGB,
     COLORMASK_BGRA,
     COLORMASK_RGBA,
     COLORMASK_RRRR,
Index: mesa-10.1.1/src/gallium/drivers/r300/r300_state.c
===================================================================
--- mesa-10.1.1.orig/src/gallium/drivers/r300/r300_state.c	2014-05-02 10:11:15.444166511 +0200
+++ mesa-10.1.1/src/gallium/drivers/r300/r300_state.c	2014-05-02 10:11:15.417165716 +0200
@@ -225,6 +225,12 @@
 
 /* The hardware colormask is clunky a must be swizzled depending on the format.
  * This was figured out by trial-and-error. */
+static unsigned argb_cmask(unsigned mask)
+{
+   return ((mask & (PIPE_MASK_R | PIPE_MASK_G | PIPE_MASK_B)) << 1) |
+          ((mask & PIPE_MASK_A) >> 3);
+}
+
 static unsigned bgra_cmask(unsigned mask)
 {
     return ((mask & PIPE_MASK_R) << 2) |
@@ -471,6 +477,8 @@
     /* Build a command buffer. */
     {
         unsigned (*func[COLORMASK_NUM_SWIZZLES])(unsigned) = {
+            argb_cmask,
+            argb_cmask,
             bgra_cmask,
             rgba_cmask,
             rrrr_cmask,
@@ -482,7 +490,8 @@
         };
 
         for (i = 0; i < COLORMASK_NUM_SWIZZLES; i++) {
-            boolean has_alpha = i != COLORMASK_RGBX && i != COLORMASK_BGRX;
+            boolean has_alpha = i != COLORMASK_RGBX && i != COLORMASK_BGRX &&
+                i != COLORMASK_XRGB;
 
             BEGIN_CB(blend->cb_clamp[i], 8);
             OUT_CB_REG(R300_RB3D_ROPCNTL, rop);
@@ -1657,6 +1666,7 @@
     boolean dxtc_swizzle = r300_screen(pipe->screen)->caps.dxtc_swizzle;
 
     if (view) {
+        enum pipe_format format = r300_get_hw_format(templ->format, texture->bind);
         unsigned hwformat;
 
         view->base = *templ;
@@ -1672,24 +1682,24 @@
         view->swizzle[2] = templ->swizzle_b;
         view->swizzle[3] = templ->swizzle_a;
 
-        hwformat = r300_translate_texformat(templ->format,
+        hwformat = r300_translate_texformat(format,
                                             view->swizzle,
                                             is_r500,
                                             dxtc_swizzle);
 
         if (hwformat == ~0) {
             fprintf(stderr, "r300: Ooops. Got unsupported format %s in %s.\n",
-                    util_format_short_name(templ->format), __func__);
+                    util_format_short_name(format), __func__);
         }
         assert(hwformat != ~0);
 
 	r300_texture_setup_format_state(r300_screen(pipe->screen), tex,
-					templ->format, 0,
+					format, 0,
 	                                width0_override, height0_override,
 					&view->format);
         view->format.format1 |= hwformat;
         if (is_r500) {
-            view->format.format2 |= r500_tx_format_msb_bit(templ->format);
+            view->format.format2 |= r500_tx_format_msb_bit(format);
         }
     }
 
Index: mesa-10.1.1/src/gallium/drivers/r300/r300_state_derived.c
===================================================================
--- mesa-10.1.1.orig/src/gallium/drivers/r300/r300_state_derived.c	2014-05-02 10:11:15.444166511 +0200
+++ mesa-10.1.1/src/gallium/drivers/r300/r300_state_derived.c	2014-05-02 10:11:15.420165803 +0200
@@ -815,9 +815,12 @@
 
     for (i = 0; i < count; i++) {
         if (state->sampler_views[i] && state->sampler_states[i]) {
+            enum pipe_format format;
+
             state->tx_enable |= 1 << i;
 
             view = state->sampler_views[i];
+            format = r300_get_hw_format(view->base.format, view->base.texture->bind);
             tex = r300_resource(view->base.texture);
             sampler = state->sampler_states[i];
 
@@ -828,7 +831,7 @@
 
             /* Set the border color. */
             texstate->border_color =
-                r300_get_border_color(view->base.format,
+                r300_get_border_color(format,
                                       sampler->state.border_color.f,
                                       r300->screen->caps.is_r500);
 
@@ -852,7 +855,7 @@
                 offset = tex->tex.offset_in_bytes[base_level];
 
                 r300_texture_setup_format_state(r300->screen, tex,
-                                                view->base.format,
+                                                format,
                                                 base_level,
                                                 view->width0_override,
 		                                view->height0_override,
@@ -865,11 +868,11 @@
             texstate->format.format1 |= view->texcache_region;
 
             /* Depth textures are kinda special. */
-            if (util_format_is_depth_or_stencil(view->base.format)) {
+            if (util_format_is_depth_or_stencil(format)) {
                 unsigned char depth_swizzle[4];
 
                 if (!r300->screen->caps.is_r500 &&
-                    util_format_get_blocksizebits(view->base.format) == 32) {
+                    util_format_get_blocksizebits(format) == 32) {
                     /* X24x8 is sampled as Y16X16 on r3xx-r4xx.
                      * The depth here is at the Y component. */
                     for (j = 0; j < 4; j++)
@@ -894,7 +897,7 @@
             }
 
             if (r300->screen->caps.dxtc_swizzle &&
-                util_format_is_compressed(view->base.format)) {
+                util_format_is_compressed(format)) {
                 texstate->filter1 |= R400_DXTC_SWIZZLE_ENABLE;
             }
 
@@ -940,7 +943,7 @@
             }
 
             /* Float textures only support nearest and mip-nearest filtering. */
-            if (util_format_is_float(view->base.format)) {
+            if (util_format_is_float(format)) {
                 /* No MAG linear filtering. */
                 if ((texstate->filter0 & R300_TX_MAG_FILTER_MASK) ==
                     R300_TX_MAG_FILTER_LINEAR) {
Index: mesa-10.1.1/src/gallium/drivers/r300/r300_texture.c
===================================================================
--- mesa-10.1.1.orig/src/gallium/drivers/r300/r300_texture.c	2014-05-02 10:11:15.444166511 +0200
+++ mesa-10.1.1/src/gallium/drivers/r300/r300_texture.c	2014-05-02 10:11:15.423165893 +0200
@@ -90,6 +90,25 @@
     return result;
 }
 
+
+enum pipe_format r300_get_hw_format(enum pipe_format api_format,
+                                    unsigned bind)
+{
+    if (bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SCANOUT | PIPE_BIND_SHARED) &&
+        !(bind & (PIPE_BIND_TRANSFER_READ | PIPE_BIND_TRANSFER_WRITE))) {
+        switch (api_format) {
+        case PIPE_FORMAT_A8R8G8B8_UNORM:
+           return PIPE_FORMAT_B8G8R8A8_UNORM;
+        case PIPE_FORMAT_X8R8G8B8_UNORM:
+           return PIPE_FORMAT_B8G8R8X8_UNORM;
+        default:
+           break;
+        }
+    }
+
+    return api_format;
+}
+
 /* Translate a pipe_format into a useful texture format for sampling.
  *
  * Some special formats are translated directly using R300_EASY_TX_FORMAT,
@@ -444,10 +463,14 @@
             return R300_COLOR_FORMAT_ARGB4444;
 
         /* 32-bit buffers. */
+        case PIPE_FORMAT_A8R8G8B8_UNORM:
+        /*case PIPE_FORMAT_A8R8G8B8_SNORM:*/
         case PIPE_FORMAT_B8G8R8A8_UNORM:
         /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
         case PIPE_FORMAT_B8G8R8X8_UNORM:
         /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
+        case PIPE_FORMAT_X8R8G8B8_UNORM:
+        /*case PIPE_FORMAT_X8R8G8B8_SNORM:*/
         case PIPE_FORMAT_R8G8B8A8_UNORM:
         case PIPE_FORMAT_R8G8B8A8_SNORM:
         case PIPE_FORMAT_R8G8B8X8_UNORM:
@@ -667,6 +690,10 @@
                 R300_C2_SEL_R | R300_C3_SEL_A;
 
         /* ARGB outputs. */
+        case PIPE_FORMAT_X8R8G8B8_UNORM:
+        /*case PIPE_FORMAT_X8R8G8B8_SNORM:*/
+        case PIPE_FORMAT_A8R8G8B8_UNORM:
+        /*case PIPE_FORMAT_A8R8G8B8_SNORM:*/
         case PIPE_FORMAT_A16_UNORM:
         case PIPE_FORMAT_A16_SNORM:
         case PIPE_FORMAT_A16_FLOAT:
@@ -770,6 +797,14 @@
     case PIPE_FORMAT_R32G32_FLOAT:
         return COLORMASK_GRRG;
 
+    case PIPE_FORMAT_A8R8G8B8_UNORM:
+    /*case PIPE_FORMAT_A8R8G8B8_SNORM:*/
+        return COLORMASK_ARGB;
+
+    case PIPE_FORMAT_X8R8G8B8_UNORM:
+    /*case PIPE_FORMAT_X8R8G8B8_SNORM:*/
+        return COLORMASK_XRGB;
+
     case PIPE_FORMAT_B5G5R5X1_UNORM:
     case PIPE_FORMAT_B4G4R4X4_UNORM:
     case PIPE_FORMAT_B8G8R8X8_UNORM:
@@ -936,14 +971,17 @@
         surf->pitch_zmask = tex->tex.zmask_stride_in_pixels[level];
         surf->pitch_hiz = tex->tex.hiz_stride_in_pixels[level];
     } else {
+        enum pipe_format hwformat = r300_get_hw_format(surf->base.format,
+                                                       surf->base.texture->bind);
+
         surf->pitch =
                 stride |
-                r300_translate_colorformat(surf->base.format) |
+                r300_translate_colorformat(hwformat) |
                 R300_COLOR_TILE(tex->tex.macrotile[level]) |
                 R300_COLOR_MICROTILE(tex->tex.microtile);
-        surf->format = r300_translate_out_fmt(surf->base.format);
+        surf->format = r300_translate_out_fmt(hwformat);
         surf->colormask_swizzle =
-            r300_translate_colormask_swizzle(surf->base.format);
+            r300_translate_colormask_swizzle(hwformat);
         surf->pitch_cmask = tex->tex.cmask_stride_in_pixels;
     }
 }
Index: mesa-10.1.1/src/gallium/drivers/r300/r300_texture.h
===================================================================
--- mesa-10.1.1.orig/src/gallium/drivers/r300/r300_texture.h	2014-05-02 10:11:15.444166511 +0200
+++ mesa-10.1.1/src/gallium/drivers/r300/r300_texture.h	2014-05-02 10:11:15.424165922 +0200
@@ -39,6 +39,9 @@
                                    const unsigned char *swizzle_view,
                                    boolean dxtc_swizzle);
 
+enum pipe_format r300_get_hw_format(enum pipe_format api_format,
+                                    unsigned bind);
+
 uint32_t r300_translate_texformat(enum pipe_format format,
                                   const unsigned char *swizzle_view,
                                   boolean is_r500,
Index: mesa-10.1.1/src/gallium/drivers/r300/r300_transfer.c
===================================================================
--- mesa-10.1.1.orig/src/gallium/drivers/r300/r300_transfer.c	2014-05-02 10:11:15.444166511 +0200
+++ mesa-10.1.1/src/gallium/drivers/r300/r300_transfer.c	2014-05-02 10:11:15.425165951 +0200
@@ -22,6 +22,7 @@
  * USE OR OTHER DEALINGS IN THE SOFTWARE. */
 
 #include "r300_transfer.h"
+#include "r300_texture.h"
 #include "r300_texture_desc.h"
 #include "r300_screen_buffer.h"
 
@@ -110,8 +111,8 @@
     struct r300_context *r300 = r300_context(ctx);
     struct r300_resource *tex = r300_resource(texture);
     struct r300_transfer *trans;
+    enum pipe_format format = texture->format;
     boolean referenced_cs, referenced_hw;
-    enum pipe_format format = tex->b.b.format;
     char *map;
 
     referenced_cs =
@@ -135,8 +136,9 @@
          * for this transfer.
          * Also make write transfers pipelined. */
         if (tex->tex.microtile || tex->tex.macrotile[level] ||
+            r300_get_hw_format(format, texture->bind) != format ||
             (referenced_hw && !(usage & PIPE_TRANSFER_READ) &&
-             r300_is_blit_supported(texture->format))) {
+             r300_is_blit_supported(format))) {
             struct pipe_resource base;
 
             if (r300->blitter->running) {


More information about the xorg-driver-ati mailing list