tgsi: split tgsi_util_get_texture_coord_dim() function into two
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. Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -2054,7 +2054,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)
|
||||
@@ -2153,7 +2154,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++) {
|
||||
|
||||
@@ -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(unsigned 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
return dim;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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(unsigned tgsi_tex);
|
||||
|
||||
int
|
||||
tgsi_util_get_shadow_ref_src_index(unsigned tgsi_tex);
|
||||
|
||||
boolean
|
||||
tgsi_is_shadow_target(unsigned target);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user