From 80857d2c8b867f6060451c14e5aff5438f5d30f7 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 7 May 2013 15:32:35 +0800 Subject: [PATCH] tgsi: add tgsi_util_get_texture_coord_dim() This util function returns the dimension of the texture coordinates for a texture target, and the location of the shadow reference value. For example, when the texture target is TGSI_TEXTURE_SHADOW2D, the dimension of the texture coordinates is 2, and the location of the ref value is 2 (that is, the Z channel). Signed-off-by: Chia-I Wu Acked-by: Roland Scheidegger --- src/gallium/auxiliary/tgsi/tgsi_util.c | 91 ++++++++++++++++++++++++++ src/gallium/auxiliary/tgsi/tgsi_util.h | 3 + 2 files changed, 94 insertions(+) diff --git a/src/gallium/auxiliary/tgsi/tgsi_util.c b/src/gallium/auxiliary/tgsi/tgsi_util.c index 90179c81bbb..862b79f173e 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_util.c +++ b/src/gallium/auxiliary/tgsi/tgsi_util.c @@ -338,3 +338,94 @@ tgsi_util_get_src_from_ind(const struct tgsi_ind_register *reg) return src; } + +/** + * Return the dimension of the texture coordinates (layer included for array + * textures), as well as the location of the shadow reference value or the + * sample index. + */ +int +tgsi_util_get_texture_coord_dim(int tgsi_tex, int *shadow_or_sample) +{ + int dim; + + /* + * Depending on the texture target, (src0.xyzw, src1.x) is interpreted + * differently: + * + * (s, X, X, X, X), for 1D + * (s, t, X, X, X), for 2D, RECT + * (s, t, r, X, X), for 3D, CUBE + * + * (s, layer, X, X, X), for 1D_ARRAY + * (s, t, layer, X, X), for 2D_ARRAY + * (s, t, r, layer, X), for CUBE_ARRAY + * + * (s, X, shadow, X, X), for SHADOW1D + * (s, t, shadow, X, X), for SHADOW2D, SHADOWRECT + * (s, t, r, shadow, X), for SHADOWCUBE + * + * (s, layer, shadow, X, X), for SHADOW1D_ARRAY + * (s, t, layer, shadow, X), for SHADOW2D_ARRAY + * (s, t, r, layer, shadow), for SHADOWCUBE_ARRAY + * + * (s, t, sample, X, X), for 2D_MSAA + * (s, t, layer, sample, X), for 2D_ARRAY_MSAA + */ + switch (tgsi_tex) { + case TGSI_TEXTURE_1D: + case TGSI_TEXTURE_SHADOW1D: + dim = 1; + break; + case TGSI_TEXTURE_2D: + case TGSI_TEXTURE_RECT: + case TGSI_TEXTURE_1D_ARRAY: + case TGSI_TEXTURE_SHADOW2D: + case TGSI_TEXTURE_SHADOWRECT: + case TGSI_TEXTURE_SHADOW1D_ARRAY: + case TGSI_TEXTURE_2D_MSAA: + dim = 2; + break; + 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; + case TGSI_TEXTURE_CUBE_ARRAY: + case TGSI_TEXTURE_SHADOWCUBE_ARRAY: + dim = 4; + break; + default: + assert(!"unknown texture target"); + dim = 0; + break; + } + + 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: + case TGSI_TEXTURE_2D_MSAA: + case TGSI_TEXTURE_2D_ARRAY_MSAA: + *shadow_or_sample = dim; + break; + default: + /* no shadow nor sample */ + *shadow_or_sample = -1; + break; + } + } + + return dim; +} diff --git a/src/gallium/auxiliary/tgsi/tgsi_util.h b/src/gallium/auxiliary/tgsi/tgsi_util.h index d9f8859a353..c1184c8b465 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_util.h +++ b/src/gallium/auxiliary/tgsi/tgsi_util.h @@ -79,6 +79,9 @@ tgsi_util_get_inst_usage_mask(const struct tgsi_full_instruction *inst, 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); + #if defined __cplusplus } #endif -- 2.30.2