From 0374fdd5b6f70af36fca92abae5d8166e93d6372 Mon Sep 17 00:00:00 2001 From: Marek Olšák Date: Sun, 17 Aug 2014 16:25:01 +0200 Subject: radeonsi: save scissor state and sample mask for u_blitter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Michel Dänzer (cherry picked from commit 7792f9858b60fd9f9f037f1aa15dd21cba30f2c4) --- src/gallium/drivers/radeonsi/si_blit.c | 7 +++++++ src/gallium/drivers/radeonsi/si_state.c | 16 ++++++++++------ src/gallium/drivers/radeonsi/si_state.h | 14 ++++++++++++-- 3 files changed, 29 insertions(+), 8 deletions(-) (limited to 'src/gallium') diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index ea1065480d8..dced3d0e7d0 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -60,9 +60,16 @@ static void si_blitter_begin(struct pipe_context *ctx, enum si_blitter_op op) util_blitter_save_geometry_shader(sctx->blitter, sctx->gs_shader); util_blitter_save_vertex_shader(sctx->blitter, sctx->vs_shader); util_blitter_save_vertex_elements(sctx->blitter, sctx->vertex_elements); + if (sctx->queued.named.sample_mask) { + util_blitter_save_sample_mask(sctx->blitter, + sctx->queued.named.sample_mask->sample_mask); + } if (sctx->queued.named.viewport) { util_blitter_save_viewport(sctx->blitter, &sctx->queued.named.viewport->viewport); } + if (sctx->queued.named.scissor) { + util_blitter_save_scissor(sctx->blitter, &sctx->queued.named.scissor->scissor); + } util_blitter_save_vertex_buffer_slot(sctx->blitter, sctx->vertex_buffer); util_blitter_save_so_targets(sctx->blitter, sctx->b.streamout.num_targets, (struct pipe_stream_output_target**)sctx->b.streamout.targets); diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index d12bd01acbd..9bfa0951b0f 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -458,18 +458,20 @@ static void si_set_scissor_states(struct pipe_context *ctx, const struct pipe_scissor_state *state) { struct si_context *sctx = (struct si_context *)ctx; - struct si_pm4_state *pm4 = si_pm4_alloc_state(sctx); + struct si_state_scissor *scissor = CALLOC_STRUCT(si_state_scissor); + struct si_pm4_state *pm4 = &scissor->pm4; - if (pm4 == NULL) + if (scissor == NULL) return; + scissor->scissor = *state; si_pm4_set_reg(pm4, R_028250_PA_SC_VPORT_SCISSOR_0_TL, S_028250_TL_X(state->minx) | S_028250_TL_Y(state->miny) | S_028250_WINDOW_OFFSET_DISABLE(1)); si_pm4_set_reg(pm4, R_028254_PA_SC_VPORT_SCISSOR_0_BR, S_028254_BR_X(state->maxx) | S_028254_BR_Y(state->maxy)); - si_pm4_set_state(sctx, scissor, pm4); + si_pm4_set_state(sctx, scissor, scissor); } static void si_set_viewport_states(struct pipe_context *ctx, @@ -2823,16 +2825,18 @@ static void si_bind_sampler_states(struct pipe_context *ctx, unsigned shader, static void si_set_sample_mask(struct pipe_context *ctx, unsigned sample_mask) { struct si_context *sctx = (struct si_context *)ctx; - struct si_pm4_state *pm4 = si_pm4_alloc_state(sctx); + struct si_state_sample_mask *state = CALLOC_STRUCT(si_state_sample_mask); + struct si_pm4_state *pm4 = &state->pm4; uint16_t mask = sample_mask; - if (pm4 == NULL) + if (state == NULL) return; + state->sample_mask = mask; si_pm4_set_reg(pm4, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, mask | (mask << 16)); si_pm4_set_reg(pm4, R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, mask | (mask << 16)); - si_pm4_set_state(sctx, sample_mask, pm4); + si_pm4_set_state(sctx, sample_mask, state); } static void si_delete_sampler_state(struct pipe_context *ctx, void *state) diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h index 4c5b09eb4b6..752cd11efe6 100644 --- a/src/gallium/drivers/radeonsi/si_state.h +++ b/src/gallium/drivers/radeonsi/si_state.h @@ -38,6 +38,16 @@ struct si_state_blend { bool alpha_to_one; }; +struct si_state_sample_mask { + struct si_pm4_state pm4; + uint16_t sample_mask; +}; + +struct si_state_scissor { + struct si_pm4_state pm4; + struct pipe_scissor_state scissor; +}; + struct si_state_viewport { struct si_pm4_state pm4; struct pipe_viewport_state viewport; @@ -81,8 +91,8 @@ union si_state { struct si_state_blend *blend; struct si_pm4_state *blend_color; struct si_pm4_state *clip; - struct si_pm4_state *sample_mask; - struct si_pm4_state *scissor; + struct si_state_sample_mask *sample_mask; + struct si_state_scissor *scissor; struct si_state_viewport *viewport; struct si_state_rasterizer *rasterizer; struct si_state_dsa *dsa; -- cgit v1.2.3