radeonsi: explicitly choose center locations for 1xAA on Polaris
[mesa.git] / src / gallium / drivers / radeon / cayman_msaa.c
index 81f41127af6a0f1e817b6c4303a6b009d5cb3f5e..33f1040185a8712168a525a995e7b28581c791bb 100644 (file)
 #include "r600_cs.h"
 
 /* 2xMSAA
- * There are two locations (-4, 4), (4, -4). */
+ * There are two locations (4, 4), (-4, -4). */
 const uint32_t eg_sample_locs_2x[4] = {
-       FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
-       FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
-       FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
-       FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
+       FILL_SREG(4, 4, -4, -4, 4, 4, -4, -4),
+       FILL_SREG(4, 4, -4, -4, 4, 4, -4, -4),
+       FILL_SREG(4, 4, -4, -4, 4, 4, -4, -4),
+       FILL_SREG(4, 4, -4, -4, 4, 4, -4, -4),
 };
 const unsigned eg_max_dist_2x = 4;
 /* 4xMSAA
- * There are 4 locations: (-2, -2), (2, 2), (-6, 6), (6, -6). */
+ * There are 4 locations: (-2, 6), (6, -2), (-6, 2), (2, 6). */
 const uint32_t eg_sample_locs_4x[4] = {
-       FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
-       FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
-       FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
-       FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
+       FILL_SREG(-2, -6, 6, -2, -6, 2, 2, 6),
+       FILL_SREG(-2, -6, 6, -2, -6, 2, 2, 6),
+       FILL_SREG(-2, -6, 6, -2, -6, 2, 2, 6),
+       FILL_SREG(-2, -6, 6, -2, -6, 2, 2, 6),
 };
 const unsigned eg_max_dist_4x = 6;
 
 /* Cayman 8xMSAA */
 static const uint32_t cm_sample_locs_8x[] = {
-       FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
-       FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
-       FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
-       FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
-       FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
-       FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
-       FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
-       FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
+       FILL_SREG( 1, -3, -1,  3, 5,  1, -3, -5),
+       FILL_SREG( 1, -3, -1,  3, 5,  1, -3, -5),
+       FILL_SREG( 1, -3, -1,  3, 5,  1, -3, -5),
+       FILL_SREG( 1, -3, -1,  3, 5,  1, -3, -5),
+       FILL_SREG(-5,  5, -7, -1, 3,  7,  7, -7),
+       FILL_SREG(-5,  5, -7, -1, 3,  7,  7, -7),
+       FILL_SREG(-5,  5, -7, -1, 3,  7,  7, -7),
+       FILL_SREG(-5,  5, -7, -1, 3,  7,  7, -7),
 };
 static const unsigned cm_max_dist_8x = 8;
 /* Cayman 16xMSAA */
 static const uint32_t cm_sample_locs_16x[] = {
-       FILL_SREG(-7, -3, 7, 3, 1, -5, -5, 5),
-       FILL_SREG(-7, -3, 7, 3, 1, -5, -5, 5),
-       FILL_SREG(-7, -3, 7, 3, 1, -5, -5, 5),
-       FILL_SREG(-7, -3, 7, 3, 1, -5, -5, 5),
-       FILL_SREG(-3, -7, 3, 7, 5, -1, -1, 1),
-       FILL_SREG(-3, -7, 3, 7, 5, -1, -1, 1),
-       FILL_SREG(-3, -7, 3, 7, 5, -1, -1, 1),
-       FILL_SREG(-3, -7, 3, 7, 5, -1, -1, 1),
-       FILL_SREG(-8, -6, 4, 2, 2, -8, -2, 6),
-       FILL_SREG(-8, -6, 4, 2, 2, -8, -2, 6),
-       FILL_SREG(-8, -6, 4, 2, 2, -8, -2, 6),
-       FILL_SREG(-8, -6, 4, 2, 2, -8, -2, 6),
-       FILL_SREG(-4, -2, 0, 4, 6, -4, -6, 0),
-       FILL_SREG(-4, -2, 0, 4, 6, -4, -6, 0),
-       FILL_SREG(-4, -2, 0, 4, 6, -4, -6, 0),
-       FILL_SREG(-4, -2, 0, 4, 6, -4, -6, 0),
+       FILL_SREG( 1,  1, -1, -3, -3,  2,  4, -1),
+       FILL_SREG( 1,  1, -1, -3, -3,  2,  4, -1),
+       FILL_SREG( 1,  1, -1, -3, -3,  2,  4, -1),
+       FILL_SREG( 1,  1, -1, -3, -3,  2,  4, -1),
+       FILL_SREG(-5, -2,  2,  5,  5,  3,  3, -5),
+       FILL_SREG(-5, -2,  2,  5,  5,  3,  3, -5),
+       FILL_SREG(-5, -2,  2,  5,  5,  3,  3, -5),
+       FILL_SREG(-5, -2,  2,  5,  5,  3,  3, -5),
+       FILL_SREG(-2,  6,  0, -7, -4, -6, -6,  4),
+       FILL_SREG(-2,  6,  0, -7, -4, -6, -6,  4),
+       FILL_SREG(-2,  6,  0, -7, -4, -6, -6,  4),
+       FILL_SREG(-2,  6,  0, -7, -4, -6, -6,  4),
+       FILL_SREG(-8,  0,  7, -4,  6,  7, -7, -8),
+       FILL_SREG(-8,  0,  7, -4,  6,  7, -7, -8),
+       FILL_SREG(-8,  0,  7, -4,  6,  7, -7, -8),
+       FILL_SREG(-8,  0,  7, -4,  6,  7, -7, -8),
 };
 static const unsigned cm_max_dist_16x = 8;
 
@@ -143,6 +143,13 @@ void cayman_init_msaa(struct pipe_context *ctx)
 void cayman_emit_msaa_sample_locs(struct radeon_winsys_cs *cs, int nr_samples)
 {
        switch (nr_samples) {
+       default:
+       case 1:
+               radeon_set_context_reg(cs, CM_R_028BF8_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0, 0);
+               radeon_set_context_reg(cs, CM_R_028C08_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0, 0);
+               radeon_set_context_reg(cs, CM_R_028C18_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0, 0);
+               radeon_set_context_reg(cs, CM_R_028C28_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_0, 0);
+               break;
        case 2:
                radeon_set_context_reg(cs, CM_R_028BF8_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0, eg_sample_locs_2x[0]);
                radeon_set_context_reg(cs, CM_R_028C08_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0, eg_sample_locs_2x[1]);
@@ -195,10 +202,19 @@ void cayman_emit_msaa_sample_locs(struct radeon_winsys_cs *cs, int nr_samples)
 }
 
 void cayman_emit_msaa_config(struct radeon_winsys_cs *cs, int nr_samples,
-                            int ps_iter_samples, int overrast_samples)
+                            int ps_iter_samples, int overrast_samples,
+                            unsigned sc_mode_cntl_1)
 {
        int setup_samples = nr_samples > 1 ? nr_samples :
                            overrast_samples > 1 ? overrast_samples : 0;
+       /* Required by OpenGL line rasterization.
+        *
+        * TODO: We should also enable perpendicular endcaps for AA lines,
+        *       but that requires implementing line stippling in the pixel
+        *       shader. SC can only do line stippling with axis-aligned
+        *       endcaps.
+        */
+       unsigned sc_line_cntl = S_028BDC_DX10_DIAMOND_TEST_ENA(1);
 
        if (setup_samples > 1) {
                /* indexed by log2(nr_samples) */
@@ -214,7 +230,7 @@ void cayman_emit_msaa_config(struct radeon_winsys_cs *cs, int nr_samples,
                        util_logbase2(util_next_power_of_two(ps_iter_samples));
 
                radeon_set_context_reg_seq(cs, CM_R_028BDC_PA_SC_LINE_CNTL, 2);
-               radeon_emit(cs, S_028BDC_LAST_PIXEL(1) |
+               radeon_emit(cs, sc_line_cntl |
                            S_028BDC_EXPAND_LINE_WIDTH(1)); /* CM_R_028BDC_PA_SC_LINE_CNTL */
                radeon_emit(cs, S_028BE0_MSAA_NUM_SAMPLES(log_samples) |
                            S_028BE0_MAX_SAMPLE_DIST(max_dist[log_samples]) |
@@ -230,27 +246,24 @@ void cayman_emit_msaa_config(struct radeon_winsys_cs *cs, int nr_samples,
                                               S_028804_STATIC_ANCHOR_ASSOCIATIONS(1));
                        radeon_set_context_reg(cs, EG_R_028A4C_PA_SC_MODE_CNTL_1,
                                               EG_S_028A4C_PS_ITER_SAMPLE(ps_iter_samples > 1) |
-                                              EG_S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1) |
-                                              EG_S_028A4C_FORCE_EOV_REZ_ENABLE(1));
+                                              sc_mode_cntl_1);
                } else if (overrast_samples > 1) {
                        radeon_set_context_reg(cs, CM_R_028804_DB_EQAA,
                                               S_028804_HIGH_QUALITY_INTERSECTIONS(1) |
                                               S_028804_STATIC_ANCHOR_ASSOCIATIONS(1) |
                                               S_028804_OVERRASTERIZATION_AMOUNT(log_samples));
                        radeon_set_context_reg(cs, EG_R_028A4C_PA_SC_MODE_CNTL_1,
-                                              EG_S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1) |
-                                              EG_S_028A4C_FORCE_EOV_REZ_ENABLE(1));
+                                              sc_mode_cntl_1);
                }
        } else {
                radeon_set_context_reg_seq(cs, CM_R_028BDC_PA_SC_LINE_CNTL, 2);
-               radeon_emit(cs, S_028BDC_LAST_PIXEL(1)); /* CM_R_028BDC_PA_SC_LINE_CNTL */
+               radeon_emit(cs, sc_line_cntl); /* CM_R_028BDC_PA_SC_LINE_CNTL */
                radeon_emit(cs, 0); /* CM_R_028BE0_PA_SC_AA_CONFIG */
 
                radeon_set_context_reg(cs, CM_R_028804_DB_EQAA,
                                       S_028804_HIGH_QUALITY_INTERSECTIONS(1) |
                                       S_028804_STATIC_ANCHOR_ASSOCIATIONS(1));
                radeon_set_context_reg(cs, EG_R_028A4C_PA_SC_MODE_CNTL_1,
-                                      EG_S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1) |
-                                      EG_S_028A4C_FORCE_EOV_REZ_ENABLE(1));
+                                      sc_mode_cntl_1);
        }
 }