Mesa (master): r300g: Moar MSAA setup.

Corbin Simpson csimpson at kemper.freedesktop.org
Wed Jun 16 11:02:12 PDT 2010


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

Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date:   Tue May 25 22:33:21 2010 -0700

r300g: Moar MSAA setup.

Need to just add the resolve, then go switch to new DRM and test.

---

 src/gallium/drivers/r300/r300_emit.c    |   54 ++++++++++++++++++++++++++----
 src/gallium/drivers/r300/r300_screen.c  |   13 ++++++-
 src/gallium/drivers/r300/r300_state.c   |    3 +-
 src/gallium/drivers/r300/r300_texture.c |    4 ++
 4 files changed, 63 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c
index aae2e49..251e170 100644
--- a/src/gallium/drivers/r300/r300_emit.c
+++ b/src/gallium/drivers/r300/r300_emit.c
@@ -475,22 +475,60 @@ void r300_emit_query_end(struct r300_context* r300)
 
 void r300_emit_rs_state(struct r300_context* r300, unsigned size, void* state)
 {
-    struct r300_rs_state* rs = (struct r300_rs_state*)state;
+    struct r300_rs_state* rs = state;
+    struct pipe_framebuffer_state* fb = r300->fb_state.state;
     float scale, offset;
+    unsigned mspos0, mspos1, aa_config;
     CS_LOCALS(r300);
 
     BEGIN_CS(size);
     OUT_CS_REG(R300_VAP_CNTL_STATUS, rs->vap_control_status);
 
-    OUT_CS_REG(R300_GB_AA_CONFIG, rs->antialiasing_config);
-
-    OUT_CS_REG(R300_VAP_CNTL_STATUS, rs->vap_control_status);
+    /* Multisampling. Depends on framebuffer sample count. */
     if (r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0)) {
-        OUT_CS_REG_SEQ(R300_GB_MSPOS0, 2);
-        OUT_CS(rs->multisample_position_0);
-        OUT_CS(rs->multisample_position_1);
+        if (fb->nr_cbufs && fb->cbufs[0]->texture->nr_samples > 1) {
+            aa_config = R300_GB_AA_CONFIG_AA_ENABLE;
+            /* Subsample placement. These may not be optimal. */
+            switch (fb->cbufs[0]->texture->nr_samples) {
+                case 2:
+                    aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_2;
+                    mspos0 = 0x33996633;
+                    mspos1 = 0x6666663;
+                    break;
+                case 3:
+                    aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_3;
+                    mspos0 = 0x33936933;
+                    mspos1 = 0x6666663;
+                    break;
+                case 4:
+                    aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_4;
+                    mspos0 = 0x33939933;
+                    mspos1 = 0x3966663;
+                    break;
+                case 6:
+                    aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_6;
+                    mspos0 = 0x22a2aa22;
+                    mspos1 = 0x2a65672;
+                    break;
+                default:
+                    debug_printf("r300: Bad number of multisamples!\n");
+                    break;
+            }
+
+            OUT_CS_REG_SEQ(R300_GB_MSPOS0, 2);
+            OUT_CS(mspos0);
+            OUT_CS(mspos1);
+
+            OUT_CS_REG(R300_GB_AA_CONFIG, aa_config);
+        } else {
+            OUT_CS_REG_SEQ(R300_GB_MSPOS0, 2);
+            OUT_CS(rs->multisample_position_0);
+            OUT_CS(rs->multisample_position_1);
+
+            OUT_CS_REG(R300_GB_AA_CONFIG, rs->antialiasing_config);
+        }
     }
-    OUT_CS_REG(R300_GB_AA_CONFIG, rs->antialiasing_config);
+
     OUT_CS_REG(R300_GA_POINT_SIZE, rs->point_size);
     OUT_CS_REG_SEQ(R300_GA_POINT_MINMAX, 2);
     OUT_CS(rs->point_minmax);
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index f0c562b..c599f76 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -275,8 +275,17 @@ static boolean r300_is_format_supported(struct pipe_screen* screen,
         return FALSE;
     }
 
-   if (sample_count > 1)
-      return FALSE;
+    switch (sample_count) {
+        case 0:
+        case 1:
+        case 2:
+        case 3:
+        case 4:
+        case 6:
+            break;
+        default:
+            return FALSE;
+    }
 
     /* Check sampler format support. */
     if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 815f969..651ad7d 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -984,7 +984,8 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state)
     }
 
     UPDATE_STATE(state, r300->rs_state);
-    r300->rs_state.size = 31 + (r300->polygon_offset_enabled ? 5 : 0);
+    r300->rs_state.size = 25 + (r300->polygon_offset_enabled ? 5 : 0 +
+        r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0) ? 6 : 0);
 
     if (last_sprite_coord_enable != r300->sprite_coord_enable ||
         last_two_sided_color != r300->two_sided_color) {
diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index 5d8bcff..f41c530 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -802,6 +802,10 @@ static void r300_setup_miptree(struct r300_screen* screen,
         nblocksy = r300_texture_get_nblocksy(tex, i);
         layer_size = stride * nblocksy;
 
+        if (base->nr_samples) {
+            layer_size *= base->nr_samples;
+        }
+
         if (base->target == PIPE_TEXTURE_CUBE)
             size = layer_size * 6;
         else



More information about the mesa-commit mailing list