[Mesa-dev] [PATCH 11/31] i965/fs: Lower math into Gen4-5 send-like instructions in lower_logical_sends.
Jason Ekstrand
jason at jlekstrand.net
Sat May 21 19:34:27 UTC 2016
Rb
On May 20, 2016 10:49 PM, "Francisco Jerez" <currojerez at riseup.net> wrote:
> The benefit is we will be able to use the SIMD lowering pass to unroll
> math instructions of unsupported width and then remove some cruft from
> the generator.
> ---
> src/mesa/drivers/dri/i965/brw_fs.cpp | 55
> ++++++++++++++++++++++++++++++
> src/mesa/drivers/dri/i965/brw_fs_builder.h | 47 +++----------------------
> 2 files changed, 60 insertions(+), 42 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp
> b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index fc774da..c176807 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -4442,6 +4442,36 @@ lower_varying_pull_constant_logical_send(const
> fs_builder &bld, fs_inst *inst)
> }
> }
>
> +static void
> +lower_math_logical_send(const fs_builder &bld, fs_inst *inst)
> +{
> + assert(bld.shader->devinfo->gen < 6);
> +
> + inst->base_mrf = 2;
> + inst->mlen = inst->sources * inst->exec_size / 8;
> +
> + if (inst->sources > 1) {
> + /* From the Ironlake PRM, Volume 4, Part 1, Section 6.1.13
> + * "Message Payload":
> + *
> + * "Operand0[7]. For the INT DIV functions, this operand is the
> + * denominator."
> + * ...
> + * "Operand1[7]. For the INT DIV functions, this operand is the
> + * numerator."
> + */
> + const bool is_int_div = inst->opcode != SHADER_OPCODE_POW;
> + const fs_reg src0 = is_int_div ? inst->src[1] : inst->src[0];
> + const fs_reg src1 = is_int_div ? inst->src[0] : inst->src[1];
> +
> + inst->resize_sources(1);
> + inst->src[0] = src0;
> +
> + assert(inst->exec_size == 8);
> + bld.MOV(fs_reg(MRF, inst->base_mrf + 1, src1.type), src1);
> + }
> +}
> +
> bool
> fs_visitor::lower_logical_sends()
> {
> @@ -4551,6 +4581,31 @@ fs_visitor::lower_logical_sends()
> lower_varying_pull_constant_logical_send(ibld, inst);
> break;
>
> + case SHADER_OPCODE_RCP:
> + case SHADER_OPCODE_RSQ:
> + case SHADER_OPCODE_SQRT:
> + case SHADER_OPCODE_EXP2:
> + case SHADER_OPCODE_LOG2:
> + case SHADER_OPCODE_SIN:
> + case SHADER_OPCODE_COS:
> + case SHADER_OPCODE_POW:
> + case SHADER_OPCODE_INT_QUOTIENT:
> + case SHADER_OPCODE_INT_REMAINDER:
> + /* The math opcodes are overloaded for the send-like and
> + * expression-like instructions which seems kind of icky. Gen6+
> has
> + * a native (but rather quirky) MATH instruction so we don't
> need to
> + * do anything here. On Gen4-5 we'll have to lower the Gen6-like
> + * logical instructions (which we can easily recognize because
> they
> + * have mlen = 0) into send-like virtual instructions.
> + */
> + if (devinfo->gen < 6 && !inst->mlen) {
> + lower_math_logical_send(ibld, inst);
> + break;
> +
> + } else {
> + continue;
> + }
> +
> default:
> continue;
> }
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_builder.h
> b/src/mesa/drivers/dri/i965/brw_fs_builder.h
> index 2087e58..b50dda4 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_builder.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs_builder.h
> @@ -281,9 +281,8 @@ namespace brw {
> case SHADER_OPCODE_LOG2:
> case SHADER_OPCODE_SIN:
> case SHADER_OPCODE_COS:
> - return fix_math_instruction(
> - emit(instruction(opcode, dispatch_width(), dst,
> - fix_math_operand(src0))));
> + return emit(instruction(opcode, dispatch_width(), dst,
> + fix_math_operand(src0)));
>
> default:
> return emit(instruction(opcode, dispatch_width(), dst, src0));
> @@ -301,10 +300,9 @@ namespace brw {
> case SHADER_OPCODE_POW:
> case SHADER_OPCODE_INT_QUOTIENT:
> case SHADER_OPCODE_INT_REMAINDER:
> - return fix_math_instruction(
> - emit(instruction(opcode, dispatch_width(), dst,
> - fix_math_operand(src0),
> - fix_math_operand(src1))));
> + return emit(instruction(opcode, dispatch_width(), dst,
> + fix_math_operand(src0),
> + fix_math_operand(src1)));
>
> default:
> return emit(instruction(opcode, dispatch_width(), dst, src0,
> src1));
> @@ -640,41 +638,6 @@ namespace brw {
> }
> }
>
> - /**
> - * Workaround other weirdness of the math instruction.
> - */
> - instruction *
> - fix_math_instruction(instruction *inst) const
> - {
> - if (shader->devinfo->gen < 6) {
> - inst->base_mrf = 2;
> - inst->mlen = inst->sources * dispatch_width() / 8;
> -
> - if (inst->sources > 1) {
> - /* From the Ironlake PRM, Volume 4, Part 1, Section 6.1.13
> - * "Message Payload":
> - *
> - * "Operand0[7]. For the INT DIV functions, this operand
> is the
> - * denominator."
> - * ...
> - * "Operand1[7]. For the INT DIV functions, this operand
> is the
> - * numerator."
> - */
> - const bool is_int_div = inst->opcode != SHADER_OPCODE_POW;
> - const fs_reg src0 = is_int_div ? inst->src[1] :
> inst->src[0];
> - const fs_reg src1 = is_int_div ? inst->src[0] :
> inst->src[1];
> -
> - inst->resize_sources(1);
> - inst->src[0] = src0;
> -
> - at(block, inst).MOV(fs_reg(MRF, inst->base_mrf + 1,
> src1.type),
> - src1);
> - }
> - }
> -
> - return inst;
> - }
> -
> bblock_t *block;
> exec_node *cursor;
>
> --
> 2.7.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160521/dc34041d/attachment.html>
More information about the mesa-dev
mailing list