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 <srol...@vmware.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev