[Mesa-dev] [PATCH 1/7] r600g: don't snoop context state while building shaders
Alex Deucher
alexdeucher at gmail.com
Wed Sep 19 08:52:09 PDT 2012
For the series:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
On Tue, Sep 18, 2012 at 8:51 PM, Marek Olšák <maraeo at gmail.com> wrote:
> Let's use the shader key describing the state.
> ---
> src/gallium/drivers/r600/r600_pipe.h | 13 +++++++++--
> src/gallium/drivers/r600/r600_shader.c | 30 +++++++++++++++-----------
> src/gallium/drivers/r600/r600_state_common.c | 28 ++++++++++++------------
> 3 files changed, 43 insertions(+), 28 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
> index a60a498..99c9e14 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -254,6 +254,13 @@ struct r600_pipe_shader_selector {
> unsigned nr_ps_max_color_exports;
> };
>
> +struct r600_shader_key {
> + unsigned color_two_side:1;
> + unsigned alpha_to_one:1;
> + unsigned dual_src_blend:1;
> + unsigned nr_cbufs:4;
> +};
> +
> struct r600_pipe_shader {
> struct r600_pipe_shader_selector *selector;
> struct r600_pipe_shader *next_variant;
> @@ -266,7 +273,7 @@ struct r600_pipe_shader {
> unsigned flatshade;
> unsigned pa_cl_vs_out_cntl;
> unsigned nr_ps_color_outputs;
> - unsigned key;
> + struct r600_shader_key key;
> unsigned db_shader_control;
> unsigned ps_depth_export;
> };
> @@ -567,7 +574,9 @@ void r600_resume_timer_queries(struct r600_context *ctx);
> void r600_init_context_resource_functions(struct r600_context *r600);
>
> /* r600_shader.c */
> -int r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader);
> +int r600_pipe_shader_create(struct pipe_context *ctx,
> + struct r600_pipe_shader *shader,
> + struct r600_shader_key key);
> #ifdef HAVE_OPENCL
> int r600_compute_shader_create(struct pipe_context * ctx,
> LLVMModuleRef mod, struct r600_bytecode * bytecode);
> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
> index 736165b..8ac5250 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -103,9 +103,13 @@ static int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *s
> return 0;
> }
>
> -static int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader);
> +static int r600_shader_from_tgsi(struct r600_screen *rscreen,
> + struct r600_pipe_shader *pipeshader,
> + struct r600_shader_key key);
>
> -int r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader)
> +int r600_pipe_shader_create(struct pipe_context *ctx,
> + struct r600_pipe_shader *shader,
> + struct r600_shader_key key)
> {
> static int dump_shaders = -1;
> struct r600_context *rctx = (struct r600_context *)ctx;
> @@ -136,7 +140,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *s
> }
> }
> }
> - r = r600_shader_from_tgsi(rctx, shader);
> + r = r600_shader_from_tgsi(rctx->screen, shader, key);
> if (r) {
> R600_ERR("translation from TGSI failed !\n");
> return r;
> @@ -1161,7 +1165,9 @@ static int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
> return 0;
> }
>
> -static int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader)
> +static int r600_shader_from_tgsi(struct r600_screen *rscreen,
> + struct r600_pipe_shader *pipeshader,
> + struct r600_shader_key key)
> {
> struct r600_shader *shader = &pipeshader->shader;
> struct tgsi_token *tokens = pipeshader->selector->tokens;
> @@ -1186,7 +1192,7 @@ static int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_sh
> ctx.shader = shader;
> ctx.native_integers = true;
>
> - r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
> + r600_bytecode_init(ctx.bc, rscreen->chip_class, rscreen->family);
> ctx.tokens = tokens;
> tgsi_scan_shader(tokens, &ctx.info);
> tgsi_parse_init(&ctx.parse, tokens);
> @@ -1202,7 +1208,7 @@ static int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_sh
> shader->nr_ps_color_exports = 0;
> shader->nr_ps_max_color_exports = 0;
>
> - shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
> + shader->two_side = key.color_two_side;
>
> /* register allocations */
> /* Values [0,127] correspond to GPR[0..127].
> @@ -1336,7 +1342,7 @@ static int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_sh
> }
> }
>
> - if (shader->fs_write_all && rctx->chip_class >= EVERGREEN)
> + if (shader->fs_write_all && rscreen->chip_class >= EVERGREEN)
> shader->nr_ps_max_color_exports = 8;
>
> if (ctx.fragcoord_input >= 0) {
> @@ -1579,17 +1585,17 @@ static int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_sh
> case TGSI_PROCESSOR_FRAGMENT:
> if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
> /* never export more colors than the number of CBs */
> - if (next_pixel_base && next_pixel_base >= (rctx->nr_cbufs + rctx->dual_src_blend * 1)) {
> + if (next_pixel_base && next_pixel_base >= key.nr_cbufs + key.dual_src_blend) {
> /* skip export */
> j--;
> continue;
> }
> - output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
> + output[j].swizzle_w = key.alpha_to_one ? 5 : 3;
> output[j].array_base = next_pixel_base++;
> output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
> shader->nr_ps_color_exports++;
> - if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
> - for (k = 1; k < rctx->nr_cbufs; k++) {
> + if (shader->fs_write_all && (rscreen->chip_class >= EVERGREEN)) {
> + for (k = 1; k < key.nr_cbufs; k++) {
> j++;
> memset(&output[j], 0, sizeof(struct r600_bytecode_output));
> output[j].gpr = shader->output[i].gpr;
> @@ -1597,7 +1603,7 @@ static int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_sh
> output[j].swizzle_x = 0;
> output[j].swizzle_y = 1;
> output[j].swizzle_z = 2;
> - output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
> + output[j].swizzle_w = key.alpha_to_one ? 5 : 3;
> output[j].burst_count = 1;
> output[j].barrier = 1;
> output[j].array_base = next_pixel_base++;
> diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
> index 635804c..1f4339c 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -728,19 +728,19 @@ static void *r600_create_vertex_elements(struct pipe_context *ctx, unsigned coun
> }
>
> /* Compute the key for the hw shader variant */
> -static INLINE unsigned r600_shader_selector_key(struct pipe_context * ctx,
> +static INLINE struct r600_shader_key r600_shader_selector_key(struct pipe_context * ctx,
> struct r600_pipe_shader_selector * sel)
> {
> struct r600_context *rctx = (struct r600_context *)ctx;
> - unsigned key;
> + struct r600_shader_key key;
> + memset(&key, 0, sizeof(key));
>
> if (sel->type == PIPE_SHADER_FRAGMENT) {
> - key = rctx->two_side |
> - ((rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer) << 1) |
> - (MIN2(sel->nr_ps_max_color_exports, rctx->nr_cbufs + rctx->dual_src_blend) << 2);
> - } else
> - key = 0;
> -
> + key.color_two_side = rctx->two_side;
> + key.alpha_to_one = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer;
> + key.dual_src_blend = rctx->dual_src_blend;
> + key.nr_cbufs = rctx->nr_cbufs;
> + }
> return key;
> }
>
> @@ -750,7 +750,7 @@ static int r600_shader_select(struct pipe_context *ctx,
> struct r600_pipe_shader_selector* sel,
> unsigned *dirty)
> {
> - unsigned key;
> + struct r600_shader_key key;
> struct r600_context *rctx = (struct r600_context *)ctx;
> struct r600_pipe_shader * shader = NULL;
> int r;
> @@ -761,7 +761,7 @@ static int r600_shader_select(struct pipe_context *ctx,
> * This path is also used for most shaders that don't need multiple
> * variants, it will cost just a computation of the key and this
> * test. */
> - if (likely(sel->current && sel->current->key == key)) {
> + if (likely(sel->current && memcmp(&sel->current->key, &key, sizeof(key)) == 0)) {
> return 0;
> }
>
> @@ -769,7 +769,7 @@ static int r600_shader_select(struct pipe_context *ctx,
> if (sel->num_shaders > 1) {
> struct r600_pipe_shader *p = sel->current, *c = p->next_variant;
>
> - while (c && c->key != key) {
> + while (c && memcmp(&c->key, &key, sizeof(key)) != 0) {
> p = c;
> c = c->next_variant;
> }
> @@ -784,10 +784,10 @@ static int r600_shader_select(struct pipe_context *ctx,
> shader = CALLOC(1, sizeof(struct r600_pipe_shader));
> shader->selector = sel;
>
> - r = r600_pipe_shader_create(ctx, shader);
> + r = r600_pipe_shader_create(ctx, shader, key);
> if (unlikely(r)) {
> - R600_ERR("Failed to build shader variant (type=%u, key=%u) %d\n",
> - sel->type, key, r);
> + R600_ERR("Failed to build shader variant (type=%u) %d\n",
> + sel->type, r);
> sel->current = NULL;
> return r;
> }
> --
> 1.7.9.5
>
> _______________________________________________
> 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