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.d...@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-sta...@lists.freedesktop.org> > Tested-by: Yaroslav Andrusyak <pontost...@gmail.com> > Signed-off-by: Axel Davy <axel.d...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev