[Mesa-dev] [PATCH 2/2] r600g: enable DUAL_EXPORT mode when possible
Jerome Glisse
j.glisse at gmail.com
Fri Jun 22 09:30:40 PDT 2012
On Fri, Jun 22, 2012 at 10:02 AM, Vadim Girlin <vadimgirlin at gmail.com> wrote:
> It seems DUAL_EXPORT on evergreen may be enabled when all CBs use 16-bit export
> mode (EXPORT_4C_16BPC), also there should be at least one CB, and the PS
> shouldn't export depth/stencil.
>
> Signed-off-by: Vadim Girlin <vadimgirlin at gmail.com>
Reviewed-by: Jerome Glisse <jglisse at redhat.com>
> ---
> src/gallium/drivers/r600/evergreen_state.c | 46 ++++++++++++++++++++++----
> src/gallium/drivers/r600/evergreend.h | 7 ++++
> src/gallium/drivers/r600/r600_pipe.h | 5 +++
> src/gallium/drivers/r600/r600_state_common.c | 3 ++
> 4 files changed, 55 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index 3fe95e1..bddb67e 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -1458,7 +1458,6 @@ static void evergreen_cb(struct r600_context *rctx, struct r600_pipe_state *rsta
> (desc->channel[i].size < 17 &&
> desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT))) {
> color_info |= S_028C70_SOURCE_FORMAT(V_028C70_EXPORT_4C_16BPC);
> - rctx->export_16bpc = true;
> } else {
> rctx->export_16bpc = false;
> }
> @@ -1661,6 +1660,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
> struct r600_context *rctx = (struct r600_context *)ctx;
> struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
> uint32_t tl, br;
> + int i;
>
> if (rstate == NULL)
> return;
> @@ -1674,10 +1674,16 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
>
> /* build states */
> rctx->have_depth_fb = 0;
> + rctx->export_16bpc = true;
> rctx->nr_cbufs = state->nr_cbufs;
> - for (int i = 0; i < state->nr_cbufs; i++) {
> + for (i = 0; i < state->nr_cbufs; i++) {
> evergreen_cb(rctx, rstate, state, i);
> }
> +
> + for (; i < 8 ; i++) {
> + r600_pipe_state_add_reg(rstate, R_028C70_CB_COLOR0_INFO + i * 0x3C, 0);
> + }
> +
> if (state->zsbuf) {
> evergreen_db(rctx, rstate, state);
> }
> @@ -2585,6 +2591,7 @@ void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader
> int ninterp = 0;
> boolean have_linear = FALSE, have_centroid = FALSE, have_perspective = FALSE;
> unsigned spi_baryc_cntl, sid, tmp, idx = 0;
> + unsigned z_export = 0, stencil_export = 0;
>
> rstate->nregs = 0;
>
> @@ -2633,13 +2640,16 @@ void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader
>
> for (i = 0; i < rshader->noutput; i++) {
> if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
> - db_shader_control |= S_02880C_Z_EXPORT_ENABLE(1);
> + z_export = 1;
> if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
> - db_shader_control |= S_02880C_STENCIL_EXPORT_ENABLE(1);
> + stencil_export = 1;
> }
> if (rshader->uses_kill)
> db_shader_control |= S_02880C_KILL_ENABLE(1);
>
> + db_shader_control |= S_02880C_Z_EXPORT_ENABLE(z_export);
> + db_shader_control |= S_02880C_STENCIL_EXPORT_ENABLE(stencil_export);
> +
> exports_ps = 0;
> for (i = 0; i < rshader->noutput; i++) {
> if (rshader->output[i].name == TGSI_SEMANTIC_POSITION ||
> @@ -2711,8 +2721,9 @@ void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader
> r600_pipe_state_add_reg(rstate,
> R_02884C_SQ_PGM_EXPORTS_PS,
> exports_ps);
> - r600_pipe_state_add_reg(rstate, R_02880C_DB_SHADER_CONTROL,
> - db_shader_control);
> +
> + shader->db_shader_control = db_shader_control;
> + shader->ps_depth_export = z_export | stencil_export;
>
> shader->sprite_coord_enable = rctx->sprite_coord_enable;
> if (rctx->rasterizer)
> @@ -2798,3 +2809,26 @@ void *evergreen_create_db_flush_dsa(struct r600_context *rctx)
> /* Don't set the 'is_flush' flag in r600_pipe_dsa, evergreen doesn't need it. */
> return rstate;
> }
> +
> +void evergreen_update_dual_export_state(struct r600_context * rctx)
> +{
> + unsigned dual_export = rctx->export_16bpc && rctx->nr_cbufs &&
> + !rctx->ps_shader->ps_depth_export;
> +
> + unsigned db_source_format = dual_export ? V_02880C_EXPORT_DB_TWO :
> + V_02880C_EXPORT_DB_FULL;
> +
> + unsigned db_shader_control = rctx->ps_shader->db_shader_control |
> + S_02880C_DUAL_EXPORT_ENABLE(dual_export) |
> + S_02880C_DB_SOURCE_FORMAT(db_source_format);
> +
> + if (db_shader_control != rctx->db_shader_control) {
> + struct r600_pipe_state rstate;
> +
> + rctx->db_shader_control = db_shader_control;
> +
> + rstate.nregs = 0;
> + r600_pipe_state_add_reg(&rstate, R_02880C_DB_SHADER_CONTROL, db_shader_control);
> + r600_context_pipe_state_set(rctx, &rstate);
> + }
> +}
> diff --git a/src/gallium/drivers/r600/evergreend.h b/src/gallium/drivers/r600/evergreend.h
> index 5d57ce3..a067ad2 100644
> --- a/src/gallium/drivers/r600/evergreend.h
> +++ b/src/gallium/drivers/r600/evergreend.h
> @@ -746,6 +746,13 @@
> #define S_02880C_DUAL_EXPORT_ENABLE(x) (((x) & 0x1) << 9)
> #define G_02880C_DUAL_EXPORT_ENABLE(x) (((x) >> 9) & 0x1)
> #define C_02880C_DUAL_EXPORT_ENABLE 0xFFFFFDFF
> +#define S_02880C_DB_SOURCE_FORMAT(x) (((x) & 0x3) << 13)
> +#define G_02880C_DB_SOURCE_FORMAT(x) (((x) >> 13) & 0x3)
> +#define C_02880C_DB_SOURCE_FORMAT 0xFFFF9FFF
> +#define V_02880C_EXPORT_DB_FULL 0x00
> +#define V_02880C_EXPORT_DB_FOUR16 0x01
> +#define V_02880C_EXPORT_DB_TWO 0x02
> +
> #define R_028A00_PA_SU_POINT_SIZE 0x028A00
> #define S_028A00_HEIGHT(x) (((x) & 0xFFFF) << 0)
> #define G_028A00_HEIGHT(x) (((x) >> 0) & 0xFFFF)
> diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
> index b5eff34..2c107c8 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -196,6 +196,8 @@ struct r600_pipe_shader {
> unsigned flatshade;
> unsigned pa_cl_vs_out_cntl;
> unsigned ps_cb_shader_mask;
> + unsigned db_shader_control;
> + unsigned ps_depth_export;
> struct pipe_stream_output_info so;
> };
>
> @@ -265,6 +267,7 @@ struct r600_context {
> unsigned fb_cb_shader_mask;
> unsigned sx_alpha_test_control;
> unsigned cb_shader_mask;
> + unsigned db_shader_control;
> unsigned cb_color_control;
> unsigned pa_sc_line_stipple;
> unsigned pa_cl_clip_cntl;
> @@ -402,6 +405,8 @@ boolean evergreen_is_format_supported(struct pipe_screen *screen,
> unsigned sample_count,
> unsigned usage);
>
> +void evergreen_update_dual_export_state(struct r600_context * rctx);
> +
> /* r600_blit.c */
> void r600_init_blit_functions(struct r600_context *rctx);
> void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_texture *texture);
> diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
> index 36a891e..91387f9 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -711,6 +711,9 @@ static void r600_update_derived_state(struct r600_context *rctx)
> r600_context_pipe_state_set(rctx, &rctx->ps_shader->rstate);
> }
>
> + if (rctx->chip_class >= EVERGREEN)
> + evergreen_update_dual_export_state(rctx);
> +
> if (rctx->dual_src_blend)
> rctx->cb_shader_mask = rctx->ps_shader->ps_cb_shader_mask | rctx->fb_cb_shader_mask;
> else
> --
> 1.7.10.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list