summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/radeonsi/si_state_viewport.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_state_viewport.c')
-rw-r--r--src/gallium/drivers/radeonsi/si_state_viewport.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_viewport.c b/src/gallium/drivers/radeonsi/si_state_viewport.c
index 41432755c64..0327d2f5d15 100644
--- a/src/gallium/drivers/radeonsi/si_state_viewport.c
+++ b/src/gallium/drivers/radeonsi/si_state_viewport.c
@@ -103,8 +103,10 @@ static void si_emit_cull_state(struct si_context *sctx)
/* This will end up in SGPR6 as (value << 8), shifted by the hw. */
radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, sctx->small_prim_cull_info_buf,
RADEON_USAGE_READ, RADEON_PRIO_CONST_BUFFER);
+ radeon_begin(&sctx->gfx_cs);
radeon_set_sh_reg(&sctx->gfx_cs, R_00B220_SPI_SHADER_PGM_LO_GS,
sctx->small_prim_cull_info_address >> 8);
+ radeon_end();
/* Set VS_STATE.SMALL_PRIM_PRECISION for NGG culling.
*
@@ -213,18 +215,22 @@ static void si_emit_one_scissor(struct si_context *ctx, struct radeon_cmdbuf *cs
if (scissor)
si_clip_scissor(&final, scissor);
+ radeon_begin(cs);
+
/* Workaround for a hw bug on GFX6 that occurs when PA_SU_HARDWARE_-
* SCREEN_OFFSET != 0 and any_scissor.BR_X/Y <= 0.
*/
if (ctx->chip_class == GFX6 && (final.maxx == 0 || final.maxy == 0)) {
radeon_emit(cs, S_028250_TL_X(1) | S_028250_TL_Y(1) | S_028250_WINDOW_OFFSET_DISABLE(1));
radeon_emit(cs, S_028254_BR_X(1) | S_028254_BR_Y(1));
+ radeon_end();
return;
}
radeon_emit(cs, S_028250_TL_X(final.minx) | S_028250_TL_Y(final.miny) |
S_028250_WINDOW_OFFSET_DISABLE(1));
radeon_emit(cs, S_028254_BR_X(final.maxx) | S_028254_BR_Y(final.maxy));
+ radeon_end();
}
#define MAX_PA_SU_HARDWARE_SCREEN_OFFSET 8176
@@ -350,7 +356,7 @@ static void si_emit_guardband(struct si_context *ctx)
* R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, R_028BEC_PA_CL_GB_VERT_DISC_ADJ
* R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, R_028BF4_PA_CL_GB_HORZ_DISC_ADJ
*/
- unsigned initial_cdw = ctx->gfx_cs.current.cdw;
+ radeon_begin(&ctx->gfx_cs);
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));
@@ -362,8 +368,7 @@ static void si_emit_guardband(struct si_context *ctx)
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 + vp_as_scissor.quant_mode));
- if (initial_cdw != ctx->gfx_cs.current.cdw)
- ctx->context_roll = true;
+ radeon_end_update_context_roll(ctx);
}
static void si_emit_scissors(struct si_context *ctx)
@@ -376,7 +381,10 @@ static void si_emit_scissors(struct si_context *ctx)
if (!ctx->vs_writes_viewport_index) {
struct si_signed_scissor *vp = &ctx->viewports.as_scissor[0];
+ radeon_begin(cs);
radeon_set_context_reg_seq(cs, R_028250_PA_SC_VPORT_SCISSOR_0_TL, 2);
+ radeon_end();
+
si_emit_one_scissor(ctx, cs, vp, scissor_enabled ? &states[0] : NULL);
return;
}
@@ -384,7 +392,10 @@ static void si_emit_scissors(struct si_context *ctx)
/* All registers in the array need to be updated if any of them is changed.
* This is a hardware requirement.
*/
+ radeon_begin(cs);
radeon_set_context_reg_seq(cs, R_028250_PA_SC_VPORT_SCISSOR_0_TL, SI_MAX_VIEWPORTS * 2);
+ radeon_end();
+
for (unsigned i = 0; i < SI_MAX_VIEWPORTS; i++) {
si_emit_one_scissor(ctx, cs, &ctx->viewports.as_scissor[i],
scissor_enabled ? &states[i] : NULL);
@@ -477,12 +488,14 @@ static void si_emit_one_viewport(struct si_context *ctx, struct pipe_viewport_st
{
struct radeon_cmdbuf *cs = &ctx->gfx_cs;
+ radeon_begin(cs);
radeon_emit(cs, fui(state->scale[0]));
radeon_emit(cs, fui(state->translate[0]));
radeon_emit(cs, fui(state->scale[1]));
radeon_emit(cs, fui(state->translate[1]));
radeon_emit(cs, fui(state->scale[2]));
radeon_emit(cs, fui(state->translate[2]));
+ radeon_end();
}
static void si_emit_viewports(struct si_context *ctx)
@@ -492,7 +505,10 @@ static void si_emit_viewports(struct si_context *ctx)
/* The simple case: Only 1 viewport is active. */
if (!ctx->vs_writes_viewport_index) {
+ radeon_begin(cs);
radeon_set_context_reg_seq(cs, R_02843C_PA_CL_VPORT_XSCALE, 6);
+ radeon_end();
+
si_emit_one_viewport(ctx, &states[0]);
return;
}
@@ -500,7 +516,10 @@ static void si_emit_viewports(struct si_context *ctx)
/* All registers in the array need to be updated if any of them is changed.
* This is a hardware requirement.
*/
+ radeon_begin(cs);
radeon_set_context_reg_seq(cs, R_02843C_PA_CL_VPORT_XSCALE + 0, SI_MAX_VIEWPORTS * 6);
+ radeon_end();
+
for (unsigned i = 0; i < SI_MAX_VIEWPORTS; i++)
si_emit_one_viewport(ctx, &states[i]);
}
@@ -528,21 +547,25 @@ static void si_emit_depth_ranges(struct si_context *ctx)
if (!ctx->vs_writes_viewport_index) {
si_viewport_zmin_zmax(&states[0], clip_halfz, window_space, &zmin, &zmax);
+ radeon_begin(cs);
radeon_set_context_reg_seq(cs, R_0282D0_PA_SC_VPORT_ZMIN_0, 2);
radeon_emit(cs, fui(zmin));
radeon_emit(cs, fui(zmax));
+ radeon_end();
return;
}
/* All registers in the array need to be updated if any of them is changed.
* This is a hardware requirement.
*/
+ radeon_begin(cs);
radeon_set_context_reg_seq(cs, R_0282D0_PA_SC_VPORT_ZMIN_0, SI_MAX_VIEWPORTS * 2);
for (unsigned i = 0; i < SI_MAX_VIEWPORTS; i++) {
si_viewport_zmin_zmax(&states[i], clip_halfz, window_space, &zmin, &zmax);
radeon_emit(cs, fui(zmin));
radeon_emit(cs, fui(zmax));
}
+ radeon_end();
}
static void si_emit_viewport_states(struct si_context *ctx)
@@ -631,16 +654,20 @@ static void si_emit_window_rectangles(struct si_context *sctx)
else
rule = outside[num_rectangles - 1];
+ radeon_begin(cs);
radeon_opt_set_context_reg(sctx, R_02820C_PA_SC_CLIPRECT_RULE, SI_TRACKED_PA_SC_CLIPRECT_RULE,
rule);
- if (num_rectangles == 0)
+ if (num_rectangles == 0) {
+ radeon_end();
return;
+ }
radeon_set_context_reg_seq(cs, R_028210_PA_SC_CLIPRECT_0_TL, num_rectangles * 2);
for (unsigned i = 0; i < num_rectangles; i++) {
radeon_emit(cs, S_028210_TL_X(rects[i].minx) | S_028210_TL_Y(rects[i].miny));
radeon_emit(cs, S_028214_BR_X(rects[i].maxx) | S_028214_BR_Y(rects[i].maxy));
}
+ radeon_end();
}
static void si_set_window_rectangles(struct pipe_context *ctx, bool include,