Mesa (master): r300g: require DRM 2.3.0 (kernel 2.6.34)

Marek Olšák mareko at kemper.freedesktop.org
Wed Mar 2 16:55:39 UTC 2011


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Wed Mar  2 17:51:19 2011 +0100

r300g: require DRM 2.3.0 (kernel 2.6.34)

Running any older kernel is not recommended anyway.

---

 src/gallium/drivers/r300/r300_chipset.h           |    2 -
 src/gallium/drivers/r300/r300_context.c           |    3 +-
 src/gallium/drivers/r300/r300_emit.c              |   61 ++++++++++-----------
 src/gallium/drivers/r300/r300_flush.c             |    2 +-
 src/gallium/drivers/r300/r300_render.c            |   18 +++----
 src/gallium/drivers/r300/r300_screen.c            |    4 --
 src/gallium/drivers/r300/r300_state.c             |   38 ++++++-------
 src/gallium/drivers/r300/r300_texture.c           |    3 +-
 src/gallium/drivers/r300/r300_texture_desc.c      |   29 +----------
 src/gallium/drivers/r300/r300_winsys.h            |    2 -
 src/gallium/winsys/radeon/drm/radeon_drm_common.c |   13 ++---
 11 files changed, 66 insertions(+), 109 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_chipset.h b/src/gallium/drivers/r300/r300_chipset.h
index 0be161f..68943d5 100644
--- a/src/gallium/drivers/r300/r300_chipset.h
+++ b/src/gallium/drivers/r300/r300_chipset.h
@@ -90,8 +90,6 @@ struct r300_capabilities {
     boolean high_second_pipe;
     /* DXTC texture swizzling. */
     boolean dxtc_swizzle;
-    /* Index bias (AKA index offset). */
-    boolean index_bias_supported;
 };
 
 /* Enumerations for legibility and telling which card we're running on. */
diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c
index f37e3ea..166d965 100644
--- a/src/gallium/drivers/r300/r300_context.c
+++ b/src/gallium/drivers/r300/r300_context.c
@@ -169,7 +169,6 @@ static boolean r300_setup_atoms(struct r300_context* r300)
     boolean is_rv350 = r300->screen->caps.is_rv350;
     boolean is_r500 = r300->screen->caps.is_r500;
     boolean has_tcl = r300->screen->caps.has_tcl;
-    boolean drm_2_3_0 = r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0);
     boolean drm_2_6_0 = r300->rws->get_value(r300->rws, R300_VID_DRM_2_6_0);
     boolean can_hyperz = r300->rws->get_value(r300->rws, R300_CAN_HYPERZ);
     boolean has_hiz_ram = r300->screen->caps.hiz_ram > 0;
@@ -215,7 +214,7 @@ static boolean r300_setup_atoms(struct r300_context* r300)
     R300_INIT_ATOM(rs_block_state, 0);
     R300_INIT_ATOM(rs_state, 0);
     /* SC, US. */
-    R300_INIT_ATOM(fb_state_pipelined, 5 + (drm_2_3_0 ? 3 : 0));
+    R300_INIT_ATOM(fb_state_pipelined, 8);
     /* US. */
     R300_INIT_ATOM(fs, 0);
     R300_INIT_ATOM(fs_rc_constant_state, 0);
diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c
index 9b4a306..24c82a3 100644
--- a/src/gallium/drivers/r300/r300_emit.c
+++ b/src/gallium/drivers/r300/r300_emit.c
@@ -469,6 +469,7 @@ void r300_emit_fb_state_pipelined(struct r300_context *r300,
     struct pipe_framebuffer_state* fb =
             (struct pipe_framebuffer_state*)r300->fb_state.state;
     unsigned i, num_cbufs = fb->nr_cbufs;
+    unsigned mspos0, mspos1;
     CS_LOCALS(r300);
 
     /* If we use the multiwrite feature, the colorbuffers 2,3,4 must be
@@ -492,38 +493,36 @@ void r300_emit_fb_state_pipelined(struct r300_context *r300,
     /* Multisampling. Depends on framebuffer sample count.
      * These are pipelined regs and as such cannot be moved
      * to the AA state. */
-    if (r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0)) {
-        unsigned mspos0 = 0x66666666;
-        unsigned mspos1 = 0x6666666;
-
-        if (fb->nr_cbufs && fb->cbufs[0]->texture->nr_samples > 1) {
-            /* Subsample placement. These may not be optimal. */
-            switch (fb->cbufs[0]->texture->nr_samples) {
-                case 2:
-                    mspos0 = 0x33996633;
-                    mspos1 = 0x6666663;
-                    break;
-                case 3:
-                    mspos0 = 0x33936933;
-                    mspos1 = 0x6666663;
-                    break;
-                case 4:
-                    mspos0 = 0x33939933;
-                    mspos1 = 0x3966663;
-                    break;
-                case 6:
-                    mspos0 = 0x22a2aa22;
-                    mspos1 = 0x2a65672;
-                    break;
-                default:
-                    debug_printf("r300: Bad number of multisamples!\n");
-            }
-        }
+    mspos0 = 0x66666666;
+    mspos1 = 0x6666666;
 
-        OUT_CS_REG_SEQ(R300_GB_MSPOS0, 2);
-        OUT_CS(mspos0);
-        OUT_CS(mspos1);
+    if (fb->nr_cbufs && fb->cbufs[0]->texture->nr_samples > 1) {
+        /* Subsample placement. These may not be optimal. */
+        switch (fb->cbufs[0]->texture->nr_samples) {
+        case 2:
+            mspos0 = 0x33996633;
+            mspos1 = 0x6666663;
+            break;
+        case 3:
+            mspos0 = 0x33936933;
+            mspos1 = 0x6666663;
+            break;
+        case 4:
+            mspos0 = 0x33939933;
+            mspos1 = 0x3966663;
+            break;
+        case 6:
+            mspos0 = 0x22a2aa22;
+            mspos1 = 0x2a65672;
+            break;
+        default:
+            debug_printf("r300: Bad number of multisamples!\n");
+        }
     }
+
+    OUT_CS_REG_SEQ(R300_GB_MSPOS0, 2);
+    OUT_CS(mspos0);
+    OUT_CS(mspos1);
     END_CS;
 }
 
@@ -1191,7 +1190,7 @@ unsigned r300_get_num_cs_end_dwords(struct r300_context *r300)
     /* Emitted in flush. */
     dwords += 26; /* emit_query_end */
     dwords += r300->hyperz_state.size + 2; /* emit_hyperz_end + zcache flush */
-    if (r300->screen->caps.index_bias_supported)
+    if (r300->screen->caps.is_r500)
         dwords += 2;
 
     return dwords;
diff --git a/src/gallium/drivers/r300/r300_flush.c b/src/gallium/drivers/r300/r300_flush.c
index c77cc08..9c41a13 100644
--- a/src/gallium/drivers/r300/r300_flush.c
+++ b/src/gallium/drivers/r300/r300_flush.c
@@ -57,7 +57,7 @@ static void r300_flush(struct pipe_context* pipe,
     if (r300->dirty_hw) {
         r300_emit_hyperz_end(r300);
         r300_emit_query_end(r300);
-        if (r300->screen->caps.index_bias_supported)
+        if (r300->screen->caps.is_r500)
             r500_emit_index_bias(r300, 0);
 
         r300->flush_counter++;
diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index 73ed44c..0ec4a22 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -205,7 +205,7 @@ static boolean r300_reserve_cs_dwords(struct r300_context *r300,
     if (first_draw) {
         cs_dwords += r300_get_num_dirty_dwords(r300);
 
-        if (r300->screen->caps.index_bias_supported)
+        if (r300->screen->caps.is_r500)
             cs_dwords += 2; /* emit_index_offset */
 
         if (emit_vertex_arrays)
@@ -257,7 +257,7 @@ static boolean r300_emit_states(struct r300_context *r300,
         }
 
         r300_emit_dirty_state(r300);
-        if (r300->screen->caps.index_bias_supported) {
+        if (r300->screen->caps.is_r500) {
             if (r300->screen->caps.has_tcl)
                 r500_emit_index_bias(r300, index_bias);
             else
@@ -557,7 +557,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
         OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (count << 16) |
                r300_translate_primitive(mode));
 
-        if (indexBias && !r300->screen->caps.index_bias_supported) {
+        if (indexBias && !r300->screen->caps.is_r500) {
             for (i = 0; i < count-1; i += 2)
                 OUT_CS(((ptr1[i+1] + indexBias) << 16) |
                         (ptr1[i]   + indexBias));
@@ -581,7 +581,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
         OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (count << 16) |
                r300_translate_primitive(mode));
 
-        if (indexBias && !r300->screen->caps.index_bias_supported) {
+        if (indexBias && !r300->screen->caps.is_r500) {
             for (i = 0; i < count-1; i += 2)
                 OUT_CS(((ptr2[i+1] + indexBias) << 16) |
                         (ptr2[i]   + indexBias));
@@ -601,7 +601,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
                R300_VAP_VF_CNTL__INDEX_SIZE_32bit |
                r300_translate_primitive(mode));
 
-        if (indexBias && !r300->screen->caps.index_bias_supported) {
+        if (indexBias && !r300->screen->caps.is_r500) {
             for (i = 0; i < count; i++)
                 OUT_CS(ptr4[i] + indexBias);
         } else {
@@ -620,13 +620,12 @@ static void r300_draw_elements(struct r300_context *r300, int indexBias,
     unsigned indexSize = r300->index_buffer.index_size;
     struct pipe_resource* orgIndexBuffer = indexBuffer;
     boolean alt_num_verts = r300->screen->caps.is_r500 &&
-                            count > 65536 &&
-                            r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0);
+                            count > 65536;
     unsigned short_count;
     int buffer_offset = 0, index_offset = 0; /* for index bias emulation */
     uint16_t indices3[3];
 
-    if (indexBias && !r300->screen->caps.index_bias_supported) {
+    if (indexBias && !r300->screen->caps.is_r500) {
         r300_split_index_bias(r300, indexBias, &buffer_offset, &index_offset);
     }
 
@@ -702,8 +701,7 @@ static void r300_draw_arrays(struct r300_context *r300, unsigned mode,
                              unsigned start, unsigned count)
 {
     boolean alt_num_verts = r300->screen->caps.is_r500 &&
-                            count > 65536 &&
-                            r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0);
+                            count > 65536;
     unsigned short_count;
 
     /* 9 spare dwords for emit_draw_arrays. Give up if the function fails. */
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index 77a9c6a..52d0247 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -456,10 +456,6 @@ struct pipe_screen* r300_screen_create(struct r300_winsys_screen *rws)
     if (SCREEN_DBG_ON(r300screen, DBG_NO_HIZ))
         r300screen->caps.hiz_ram = 0;
 
-    r300screen->caps.index_bias_supported =
-            r300screen->caps.is_r500 &&
-            rws->get_value(rws, R300_VID_DRM_2_3_0);
-
     pipe_mutex_init(r300screen->num_contexts_mutex);
 
     util_slab_create(&r300screen->pool_buffers,
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index be22215..b810f40 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -804,27 +804,25 @@ r300_set_framebuffer_state(struct pipe_context* pipe,
     }
 
     /* Set up AA config. */
-    if (r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0)) {
-        if (state->nr_cbufs && state->cbufs[0]->texture->nr_samples > 1) {
-            aa->aa_config = R300_GB_AA_CONFIG_AA_ENABLE;
-
-            switch (state->cbufs[0]->texture->nr_samples) {
-                case 2:
-                    aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_2;
-                    break;
-                case 3:
-                    aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_3;
-                    break;
-                case 4:
-                    aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_4;
-                    break;
-                case 6:
-                    aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_6;
-                    break;
-            }
-        } else {
-            aa->aa_config = 0;
+    if (state->nr_cbufs && state->cbufs[0]->texture->nr_samples > 1) {
+        aa->aa_config = R300_GB_AA_CONFIG_AA_ENABLE;
+
+        switch (state->cbufs[0]->texture->nr_samples) {
+        case 2:
+            aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_2;
+            break;
+        case 3:
+            aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_3;
+            break;
+        case 4:
+            aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_4;
+            break;
+        case 6:
+            aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_6;
+            break;
         }
+    } else {
+        aa->aa_config = 0;
     }
 
     if (DBG_ON(r300, DBG_FB)) {
diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index da06847..86ad0b8 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -867,8 +867,7 @@ struct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen,
                 break;
 
             case 2:
-                if (rws->get_value(rws, R300_VID_DRM_2_1_0))
-                    microtile = R300_BUFFER_SQUARETILED;
+                microtile = R300_BUFFER_SQUARETILED;
                 break;
         }
     }
diff --git a/src/gallium/drivers/r300/r300_texture_desc.c b/src/gallium/drivers/r300/r300_texture_desc.c
index 9dcdf15..3846fb8 100644
--- a/src/gallium/drivers/r300/r300_texture_desc.c
+++ b/src/gallium/drivers/r300/r300_texture_desc.c
@@ -207,29 +207,6 @@ static unsigned r300_texture_get_nblocksy(struct r300_resource *tex,
     return util_format_get_nblocksy(tex->b.b.b.format, height);
 }
 
-static void r300_texture_3d_fix_mipmapping(struct r300_screen *screen,
-                                           struct r300_resource *tex)
-{
-    /* The kernels <= 2.6.34-rc4 compute the size of mipmapped 3D textures
-     * incorrectly. This is a workaround to prevent CS from being rejected. */
-
-    unsigned i, size;
-
-    if (!screen->rws->get_value(screen->rws, R300_VID_DRM_2_3_0) &&
-        tex->b.b.b.target == PIPE_TEXTURE_3D &&
-        tex->b.b.b.last_level > 0) {
-        size = 0;
-
-        for (i = 0; i <= tex->b.b.b.last_level; i++) {
-            size += tex->tex.stride_in_bytes[i] *
-                    r300_texture_get_nblocksy(tex, i, FALSE);
-        }
-
-        size *= tex->tex.depth0;
-        tex->tex.size_in_bytes = size;
-    }
-}
-
 /* Get a width in pixels from a stride in bytes. */
 static unsigned stride_to_width(enum pipe_format format,
                                 unsigned stride_in_bytes)
@@ -442,7 +419,6 @@ static void r300_setup_hyperz_properties(struct r300_screen *screen,
 static void r300_setup_tiling(struct r300_screen *screen,
                               struct r300_resource *tex)
 {
-    struct r300_winsys_screen *rws = screen->rws;
     enum pipe_format format = tex->b.b.b.format;
     boolean rv350_mode = screen->caps.family >= CHIP_FAMILY_R350;
     boolean is_zb = util_format_is_depth_or_stencil(format);
@@ -469,9 +445,7 @@ static void r300_setup_tiling(struct r300_screen *screen,
             break;
 
         case 2:
-            if (rws->get_value(rws, R300_VID_DRM_2_1_0)) {
-                tex->tex.microtile = R300_BUFFER_SQUARETILED;
-            }
+            tex->tex.microtile = R300_BUFFER_SQUARETILED;
             break;
     }
 
@@ -541,7 +515,6 @@ boolean r300_texture_desc_init(struct r300_screen *rscreen,
         r300_setup_miptree(rscreen, tex, FALSE);
     }
 
-    r300_texture_3d_fix_mipmapping(rscreen, tex);
     r300_setup_hyperz_properties(rscreen, tex);
 
     if (tex->buf_size) {
diff --git a/src/gallium/drivers/r300/r300_winsys.h b/src/gallium/drivers/r300/r300_winsys.h
index ced7bb5..c0b6689 100644
--- a/src/gallium/drivers/r300/r300_winsys.h
+++ b/src/gallium/drivers/r300/r300_winsys.h
@@ -60,8 +60,6 @@ enum r300_value_id {
     R300_VID_DRM_PATCHLEVEL,
 
     /* These should probably go away: */
-    R300_VID_DRM_2_1_0,  /* Square tiling. */
-    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, CMask, R16F/RG16F */
 
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_common.c b/src/gallium/winsys/radeon/drm/radeon_drm_common.c
index c0044d3..72c2ff1 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_common.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_common.c
@@ -96,10 +96,13 @@ static void do_ioctls(struct radeon_drm_winsys *winsys)
      * we don't actually use the info for anything yet. */
 
     version = drmGetVersion(winsys->fd);
-    if (version->version_major != 2) {
+    if (version->version_major != 2 ||
+        version->version_minor < 3) {
         fprintf(stderr, "%s: DRM version is %d.%d.%d but this driver is "
-                "only compatible with 2.x.x\n", __FUNCTION__,
-                version->version_major, version->version_minor,
+                "only compatible with 2.3.x (kernel 2.6.34) and later.\n",
+                __FUNCTION__,
+                version->version_major,
+                version->version_minor,
                 version->version_patchlevel);
         drmFreeVersion(version);
         exit(1);
@@ -192,10 +195,6 @@ static uint32_t radeon_get_value(struct r300_winsys_screen *rws,
         return ws->drm_minor;
     case R300_VID_DRM_PATCHLEVEL:
         return ws->drm_patchlevel;
-    case R300_VID_DRM_2_1_0:
-        return ws->drm_major*100 + ws->drm_minor >= 201;
-    case R300_VID_DRM_2_3_0:
-        return ws->drm_major*100 + ws->drm_minor >= 203;
     case R300_VID_DRM_2_6_0:
         return ws->drm_major*100 + ws->drm_minor >= 206;
     case R300_VID_DRM_2_8_0:




More information about the mesa-commit mailing list