[Mesa-dev] [PATCH] tgsi: split tgsi_util_get_texture_coord_dim() function into two
Roland Scheidegger
sroland at vmware.com
Thu Mar 31 16:53:38 UTC 2016
Am 31.03.2016 um 03:06 schrieb Brian Paul:
> It was kind of overloaded, returning two different things. Now get
> the index of the shadow reference src register with a new
> tgsi_util_get_shadow_ref_src_index() function.
>
> To verify the new code, I added some temp/debug code which looped
> over all TGSI_TEXTURE_x values, calling the old function and new and
> checking that the returned indexes matched.
>
> Also tested piglit "shadow" tests with softpipe/llvmpipe.
> No testing of ilo and radeonsi changes.
> ---
> src/gallium/auxiliary/tgsi/tgsi_exec.c | 5 +-
> src/gallium/auxiliary/tgsi/tgsi_util.c | 69 ++++++++++++--------------
> src/gallium/auxiliary/tgsi/tgsi_util.h | 5 +-
> src/gallium/drivers/ilo/shader/ilo_shader_fs.c | 4 +-
> src/gallium/drivers/ilo/shader/ilo_shader_vs.c | 3 +-
> src/gallium/drivers/radeonsi/si_shader.c | 7 ++-
> 6 files changed, 46 insertions(+), 47 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index 126259f..d731721 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -2046,7 +2046,8 @@ exec_tex(struct tgsi_exec_machine *mach,
> assert(modifier != TEX_MODIFIER_LEVEL_ZERO);
> assert(inst->Texture.Texture != TGSI_TEXTURE_BUFFER);
>
> - dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture, &shadow_ref);
> + dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture);
> + shadow_ref = tgsi_util_get_shadow_ref_src_index(inst->Texture.Texture);
>
> assert(dim <= 4);
> if (shadow_ref >= 0)
> @@ -2145,7 +2146,7 @@ exec_lodq(struct tgsi_exec_machine *mach,
> union tgsi_exec_channel r[2];
>
> unit = fetch_sampler_unit(mach, inst, 1);
> - dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture, NULL);
> + dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture);
> assert(dim <= Elements(coords));
> /* fetch coordinates */
> for (i = 0; i < dim; i++) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_util.c b/src/gallium/auxiliary/tgsi/tgsi_util.c
> index 5fff3f0..b38c113 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_util.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_util.c
> @@ -375,10 +375,8 @@ tgsi_util_get_src_from_ind(const struct tgsi_ind_register *reg)
> * sample index.
> */
> int
> -tgsi_util_get_texture_coord_dim(int tgsi_tex, int *shadow_or_sample)
> +tgsi_util_get_texture_coord_dim(int tgsi_tex)
> {
> - int dim;
> -
> /*
> * Depending on the texture target, (src0.xyzw, src1.x) is interpreted
> * differently:
> @@ -407,8 +405,7 @@ tgsi_util_get_texture_coord_dim(int tgsi_tex, int *shadow_or_sample)
> case TGSI_TEXTURE_BUFFER:
> case TGSI_TEXTURE_1D:
> case TGSI_TEXTURE_SHADOW1D:
> - dim = 1;
> - break;
> + return 1;
> case TGSI_TEXTURE_2D:
> case TGSI_TEXTURE_RECT:
> case TGSI_TEXTURE_1D_ARRAY:
> @@ -416,52 +413,48 @@ tgsi_util_get_texture_coord_dim(int tgsi_tex, int *shadow_or_sample)
> case TGSI_TEXTURE_SHADOWRECT:
> case TGSI_TEXTURE_SHADOW1D_ARRAY:
> case TGSI_TEXTURE_2D_MSAA:
> - dim = 2;
> - break;
> + return 2;
> case TGSI_TEXTURE_3D:
> case TGSI_TEXTURE_CUBE:
> case TGSI_TEXTURE_2D_ARRAY:
> case TGSI_TEXTURE_SHADOWCUBE:
> case TGSI_TEXTURE_SHADOW2D_ARRAY:
> case TGSI_TEXTURE_2D_ARRAY_MSAA:
> - dim = 3;
> - break;
> + return 3;
> case TGSI_TEXTURE_CUBE_ARRAY:
> case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
> - dim = 4;
> - break;
> + return 4;
> default:
> assert(!"unknown texture target");
> - dim = 0;
> - break;
> + return 0;
> }
> +}
>
> - if (shadow_or_sample) {
> - switch (tgsi_tex) {
> - case TGSI_TEXTURE_SHADOW1D:
> - /* there is a gap */
> - *shadow_or_sample = 2;
> - break;
> - case TGSI_TEXTURE_SHADOW2D:
> - case TGSI_TEXTURE_SHADOWRECT:
> - case TGSI_TEXTURE_SHADOWCUBE:
> - case TGSI_TEXTURE_SHADOW1D_ARRAY:
> - case TGSI_TEXTURE_SHADOW2D_ARRAY:
> - case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
> - *shadow_or_sample = dim;
> - break;
> - case TGSI_TEXTURE_2D_MSAA:
> - case TGSI_TEXTURE_2D_ARRAY_MSAA:
> - *shadow_or_sample = 3;
> - break;
> - default:
> - /* no shadow nor sample */
> - *shadow_or_sample = -1;
> - break;
> - }
> - }
>
> - return dim;
> +/**
> + * Given a TGSI_TEXTURE_x target, return the src register index for the
> + * shadow reference coordinate.
> + */
> +int
> +tgsi_util_get_shadow_ref_src_index(unsigned tgsi_tex)
> +{
> + switch (tgsi_tex) {
> + case TGSI_TEXTURE_SHADOW1D:
> + case TGSI_TEXTURE_SHADOW2D:
> + case TGSI_TEXTURE_SHADOWRECT:
> + case TGSI_TEXTURE_SHADOW1D_ARRAY:
> + return 2;
> + case TGSI_TEXTURE_SHADOWCUBE:
> + case TGSI_TEXTURE_SHADOW2D_ARRAY:
> + case TGSI_TEXTURE_2D_MSAA:
> + case TGSI_TEXTURE_2D_ARRAY_MSAA:
> + return 3;
> + case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
> + return 4;
> + default:
> + /* no shadow nor sample */
> + return -1;
> + }
> }
>
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_util.h b/src/gallium/auxiliary/tgsi/tgsi_util.h
> index 6175d95..b360453 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_util.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_util.h
> @@ -80,7 +80,10 @@ struct tgsi_src_register
> tgsi_util_get_src_from_ind(const struct tgsi_ind_register *reg);
>
> int
> -tgsi_util_get_texture_coord_dim(int tgsi_tex, int *shadow_or_sample);
> +tgsi_util_get_texture_coord_dim(int tgsi_tex);
> +
> +int
> +tgsi_util_get_shadow_ref_src_index(unsigned tgsi_tex);
>
> boolean
> tgsi_is_shadow_target(unsigned target);
> diff --git a/src/gallium/drivers/ilo/shader/ilo_shader_fs.c b/src/gallium/drivers/ilo/shader/ilo_shader_fs.c
> index f46126e..6c8f1b5 100644
> --- a/src/gallium/drivers/ilo/shader/ilo_shader_fs.c
> +++ b/src/gallium/drivers/ilo/shader/ilo_shader_fs.c
> @@ -740,7 +740,9 @@ fs_prepare_tgsi_sampling(struct fs_compile_context *fcc,
> break;
> }
>
> - num_coords = tgsi_util_get_texture_coord_dim(inst->tex.target, &ref_pos);
> + num_coords = tgsi_util_get_texture_coord_dim(inst->tex.target);
> + ref_pos = tgsi_util_get_shadow_ref_src_index(inst->tex.target);
> +
> tsrc_transpose(inst->src[0], coords);
> bias_or_lod = tsrc_null();
> ref_or_si = tsrc_null();
> diff --git a/src/gallium/drivers/ilo/shader/ilo_shader_vs.c b/src/gallium/drivers/ilo/shader/ilo_shader_vs.c
> index 0df0afc..2b46d44 100644
> --- a/src/gallium/drivers/ilo/shader/ilo_shader_vs.c
> +++ b/src/gallium/drivers/ilo/shader/ilo_shader_vs.c
> @@ -407,7 +407,8 @@ vs_prepare_tgsi_sampling(struct vs_compile_context *vcc,
> num_derivs = 0;
> sampler_src = 1;
>
> - num_coords = tgsi_util_get_texture_coord_dim(inst->tex.target, &ref_pos);
> + num_coords = tgsi_util_get_texture_coord_dim(inst->tex.target);
> + ref_pos = tgsi_util_get_shadow_ref_src_index(inst->tex.target);
>
> /* extract the parameters */
> switch (inst->opcode) {
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 9eb531f..4176e9f 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -2874,8 +2874,7 @@ static LLVMValueRef image_fetch_coords(
> struct gallivm_state *gallivm = bld_base->base.gallivm;
> LLVMBuilderRef builder = gallivm->builder;
> unsigned target = inst->Memory.Texture;
> - int sample;
> - unsigned num_coords = tgsi_util_get_texture_coord_dim(target, &sample);
> + unsigned num_coords = tgsi_util_get_texture_coord_dim(target);
> LLVMValueRef coords[4];
> LLVMValueRef tmp;
> int chan;
> @@ -3387,8 +3386,8 @@ static void tex_fetch_args(
> unsigned target = inst->Texture.Texture;
> LLVMValueRef coords[5], derivs[6];
> LLVMValueRef address[16];
> - int ref_pos;
> - unsigned num_coords = tgsi_util_get_texture_coord_dim(target, &ref_pos);
> + unsigned num_coords = tgsi_util_get_texture_coord_dim(target);
> + int ref_pos = tgsi_util_get_shadow_ref_src_index(target);
> unsigned count = 0;
> unsigned chan;
> unsigned num_deriv_channels = 0;
>
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
More information about the mesa-dev
mailing list