diff options
author | Chia-I Wu <[email protected]> | 2013-05-07 15:32:35 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2013-05-08 10:58:53 +0800 |
commit | 80857d2c8b867f6060451c14e5aff5438f5d30f7 (patch) | |
tree | f38969dcedbc526b543d92a902485c079d36e705 /src/gallium | |
parent | 14a0bb81fef164949aeb2ec2bcfe14fee4627eeb (diff) |
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 <[email protected]>
Acked-by: Roland Scheidegger <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_util.c | 91 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_util.h | 3 |
2 files changed, 94 insertions, 0 deletions
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 |