Mesa (master): r300g: support B10G10R10A2 render targets only with DRM 2.8. 0 or later versions

Marek Olšák mareko at kemper.freedesktop.org
Wed Dec 22 02:40:27 UTC 2010


Module: Mesa
Branch: master
Commit: 2a95542088fbada4ffe5bdd2da90b215cb6a5003
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2a95542088fbada4ffe5bdd2da90b215cb6a5003

Author: Marek Olšák <maraeo at gmail.com>
Date:   Tue Dec 21 19:26:27 2010 +0100

r300g: support B10G10R10A2 render targets only with DRM 2.8.0 or later versions

---

 src/gallium/drivers/r300/r300_screen.c            |    4 +++-
 src/gallium/drivers/r300/r300_winsys.h            |    5 +++--
 src/gallium/winsys/radeon/drm/radeon_drm_common.c |    4 ++++
 src/gallium/winsys/radeon/drm/radeon_r300.c       |    2 ++
 src/gallium/winsys/radeon/drm/radeon_winsys.h     |    4 +++-
 5 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index 921d6f1..36060ab 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -309,7 +309,9 @@ static boolean r300_is_format_supported(struct pipe_screen* screen,
                                         unsigned usage,
                                         unsigned geom_flags)
 {
+    struct r300_winsys_screen *rws = r300_screen(screen)->rws;
     uint32_t retval = 0;
+    boolean drm_2_8_0 = rws->get_value(rws, R300_VID_DRM_2_8_0);
     boolean is_r500 = r300_screen(screen)->caps.is_r500;
     boolean is_r400 = r300_screen(screen)->caps.is_r400;
     boolean is_color2101010 = format == PIPE_FORMAT_R10G10B10A2_UNORM ||
@@ -363,7 +365,7 @@ static boolean r300_is_format_supported(struct pipe_screen* screen,
                   PIPE_BIND_SCANOUT |
                   PIPE_BIND_SHARED)) &&
         /* 2101010 cannot be rendered to on non-r5xx. */
-        (is_r500 || !is_color2101010) &&
+        (!is_color2101010 || (is_r500 && drm_2_8_0)) &&
         r300_is_colorbuffer_format_supported(format)) {
         retval |= usage &
             (PIPE_BIND_RENDER_TARGET |
diff --git a/src/gallium/drivers/r300/r300_winsys.h b/src/gallium/drivers/r300/r300_winsys.h
index 0dd330d..b8324af 100644
--- a/src/gallium/drivers/r300/r300_winsys.h
+++ b/src/gallium/drivers/r300/r300_winsys.h
@@ -51,8 +51,9 @@ enum r300_value_id {
     R300_VID_GB_PIPES,
     R300_VID_Z_PIPES,
     R300_VID_SQUARE_TILING_SUPPORT,
-    R300_VID_DRM_2_3_0,
-    R300_VID_DRM_2_6_0,
+    R300_VID_DRM_2_3_0, /* R500 VAP regs, MSPOS regs, fixed tex3D size checking */
+    R300_VID_DRM_2_6_0, /* Hyper-Z, GB_Z_PEQ_CONFIG on rv350->r4xx, R500 FG_ALPHA_VALUE */
+    R300_VID_DRM_2_8_0, /* R500 US_FORMAT regs, R500 ARGB2101010 colorbuffer */
     R300_CAN_HYPERZ,
 };
 
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_common.c b/src/gallium/winsys/radeon/drm/radeon_drm_common.c
index 6bc6244..f38ab6e 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_common.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_common.c
@@ -122,6 +122,10 @@ static void do_ioctls(struct radeon_drm_winsys *winsys)
                         (version->version_major == 2 &&
                          version->version_minor >= 6);
 
+    winsys->drm_2_8_0 = version->version_major > 2 ||
+                        (version->version_major == 2 &&
+                         version->version_minor >= 8);
+
     info.request = RADEON_INFO_DEVICE_ID;
     retval = drmCommandWriteRead(winsys->fd, DRM_RADEON_INFO, &info, sizeof(info));
     if (retval) {
diff --git a/src/gallium/winsys/radeon/drm/radeon_r300.c b/src/gallium/winsys/radeon/drm/radeon_r300.c
index 9f59b3d..ae7020a 100644
--- a/src/gallium/winsys/radeon/drm/radeon_r300.c
+++ b/src/gallium/winsys/radeon/drm/radeon_r300.c
@@ -211,6 +211,8 @@ static uint32_t radeon_get_value(struct r300_winsys_screen *rws,
         return ws->drm_2_3_0;
     case R300_VID_DRM_2_6_0:
         return ws->drm_2_6_0;
+    case R300_VID_DRM_2_8_0:
+        return ws->drm_2_8_0;
     case R300_CAN_HYPERZ:
         return ws->hyperz;
     }
diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h
index 81da1a2..6f23214 100644
--- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
+++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
@@ -49,8 +49,10 @@ struct radeon_drm_winsys {
     boolean squaretiling;   /* Square tiling support. */
     /* DRM 2.3.0 (R500 VAP regs, MSPOS regs, fixed tex3D size checking) */
     boolean drm_2_3_0;
-    /* DRM 2.6.0 (Hyper-Z, GB_Z_PEQ_CONFIG allowed on rv350->r4xx) */
+    /* DRM 2.6.0 (Hyper-Z, GB_Z_PEQ_CONFIG allowed on rv350->r4xx, FG_ALPHA_VALUE) */
     boolean drm_2_6_0;
+    /* DRM 2.8.0 (US_FORMAT regs, ARGB2101010 colorbuffer) */
+    boolean drm_2_8_0;
     /* Hyper-Z user */
     boolean hyperz;
 




More information about the mesa-commit mailing list