[Mesa-dev] [PATCH] llvmpipe, tgsi: hook up dx10 gather4 opcode
Jose Fonseca
jfonseca at vmware.com
Tue Sep 5 16:02:31 UTC 2017
On 05/09/17 17:01, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> Trivial. We already support tg4 for legacy tex opcodes, so the actual
> texture sampling code already handles it.
> (Just like TG4, we don't handle additional capabilities and always sample
> red channel.)
> ---
> src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 28 ++++++++++++++++++-------
> src/gallium/auxiliary/tgsi/tgsi_exec.c | 5 ++++-
> 2 files changed, 25 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> index b7f1140..f16c579 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> @@ -2232,6 +2232,7 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
> const struct tgsi_full_instruction *inst,
> enum lp_build_tex_modifier modifier,
> boolean compare,
> + enum lp_sampler_op_type sample_type,
> LLVMValueRef *texel)
> {
> struct gallivm_state *gallivm = bld->bld_base.base.gallivm;
> @@ -2245,7 +2246,7 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
>
> unsigned num_offsets, num_derivs, i;
> unsigned layer_coord = 0;
> - unsigned sample_key = LP_SAMPLER_OP_TEXTURE << LP_SAMPLER_OP_TYPE_SHIFT;
> + unsigned sample_key = sample_type << LP_SAMPLER_OP_TYPE_SHIFT;
>
> memset(¶ms, 0, sizeof(params));
>
> @@ -3186,7 +3187,7 @@ sample_emit(
> struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
>
> emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_NONE,
> - FALSE, emit_data->output);
> + FALSE, LP_SAMPLER_OP_TEXTURE, emit_data->output);
> }
>
> static void
> @@ -3198,7 +3199,7 @@ sample_b_emit(
> struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
>
> emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_LOD_BIAS,
> - FALSE, emit_data->output);
> + FALSE, LP_SAMPLER_OP_TEXTURE, emit_data->output);
> }
>
> static void
> @@ -3210,7 +3211,7 @@ sample_c_emit(
> struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
>
> emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_NONE,
> - TRUE, emit_data->output);
> + TRUE, LP_SAMPLER_OP_TEXTURE, emit_data->output);
> }
>
> static void
> @@ -3222,7 +3223,7 @@ sample_c_lz_emit(
> struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
>
> emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_LOD_ZERO,
> - TRUE, emit_data->output);
> + TRUE, LP_SAMPLER_OP_TEXTURE, emit_data->output);
> }
>
> static void
> @@ -3234,7 +3235,7 @@ sample_d_emit(
> struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
>
> emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV,
> - FALSE, emit_data->output);
> + FALSE, LP_SAMPLER_OP_TEXTURE, emit_data->output);
> }
>
> static void
> @@ -3246,7 +3247,19 @@ sample_l_emit(
> struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
>
> emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_EXPLICIT_LOD,
> - FALSE, emit_data->output);
> + FALSE, LP_SAMPLER_OP_TEXTURE, emit_data->output);
> +}
> +
> +static void
> +gather4_emit(
> + const struct lp_build_tgsi_action * action,
> + struct lp_build_tgsi_context * bld_base,
> + struct lp_build_emit_data * emit_data)
> +{
> + struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
> +
> + emit_sample(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_NONE,
> + FALSE, LP_SAMPLER_OP_GATHER, emit_data->output);
> }
>
> static void
> @@ -3871,6 +3884,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
> bld.bld_base.op_actions[TGSI_OPCODE_SAMPLE_I].emit = sample_i_emit;
> bld.bld_base.op_actions[TGSI_OPCODE_SAMPLE_I_MS].emit = sample_i_emit;
> bld.bld_base.op_actions[TGSI_OPCODE_SAMPLE_L].emit = sample_l_emit;
> + bld.bld_base.op_actions[TGSI_OPCODE_GATHER4].emit = gather4_emit;
> bld.bld_base.op_actions[TGSI_OPCODE_SVIEWINFO].emit = sviewinfo_emit;
>
> if (gs_iface) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index c58ea6a..1264df0 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -2631,6 +2631,9 @@ exec_sample(struct tgsi_exec_machine *mach,
> lod = &c1;
> control = TGSI_SAMPLER_LOD_EXPLICIT;
> }
> + else if (modifier == TEX_MODIFIER_GATHER) {
> + control = TGSI_SAMPLER_GATHER;
> + }
> else {
> assert(modifier == TEX_MODIFIER_LEVEL_ZERO);
> control = TGSI_SAMPLER_LOD_ZERO;
> @@ -5687,7 +5690,7 @@ exec_instruction(
> break;
>
> case TGSI_OPCODE_GATHER4:
> - assert(0);
> + exec_sample(mach, inst, TEX_MODIFIER_GATHER, FALSE);
> break;
>
> case TGSI_OPCODE_SVIEWINFO:
>
LGTM.
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
More information about the mesa-dev
mailing list