From: Marek Olšák <marek.ol...@amd.com>

We'll modify the quant mode there, which also affects the guarband
computation.
---
 src/gallium/drivers/radeonsi/si_gfx_cs.c         | 1 +
 src/gallium/drivers/radeonsi/si_state.c          | 8 +++-----
 src/gallium/drivers/radeonsi/si_state.h          | 2 ++
 src/gallium/drivers/radeonsi/si_state_viewport.c | 6 +++++-
 4 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_gfx_cs.c 
b/src/gallium/drivers/radeonsi/si_gfx_cs.c
index c458b68d846..60db3a6b96f 100644
--- a/src/gallium/drivers/radeonsi/si_gfx_cs.c
+++ b/src/gallium/drivers/radeonsi/si_gfx_cs.c
@@ -343,20 +343,21 @@ void si_begin_new_gfx_cs(struct si_context *ctx)
                
ctx->tracked_regs.reg_value[SI_TRACKED_PA_SU_SMALL_PRIM_FILTER_CNTL] = 
0x00000000;
                ctx->tracked_regs.reg_value[SI_TRACKED_PA_CL_VS_OUT_CNTL] = 
0x00000000;
                ctx->tracked_regs.reg_value[SI_TRACKED_PA_CL_CLIP_CNTL] = 
0x00090000;
                ctx->tracked_regs.reg_value[SI_TRACKED_PA_SC_BINNER_CNTL_0] = 
0x00000003;
                ctx->tracked_regs.reg_value[SI_TRACKED_DB_DFSM_CONTROL] = 
0x00000000;
                ctx->tracked_regs.reg_value[SI_TRACKED_PA_CL_GB_VERT_CLIP_ADJ]  
= 0x3f800000;
                ctx->tracked_regs.reg_value[SI_TRACKED_PA_CL_GB_VERT_DISC_ADJ]  
= 0x3f800000;
                ctx->tracked_regs.reg_value[SI_TRACKED_PA_CL_GB_HORZ_CLIP_ADJ]  
= 0x3f800000;
                ctx->tracked_regs.reg_value[SI_TRACKED_PA_CL_GB_HORZ_DISC_ADJ]  
= 0x3f800000;
                
ctx->tracked_regs.reg_value[SI_TRACKED_PA_SU_HARDWARE_SCREEN_OFFSET] = 0;
+               ctx->tracked_regs.reg_value[SI_TRACKED_PA_SU_VTX_CNTL] = 
0x00000005;
                ctx->tracked_regs.reg_value[SI_TRACKED_PA_SC_CLIPRECT_RULE]     
= 0xffff;
 
                /* Set all saved registers state to saved. */
                ctx->tracked_regs.reg_saved = 0xffffffff;
        } else {
                /* Set all saved registers state to unknown. */
                ctx->tracked_regs.reg_saved = 0;
        }
 
        /* 0xffffffff is a impossible value to register SPI_PS_INPUT_CNTL_n */
diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index f4fc4fd69da..af1b9f0acc8 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -846,20 +846,21 @@ static void *si_create_rs_state(struct pipe_context *ctx,
        if (!rs) {
                return NULL;
        }
 
        rs->scissor_enable = state->scissor;
        rs->clip_halfz = state->clip_halfz;
        rs->two_side = state->light_twoside;
        rs->multisample_enable = state->multisample;
        rs->force_persample_interp = state->force_persample_interp;
        rs->clip_plane_enable = state->clip_plane_enable;
+       rs->half_pixel_center = state->half_pixel_center;
        rs->line_stipple_enable = state->line_stipple_enable;
        rs->poly_stipple_enable = state->poly_stipple_enable;
        rs->line_smooth = state->line_smooth;
        rs->line_width = state->line_width;
        rs->poly_smooth = state->poly_smooth;
        rs->uses_poly_offset = state->offset_point || state->offset_line ||
                               state->offset_tri;
        rs->clamp_fragment_color = state->clamp_fragment_color;
        rs->clamp_vertex_color = state->clamp_vertex_color;
        rs->flatshade = state->flatshade;
@@ -906,24 +907,20 @@ static void *si_create_rs_state(struct pipe_context *ctx,
        si_pm4_set_reg(pm4, R_028A08_PA_SU_LINE_CNTL,
                       S_028A08_WIDTH(si_pack_float_12p4(state->line_width/2)));
        si_pm4_set_reg(pm4, R_028A48_PA_SC_MODE_CNTL_0,
                       S_028A48_LINE_STIPPLE_ENABLE(state->line_stipple_enable) 
|
                       S_028A48_MSAA_ENABLE(state->multisample ||
                                            state->poly_smooth ||
                                            state->line_smooth) |
                       S_028A48_VPORT_SCISSOR_ENABLE(1) |
                       S_028A48_ALTERNATE_RBS_PER_TILE(sscreen->info.chip_class 
>= GFX9));
 
-       si_pm4_set_reg(pm4, R_028BE4_PA_SU_VTX_CNTL,
-                      S_028BE4_PIX_CENTER(state->half_pixel_center) |
-                      
S_028BE4_QUANT_MODE(V_028BE4_X_16_8_FIXED_POINT_1_256TH));
-
        si_pm4_set_reg(pm4, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, 
fui(state->offset_clamp));
        si_pm4_set_reg(pm4, R_028814_PA_SU_SC_MODE_CNTL,
                S_028814_PROVOKING_VTX_LAST(!state->flatshade_first) |
                S_028814_CULL_FRONT((state->cull_face & PIPE_FACE_FRONT) ? 1 : 
0) |
                S_028814_CULL_BACK((state->cull_face & PIPE_FACE_BACK) ? 1 : 0) 
|
                S_028814_FACE(!state->front_ccw) |
                S_028814_POLY_OFFSET_FRONT_ENABLE(util_get_offset(state, 
state->fill_front)) |
                S_028814_POLY_OFFSET_BACK_ENABLE(util_get_offset(state, 
state->fill_back)) |
                S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_point || 
state->offset_line) |
                S_028814_POLY_MODE(state->fill_front != PIPE_POLYGON_MODE_FILL 
||
@@ -1008,21 +1005,22 @@ static void si_bind_rs_state(struct pipe_context *ctx, 
void *state)
        si_update_poly_offset_state(sctx);
 
        if (!old_rs ||
            old_rs->scissor_enable != rs->scissor_enable) {
                sctx->scissors.dirty_mask = (1 << SI_MAX_VIEWPORTS) - 1;
                si_mark_atom_dirty(sctx, &sctx->atoms.s.scissors);
        }
 
        if (!old_rs ||
            old_rs->line_width != rs->line_width ||
-           old_rs->max_point_size != rs->max_point_size)
+           old_rs->max_point_size != rs->max_point_size ||
+           old_rs->half_pixel_center != rs->half_pixel_center)
                si_mark_atom_dirty(sctx, &sctx->atoms.s.guardband);
 
        if (!old_rs ||
            old_rs->clip_halfz != rs->clip_halfz) {
                sctx->viewports.depth_range_dirty_mask = (1 << 
SI_MAX_VIEWPORTS) - 1;
                si_mark_atom_dirty(sctx, &sctx->atoms.s.viewports);
        }
 
        if (!old_rs ||
            old_rs->clip_plane_enable != rs->clip_plane_enable ||
diff --git a/src/gallium/drivers/radeonsi/si_state.h 
b/src/gallium/drivers/radeonsi/si_state.h
index 1c347cf7e00..fa5e7013a36 100644
--- a/src/gallium/drivers/radeonsi/si_state.h
+++ b/src/gallium/drivers/radeonsi/si_state.h
@@ -71,20 +71,21 @@ struct si_state_blend {
 struct si_state_rasterizer {
        struct si_pm4_state     pm4;
        /* poly offset states for 16-bit, 24-bit, and 32-bit zbuffers */
        struct si_pm4_state     *pm4_poly_offset;
        unsigned                pa_sc_line_stipple;
        unsigned                pa_cl_clip_cntl;
        float                   line_width;
        float                   max_point_size;
        unsigned                sprite_coord_enable:8;
        unsigned                clip_plane_enable:8;
+       unsigned                half_pixel_center:1;
        unsigned                flatshade:1;
        unsigned                two_side:1;
        unsigned                multisample_enable:1;
        unsigned                force_persample_interp:1;
        unsigned                line_stipple_enable:1;
        unsigned                poly_stipple_enable:1;
        unsigned                line_smooth:1;
        unsigned                poly_smooth:1;
        unsigned                uses_poly_offset:1;
        unsigned                clamp_fragment_color:1;
@@ -277,20 +278,21 @@ enum si_tracked_reg {
 
        SI_TRACKED_PA_SC_BINNER_CNTL_0,
        SI_TRACKED_DB_DFSM_CONTROL,
 
        SI_TRACKED_PA_CL_GB_VERT_CLIP_ADJ, /* 4 consecutive registers */
        SI_TRACKED_PA_CL_GB_VERT_DISC_ADJ,
        SI_TRACKED_PA_CL_GB_HORZ_CLIP_ADJ,
        SI_TRACKED_PA_CL_GB_HORZ_DISC_ADJ,
 
        SI_TRACKED_PA_SU_HARDWARE_SCREEN_OFFSET,
+       SI_TRACKED_PA_SU_VTX_CNTL,
 
        SI_TRACKED_PA_SC_CLIPRECT_RULE,
 
        SI_NUM_TRACKED_REGS,
 };
 
 struct si_tracked_regs {
        uint32_t                reg_saved;
        uint32_t                reg_value[SI_NUM_TRACKED_REGS];
        uint32_t                spi_ps_input_cntl[32];
diff --git a/src/gallium/drivers/radeonsi/si_state_viewport.c 
b/src/gallium/drivers/radeonsi/si_state_viewport.c
index 335d63b1814..c69a56dffae 100644
--- a/src/gallium/drivers/radeonsi/si_state_viewport.c
+++ b/src/gallium/drivers/radeonsi/si_state_viewport.c
@@ -143,20 +143,21 @@ static void si_emit_one_scissor(struct si_context *ctx,
                        S_028250_WINDOW_OFFSET_DISABLE(1));
        radeon_emit(cs, S_028254_BR_X(final.maxx) |
                        S_028254_BR_Y(final.maxy));
 }
 
 /* the range is [-MAX, MAX] */
 #define SI_MAX_VIEWPORT_RANGE 32768
 
 static void si_emit_guardband(struct si_context *ctx)
 {
+       const struct si_state_rasterizer *rs = ctx->queued.named.rasterizer;
        struct si_signed_scissor vp_as_scissor;
        struct pipe_viewport_state vp;
        float left, top, right, bottom, max_range, guardband_x, guardband_y;
        float discard_x, discard_y;
 
        if (ctx->vs_writes_viewport_index) {
                /* Shaders can draw to any viewport. Make a union of all
                 * viewports. */
                vp_as_scissor = ctx->viewports.as_scissor[0];
                for (unsigned i = 1; i < SI_MAX_VIEWPORTS; i++) {
@@ -222,21 +223,20 @@ static void si_emit_guardband(struct si_context *ctx)
 
        guardband_x = MIN2(-left, right);
        guardband_y = MIN2(-top, bottom);
 
        discard_x = 1.0;
        discard_y = 1.0;
 
        if (unlikely(util_prim_is_points_or_lines(ctx->current_rast_prim))) {
                /* When rendering wide points or lines, we need to be more
                 * conservative about when to discard them entirely. */
-               const struct si_state_rasterizer *rs = 
ctx->queued.named.rasterizer;
                float pixels;
 
                if (ctx->current_rast_prim == PIPE_PRIM_POINTS)
                        pixels = rs->max_point_size;
                else
                        pixels = rs->line_width;
 
                /* Add half the point size / line width */
                discard_x += pixels / (2.0 * vp.scale[0]);
                discard_y += pixels / (2.0 * vp.scale[1]);
@@ -252,20 +252,24 @@ static void si_emit_guardband(struct si_context *ctx)
         * R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, R_028BF4_PA_CL_GB_HORZ_DISC_ADJ
         */
        radeon_opt_set_context_reg4(ctx, R_028BE8_PA_CL_GB_VERT_CLIP_ADJ,
                                    SI_TRACKED_PA_CL_GB_VERT_CLIP_ADJ,
                                    fui(guardband_y), fui(discard_y),
                                    fui(guardband_x), fui(discard_x));
        radeon_opt_set_context_reg(ctx, R_028234_PA_SU_HARDWARE_SCREEN_OFFSET,
                                   SI_TRACKED_PA_SU_HARDWARE_SCREEN_OFFSET,
                                   
S_028234_HW_SCREEN_OFFSET_X(hw_screen_offset_x >> 4) |
                                   
S_028234_HW_SCREEN_OFFSET_Y(hw_screen_offset_y >> 4));
+       radeon_opt_set_context_reg(ctx, R_028BE4_PA_SU_VTX_CNTL,
+                                  SI_TRACKED_PA_SU_VTX_CNTL,
+                                  S_028BE4_PIX_CENTER(rs->half_pixel_center) |
+                                  
S_028BE4_QUANT_MODE(V_028BE4_X_16_8_FIXED_POINT_1_256TH));
 }
 
 static void si_emit_scissors(struct si_context *ctx)
 {
        struct radeon_cmdbuf *cs = ctx->gfx_cs;
        struct pipe_scissor_state *states = ctx->scissors.states;
        unsigned mask = ctx->scissors.dirty_mask;
        bool scissor_enabled = ctx->queued.named.rasterizer->scissor_enable;
 
        /* The simple case: Only 1 viewport is active. */
-- 
2.17.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to