[Mesa-dev] [PATCH 4/7] i965: Perform basic optimizations on the FIND_LIVE_CHANNEL opcode.
Matt Turner
mattst88 at gmail.com
Wed Apr 29 22:31:16 PDT 2015
On Fri, Feb 20, 2015 at 11:49 AM, Francisco Jerez <currojerez at riseup.net> wrote:
> ---
> src/mesa/drivers/dri/i965/brw_fs.cpp | 49 ++++++++++++++++++++++++++++++
> src/mesa/drivers/dri/i965/brw_fs.h | 1 +
> src/mesa/drivers/dri/i965/brw_fs_cse.cpp | 1 +
> src/mesa/drivers/dri/i965/brw_vec4.cpp | 41 +++++++++++++++++++++++++
> src/mesa/drivers/dri/i965/brw_vec4.h | 1 +
> src/mesa/drivers/dri/i965/brw_vec4_cse.cpp | 1 +
> 6 files changed, 94 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index d567c2b..4537900 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -2734,6 +2734,54 @@ fs_visitor::compute_to_mrf()
> }
>
> /**
> + * Eliminate FIND_LIVE_CHANNEL instructions occurring outside any control
> + * flow. We could probably do better here with some form of divergence
> + * analysis.
> + */
> +bool
> +fs_visitor::eliminate_find_live_channel()
> +{
> + bool progress = false;
> + unsigned depth = 0;
> +
> + foreach_block_and_inst_safe(block, fs_inst, inst, cfg) {
> + switch (inst->opcode) {
> + case BRW_OPCODE_IF:
> + case BRW_OPCODE_DO:
> + depth++;
> + break;
> +
> + case BRW_OPCODE_ENDIF:
> + case BRW_OPCODE_WHILE:
> + depth--;
> + break;
> +
> + case FS_OPCODE_DISCARD_JUMP:
> + /* This can potentially make control flow non-uniform until the end
> + * of the program.
> + */
> + depth++;
> + break;
> +
> + case SHADER_OPCODE_FIND_LIVE_CHANNEL:
> + if (depth == 0) {
> + inst->opcode = BRW_OPCODE_MOV;
> + inst->src[0] = fs_reg(0);
How does this work if we're on a primitive edge and channel zero is
disabled? Does the EU not actually disable those channels except in
the framebuffer write or something?
> + inst->sources = 1;
> + inst->force_writemask_all = true;
> + progress = true;
> + }
> + break;
> +
> + default:
> + break;
> + }
> + }
> +
> + return progress;
> +}
I wouldn't mind if this was just part of opt_algebraic. Less code that
way and one fewer pass over the instruction list. What do you think,
Ken?
More information about the mesa-dev
mailing list