radeon: split cayman_emit_msaa_state into 2 functions
authorMarek Olšák <marek.olsak@amd.com>
Tue, 6 May 2014 11:25:50 +0000 (13:25 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 2 Jun 2014 10:58:22 +0000 (12:58 +0200)
The other function will be split up from the framebuffer state.

src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/radeon/cayman_msaa.c
src/gallium/drivers/radeon/r600_pipe_common.h
src/gallium/drivers/radeonsi/si_state.c

index cd7fb1eeb6eafa643dbe62c5747bea7487c229be..dbdd6ab16f9ae561e5170f5ff7a41504ddf3a725 100644 (file)
@@ -1678,7 +1678,8 @@ static void evergreen_emit_framebuffer_state(struct r600_context *rctx, struct r
        if (rctx->b.chip_class == EVERGREEN) {
                evergreen_emit_msaa_state(rctx, rctx->framebuffer.nr_samples);
        } else {
-               cayman_emit_msaa_state(cs, rctx->framebuffer.nr_samples);
+               cayman_emit_msaa_sample_locs(cs, rctx->framebuffer.nr_samples);
+               cayman_emit_msaa_config(cs, rctx->framebuffer.nr_samples);
        }
 }
 
index 9e6ceda545774514ee0fb6d56cb5544b499eb1b4..fa7deb60a4eb44324c604c24c2c428a7cedd1cb8 100644 (file)
@@ -123,27 +123,20 @@ void cayman_get_sample_position(struct pipe_context *ctx, unsigned sample_count,
        }
 }
 
-void cayman_emit_msaa_state(struct radeon_winsys_cs *cs, int nr_samples)
+void cayman_emit_msaa_sample_locs(struct radeon_winsys_cs *cs, int nr_samples)
 {
-       unsigned max_dist = 0;
-
        switch (nr_samples) {
-       default:
-               nr_samples = 0;
-               break;
        case 2:
                r600_write_context_reg(cs, CM_R_028BF8_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0, eg_sample_locs_2x[0]);
                r600_write_context_reg(cs, CM_R_028C08_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0, eg_sample_locs_2x[1]);
                r600_write_context_reg(cs, CM_R_028C18_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0, eg_sample_locs_2x[2]);
                r600_write_context_reg(cs, CM_R_028C28_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_0, eg_sample_locs_2x[3]);
-               max_dist = eg_max_dist_2x;
                break;
        case 4:
                r600_write_context_reg(cs, CM_R_028BF8_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0, eg_sample_locs_4x[0]);
                r600_write_context_reg(cs, CM_R_028C08_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0, eg_sample_locs_4x[1]);
                r600_write_context_reg(cs, CM_R_028C18_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0, eg_sample_locs_4x[2]);
                r600_write_context_reg(cs, CM_R_028C28_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_0, eg_sample_locs_4x[3]);
-               max_dist = eg_max_dist_4x;
                break;
        case 8:
                r600_write_context_reg_seq(cs, CM_R_028BF8_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0, 14);
@@ -161,7 +154,6 @@ void cayman_emit_msaa_state(struct radeon_winsys_cs *cs, int nr_samples)
                radeon_emit(cs, 0);
                radeon_emit(cs, cm_sample_locs_8x[3]);
                radeon_emit(cs, cm_sample_locs_8x[7]);
-               max_dist = cm_max_dist_8x;
                break;
        case 16:
                r600_write_context_reg_seq(cs, CM_R_028BF8_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0, 16);
@@ -181,18 +173,30 @@ void cayman_emit_msaa_state(struct radeon_winsys_cs *cs, int nr_samples)
                radeon_emit(cs, cm_sample_locs_16x[7]);
                radeon_emit(cs, cm_sample_locs_16x[11]);
                radeon_emit(cs, cm_sample_locs_16x[15]);
-               max_dist = cm_max_dist_16x;
                break;
        }
+}
 
+void cayman_emit_msaa_config(struct radeon_winsys_cs *cs, int nr_samples,
+                            int ps_iter_samples)
+{
        if (nr_samples > 1) {
+               /* indexed by log2(nr_samples) */
+               unsigned max_dist[] = {
+                       0,
+                       eg_max_dist_2x,
+                       eg_max_dist_4x,
+                       cm_max_dist_8x,
+                       cm_max_dist_16x
+               };
+
                unsigned log_samples = util_logbase2(nr_samples);
 
                r600_write_context_reg_seq(cs, CM_R_028BDC_PA_SC_LINE_CNTL, 2);
                radeon_emit(cs, S_028BDC_LAST_PIXEL(1) |
                            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) |
+                           S_028BE0_MAX_SAMPLE_DIST(max_dist[log_samples]) |
                            S_028BE0_MSAA_EXPOSED_SAMPLES(log_samples)); /* CM_R_028BE0_PA_SC_AA_CONFIG */
 
                r600_write_context_reg(cs, CM_R_028804_DB_EQAA,
index bbfcdf95709a6733f63a43da7f30cba7cf464702..b7e4e65cf110a2f7c681f2fd0576286f135fea0c 100644 (file)
@@ -472,7 +472,9 @@ extern const uint32_t eg_sample_locs_4x[4];
 extern const unsigned eg_max_dist_4x;
 void cayman_get_sample_position(struct pipe_context *ctx, unsigned sample_count,
                                unsigned sample_index, float *out_value);
-void cayman_emit_msaa_state(struct radeon_winsys_cs *cs, int nr_samples);
+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);
 
 
 /* Inline helpers. */
index e3b72c25c31847a5a8da0b48f5f49155a3ec1163..e9fa4332fb0a7220511865423a9e6706a63aa09a 100644 (file)
@@ -2025,7 +2025,8 @@ static void si_emit_framebuffer_state(struct si_context *sctx, struct r600_atom
        r600_write_context_reg(cs, R_028208_PA_SC_WINDOW_SCISSOR_BR,
                               S_028208_BR_X(state->width) | S_028208_BR_Y(state->height));
 
-       cayman_emit_msaa_state(cs, sctx->framebuffer.nr_samples);
+       cayman_emit_msaa_sample_locs(cs, sctx->framebuffer.nr_samples);
+       cayman_emit_msaa_config(cs, sctx->framebuffer.nr_samples);
 }
 
 /*