From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeon/r600_viewport.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-)
diff --git a/src/gallium/drivers/radeon/r600_viewport.c b/src/gallium/drivers/radeon/r600_viewport.c index 5c998c8..2d68783 100644 --- a/src/gallium/drivers/radeon/r600_viewport.c +++ b/src/gallium/drivers/radeon/r600_viewport.c @@ -269,57 +269,59 @@ static void r600_set_viewport_states(struct pipe_context *ctx, r600_get_scissor_from_viewport(rctx, &state[i], &rctx->viewports.as_scissor[index]); } rctx->viewports.dirty_mask |= ((1 << num_viewports) - 1) << start_slot; rctx->scissors.dirty_mask |= ((1 << num_viewports) - 1) << start_slot; rctx->set_atom_dirty(rctx, &rctx->viewports.atom, true); rctx->set_atom_dirty(rctx, &rctx->scissors.atom, true); } +static void r600_emit_one_viewport(struct r600_common_context *rctx, + struct pipe_viewport_state *state) +{ + struct radeon_winsys_cs *cs = rctx->gfx.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])); +} + static void r600_emit_viewports(struct r600_common_context *rctx, struct r600_atom *atom) { struct radeon_winsys_cs *cs = rctx->gfx.cs; struct pipe_viewport_state *states = rctx->viewports.states; unsigned mask = rctx->viewports.dirty_mask; /* The simple case: Only 1 viewport is active. */ if (!rctx->vs_writes_viewport_index) { if (!(mask & 1)) return; radeon_set_context_reg_seq(cs, R_02843C_PA_CL_VPORT_XSCALE, 6); - radeon_emit(cs, fui(states[0].scale[0])); - radeon_emit(cs, fui(states[0].translate[0])); - radeon_emit(cs, fui(states[0].scale[1])); - radeon_emit(cs, fui(states[0].translate[1])); - radeon_emit(cs, fui(states[0].scale[2])); - radeon_emit(cs, fui(states[0].translate[2])); + r600_emit_one_viewport(rctx, &states[0]); rctx->viewports.dirty_mask &= ~1; /* clear one bit */ return; } while (mask) { int start, count, i; u_bit_scan_consecutive_range(&mask, &start, &count); radeon_set_context_reg_seq(cs, R_02843C_PA_CL_VPORT_XSCALE + start * 4 * 6, count * 6); - for (i = start; i < start+count; i++) { - radeon_emit(cs, fui(states[i].scale[0])); - radeon_emit(cs, fui(states[i].translate[0])); - radeon_emit(cs, fui(states[i].scale[1])); - radeon_emit(cs, fui(states[i].translate[1])); - radeon_emit(cs, fui(states[i].scale[2])); - radeon_emit(cs, fui(states[i].translate[2])); - } + for (i = start; i < start+count; i++) + r600_emit_one_viewport(rctx, &states[i]); } rctx->viewports.dirty_mask = 0; } void r600_set_scissor_enable(struct r600_common_context *rctx, bool enable) { if (rctx->scissor_enabled != enable) { rctx->scissor_enabled = enable; rctx->scissors.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; rctx->set_atom_dirty(rctx, &rctx->scissors.atom, true); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev