r300g: don't set sample positions to the pixel center if MSAA is disabled
authorMarek Olšák <maraeo@gmail.com>
Thu, 10 Jan 2013 14:23:56 +0000 (15:23 +0100)
committerMarek Olšák <maraeo@gmail.com>
Thu, 10 Jan 2013 14:37:10 +0000 (15:37 +0100)
but an MSAA resource is bound. This effectively makes the MSAA disable switch
not affect rasterization, but it still affects the alpha-to-one and
alpha-to-coverage states. This hardware just lacks a proper MSAA disable
switch.

This fixes graphics corruption in sauerbraten.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=59194

src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_state.c
src/gallium/drivers/r300/r300_texture.c

index 825038a9dc96b17e359f35f46fc92db21d8ad36c..cb6c46e5e6c20a54a0755402097b737f3eb1b5bb 100644 (file)
@@ -566,7 +566,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_samples, num_cbufs = fb->nr_cbufs;
+    unsigned i, num_cbufs = fb->nr_cbufs;
     unsigned mspos0, mspos1;
     CS_LOCALS(r300);
 
@@ -593,14 +593,10 @@ void r300_emit_fb_state_pipelined(struct r300_context *r300,
         OUT_CS(R300_US_OUT_FMT_UNUSED);
     }
 
-    /* Multisampling. Depends on framebuffer sample count.
-     * These are pipelined regs and as such cannot be moved
-     * to the AA state.
+    /* Set sample positions. It depends on the framebuffer sample count.
+     * These are pipelined regs and as such cannot be moved to the AA state.
      */
-    num_samples = r300->msaa_enable ? r300->num_samples : 1;
-
-    /* Sample positions. */
-    switch (num_samples) {
+    switch (r300->num_samples) {
     default:
         mspos0 = r300_get_mspos(0, sample_locs_1x);
         mspos1 = r300_get_mspos(1, sample_locs_1x);
index 1e7cff91f9a56f29659fb34451323a35167e2de2..4a5a5a89b8471ed1e8e38de358fb68e357591ada 100644 (file)
@@ -1309,8 +1309,6 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state)
     }
 
     if (last_msaa_enable != r300->msaa_enable) {
-        r300_mark_atom_dirty(r300, &r300->fb_state_pipelined);
-
         if (r300->alpha_to_coverage) {
             r300_mark_atom_dirty(r300, &r300->dsa_state);
         }
index 4eb9a230790725e1c268b8c058c6281acfd7f61f..4be6d5067d218054c6210102766f0431301092ff 100644 (file)
@@ -1002,7 +1002,7 @@ r300_texture_create_object(struct r300_screen *rscreen,
     }
 
     if (SCREEN_DBG_ON(rscreen, DBG_MSAA) && base->nr_samples > 1) {
-        fprintf(stderr, "r300: %i MSAA %s buffer created\n",
+        fprintf(stderr, "r300: %ix MSAA %s buffer created\n",
                 base->nr_samples,
                 util_format_is_depth_or_stencil(base->format) ? "depth" : "color");
     }