[Mesa-stable] [Mesa-dev] [PATCH 1/2] st/nine: sm1_declusage_to_tgsi, do not restrict indices with TGSI_SEMANTIC_GENERIC
Marek Olšák
maraeo at gmail.com
Fri Nov 28 01:40:01 PST 2014
This looks good to me.
FYI, it will break r300g, which can be fixed in r300g.
Marek
On Thu, Nov 27, 2014 at 11:13 AM, Axel Davy <axel.davy at ens.fr> wrote:
> With sm3, you can declare an input/output with an usage and an usage index.
>
> Nine code hardcodes the translation usage/index to a corresponding TGSI code.
> The translation was limited to a few usage/index combinations that were corresponding
> to most of the needs of games, but some games did not work.
>
> This patch rewrites that Nine code to map all possible usage/index combination
> to TGSI code. The index associated to TGSI_SEMANTIC_GENERIC doesn't need to be low
> for good performance, as the old code was supposing, and is not particularly bounded
> (it's UINT16). Given the index is BYTE, we can map all combinations.
>
> Cc: "10.4" <mesa-stable at lists.freedesktop.org>
> Tested-by: Yaroslav Andrusyak <pontostroy at gmail.com>
> Signed-off-by: Axel Davy <axel.davy at ens.fr>
> ---
> src/gallium/state_trackers/nine/nine_shader.c | 112 ++++++++++++--------------
> 1 file changed, 52 insertions(+), 60 deletions(-)
>
> diff --git a/src/gallium/state_trackers/nine/nine_shader.c b/src/gallium/state_trackers/nine/nine_shader.c
> index 4f78f6e..3c39b24 100644
> --- a/src/gallium/state_trackers/nine/nine_shader.c
> +++ b/src/gallium/state_trackers/nine/nine_shader.c
> @@ -1677,101 +1677,93 @@ sm1_declusage_to_tgsi(struct tgsi_declaration_semantic *sem,
> boolean tc,
> struct sm1_semantic *dcl)
> {
> - const unsigned generic_base = tc ? 0 : 8; /* TEXCOORD[0..7] */
> + BYTE index = dcl->usage_idx;
>
> - sem->Name = TGSI_SEMANTIC_GENERIC;
> - sem->Index = 0;
> -
> - /* TGSI_SEMANTIC_GENERIC assignments (+8 if !PIPE_CAP_TGSI_TEXCOORD):
> - * Try to put frequently used semantics at low GENERIC indices.
> + /* For everything that is not matching to a TGSI_SEMANTIC_****,
> + * we match to a TGSI_SEMANTIC_GENERIC with index.
> + *
> + * The index can be anything UINT16 and usage_idx is BYTE,
> + * so we can fit everything. It doesn't matter if indices
> + * are close together or low.
> *
> - * POSITION[1..4]: 17, 27, 28, 29
> - * COLOR[2..4]: 14, 15, 26
> - * TEXCOORD[8..15]: 10, 11, 18, 19, 20, 21, 22, 23
> - * BLENDWEIGHT[0..3]: 0, 4, 8, 12
> - * BLENDINDICES[0..3]: 1, 5, 9, 13
> - * NORMAL[0..1]: 2, 6
> - * TANGENT[0]: 3, 24
> - * BINORMAL[0]: 7, 25
> - * TESSFACTOR[0]: 16
> + *
> + * POSITION >= 1: 10 * index + 6
> + * COLOR >= 2: 10 * (index-1) + 7
> + * TEXCOORD[0..15]: index
> + * BLENDWEIGHT: 10 * index + 18
> + * BLENDINDICES: 10 * index + 19
> + * NORMAL: 10 * index + 20
> + * TANGENT: 10 * index + 21
> + * BINORMAL: 10 * index + 22
> + * TESSFACTOR: 10 * index + 23
> */
>
> switch (dcl->usage) {
> case D3DDECLUSAGE_POSITION:
> case D3DDECLUSAGE_POSITIONT:
> case D3DDECLUSAGE_DEPTH:
> - sem->Name = TGSI_SEMANTIC_POSITION;
> - assert(dcl->usage_idx <= 4);
> - if (dcl->usage_idx == 1) {
> - sem->Name = TGSI_SEMANTIC_GENERIC;
> - sem->Index = generic_base + 17;
> - } else
> - if (dcl->usage_idx >= 2) {
> + if (index == 0) {
> + sem->Name = TGSI_SEMANTIC_POSITION;
> + sem->Index = 0;
> + } else {
> sem->Name = TGSI_SEMANTIC_GENERIC;
> - sem->Index = generic_base + 27 + (dcl->usage_idx - 2);
> + sem->Index = 10 * index + 6;
> }
> break;
> case D3DDECLUSAGE_COLOR:
> - assert(dcl->usage_idx <= 4);
> - if (dcl->usage_idx < 2) {
> + if (index < 2) {
> sem->Name = TGSI_SEMANTIC_COLOR;
> - sem->Index = dcl->usage_idx;
> - } else
> - if (dcl->usage_idx < 4) {
> - sem->Index = generic_base + 14 + (dcl->usage_idx - 2);
> + sem->Index = index;
> } else {
> - sem->Index = generic_base + 26;
> + sem->Name = TGSI_SEMANTIC_GENERIC;
> + sem->Index = 10 * (index-1) + 7;
> }
> break;
> case D3DDECLUSAGE_FOG:
> + assert(index == 0);
> sem->Name = TGSI_SEMANTIC_FOG;
> - assert(dcl->usage_idx == 0);
> + sem->Index = 0;
> break;
> case D3DDECLUSAGE_PSIZE:
> + assert(index == 0);
> sem->Name = TGSI_SEMANTIC_PSIZE;
> - assert(dcl->usage_idx == 0);
> + sem->Index = 0;
> break;
> case D3DDECLUSAGE_TEXCOORD:
> - assert(dcl->usage_idx < 16);
> - if (dcl->usage_idx < 8) {
> - if (tc)
> - sem->Name = TGSI_SEMANTIC_TEXCOORD;
> - sem->Index = dcl->usage_idx;
> - } else
> - if (dcl->usage_idx < 10) {
> - sem->Index = generic_base + 10 + (dcl->usage_idx - 8);
> - } else {
> - sem->Index = generic_base + 18 + (dcl->usage_idx - 10);
> - }
> + assert(index < 16);
> + if (index < 8 && tc)
> + sem->Name = TGSI_SEMANTIC_TEXCOORD;
> + else
> + sem->Name = TGSI_SEMANTIC_GENERIC;
> + sem->Index = index;
> break;
> - case D3DDECLUSAGE_BLENDWEIGHT: /* 0, 4, 8, 12 */
> - assert(dcl->usage_idx < 4);
> - sem->Index = generic_base + dcl->usage_idx * 4;
> + case D3DDECLUSAGE_BLENDWEIGHT:
> + sem->Name = TGSI_SEMANTIC_GENERIC;
> + sem->Index = 10 * index + 18;
> break;
> - case D3DDECLUSAGE_BLENDINDICES: /* 1, 5, 9, 13 */
> - assert(dcl->usage_idx < 4);
> - sem->Index = generic_base + dcl->usage_idx * 4 + 1;
> + case D3DDECLUSAGE_BLENDINDICES:
> + sem->Name = TGSI_SEMANTIC_GENERIC;
> + sem->Index = 10 * index + 19;
> break;
> - case D3DDECLUSAGE_NORMAL: /* 2, 3 */
> - assert(dcl->usage_idx < 2);
> - sem->Index = generic_base + 2 + dcl->usage_idx * 4;
> + case D3DDECLUSAGE_NORMAL:
> + sem->Name = TGSI_SEMANTIC_GENERIC;
> + sem->Index = 10 * index + 20;
> break;
> case D3DDECLUSAGE_TANGENT:
> - /* Yes these are weird, but we try to fit the more frequently used
> - * into lower slots. */
> - assert(dcl->usage_idx <= 1);
> - sem->Index = generic_base + (dcl->usage_idx ? 24 : 3);
> + sem->Name = TGSI_SEMANTIC_GENERIC;
> + sem->Index = 10 * index + 21;
> break;
> case D3DDECLUSAGE_BINORMAL:
> - assert(dcl->usage_idx <= 1);
> - sem->Index = generic_base + (dcl->usage_idx ? 25 : 7);
> + sem->Name = TGSI_SEMANTIC_GENERIC;
> + sem->Index = 10 * index + 22;
> break;
> case D3DDECLUSAGE_TESSFACTOR:
> - assert(dcl->usage_idx == 0);
> - sem->Index = generic_base + 16;
> + sem->Name = TGSI_SEMANTIC_GENERIC;
> + sem->Index = 10 * index + 23;
> break;
> case D3DDECLUSAGE_SAMPLE:
> sem->Name = TGSI_SEMANTIC_COUNT;
> + sem->Index = 0;
> break;
> default:
> assert(!"Invalid DECLUSAGE.");
> --
> 2.1.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-stable
mailing list