st/nine: Fix vertex declarations for non-standard (usage/index)

Nine code to match vertex declaration to vs inputs was limiting
the number of possible combinations.

Some sm3 games have issues with that, because arbitrary (usage/index)
can be used.

This patch does the following changes to fix the problem:
. Change the numbers given to (usage/index) combinations to uint16
. Do not put limits on the indices when it doesn't make sense
. change the conversion rule (usage/index) -> number to fit all combinations
. Instead of having a table usage_map mapping a (usage/index) number to
an input index, usage_map maps input indices to their (usage/index)

Cc: "10.4" <mesa-stable@lists.freedesktop.org>
Tested-by: Yaroslav Andrusyak <pontostroy@gmail.com>
Acked-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Axel Davy <axel.davy@ens.fr>
This commit is contained in:
Axel Davy 2014-11-26 22:32:57 +01:00
parent 5d6d260833
commit 712a4c5438
7 changed files with 88 additions and 107 deletions

View file

@ -30,25 +30,27 @@
#define NINE_RESOURCE_FLAG_DUMMY (PIPE_RESOURCE_FLAG_ST_PRIV << 2) #define NINE_RESOURCE_FLAG_DUMMY (PIPE_RESOURCE_FLAG_ST_PRIV << 2)
/* vertexdeclaration9.c */ /* vertexdeclaration9.c */
unsigned nine_d3d9_to_nine_declusage(unsigned usage, unsigned index); uint16_t nine_d3d9_to_nine_declusage(unsigned usage, unsigned index);
#define NINE_DECLUSAGE_POSITION(i) ( 0 + (i)) #define NINE_DECLUSAGE_POSITION 0
#define NINE_DECLUSAGE_BLENDWEIGHT(i) ( 5 + (i)) #define NINE_DECLUSAGE_BLENDWEIGHT 1
#define NINE_DECLUSAGE_BLENDINDICES(i) ( 9 + (i)) #define NINE_DECLUSAGE_BLENDINDICES 2
#define NINE_DECLUSAGE_NORMAL(i) (13 + (i)) #define NINE_DECLUSAGE_NORMAL 3
#define NINE_DECLUSAGE_PSIZE 15 #define NINE_DECLUSAGE_TEXCOORD 4
#define NINE_DECLUSAGE_TEXCOORD(i) (16 + (i)) #define NINE_DECLUSAGE_TANGENT 5
#define NINE_DECLUSAGE_TANGENT(i) (32 + (i)) #define NINE_DECLUSAGE_BINORMAL 6
#define NINE_DECLUSAGE_BINORMAL(i) (34 + (i)) #define NINE_DECLUSAGE_COLOR 7
#define NINE_DECLUSAGE_TESSFACTOR 36 #define NINE_DECLUSAGE_POSITIONT 8
#define NINE_DECLUSAGE_POSITIONT 37
#define NINE_DECLUSAGE_COLOR(i) (38 + (i)) #define NINE_DECLUSAGE_PSIZE 9
#define NINE_DECLUSAGE_DEPTH 43 #define NINE_DECLUSAGE_TESSFACTOR 10
#define NINE_DECLUSAGE_FOG 44 #define NINE_DECLUSAGE_DEPTH 11
#define NINE_DECLUSAGE_SAMPLE 45 #define NINE_DECLUSAGE_FOG 12
#define NINE_DECLUSAGE_NONE 46 #define NINE_DECLUSAGE_SAMPLE 13
#define NINE_DECLUSAGE_LAST NINE_DECLUSAGE_NONE #define NINE_DECLUSAGE_NONE 14
#define NINE_DECLUSAGE_COUNT (NINE_DECLUSAGE_LAST + 1) #define NINE_DECLUSAGE_COUNT (NINE_DECLUSAGE_NONE + 1)
#define NINE_DECLUSAGE_i(declusage, n) NINE_DECLUSAGE_##declusage + n * NINE_DECLUSAGE_COUNT
#define NINED3DCLEAR_DEPTHSTENCIL (D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL) #define NINED3DCLEAR_DEPTHSTENCIL (D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL)

View file

@ -275,7 +275,7 @@ struct vs_build_ctx
struct ureg_program *ureg; struct ureg_program *ureg;
const struct nine_ff_vs_key *key; const struct nine_ff_vs_key *key;
unsigned input[PIPE_MAX_ATTRIBS]; uint16_t input[PIPE_MAX_ATTRIBS];
unsigned num_inputs; unsigned num_inputs;
struct ureg_src aVtx; struct ureg_src aVtx;
@ -304,7 +304,7 @@ get_texcoord_sn(struct pipe_screen *screen)
} }
static INLINE struct ureg_src static INLINE struct ureg_src
build_vs_add_input(struct vs_build_ctx *vs, unsigned ndecl) build_vs_add_input(struct vs_build_ctx *vs, uint16_t ndecl)
{ {
const unsigned i = vs->num_inputs++; const unsigned i = vs->num_inputs++;
assert(i < PIPE_MAX_ATTRIBS); assert(i < PIPE_MAX_ATTRIBS);
@ -370,10 +370,10 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
* (texture coordinates handled later) * (texture coordinates handled later)
*/ */
vs->aVtx = build_vs_add_input(vs, vs->aVtx = build_vs_add_input(vs,
key->position_t ? NINE_DECLUSAGE_POSITIONT : NINE_DECLUSAGE_POSITION(0)); key->position_t ? NINE_DECLUSAGE_POSITIONT : NINE_DECLUSAGE_POSITION);
if (need_rNrm) if (need_rNrm)
vs->aNrm = build_vs_add_input(vs, NINE_DECLUSAGE_NORMAL(0)); vs->aNrm = build_vs_add_input(vs, NINE_DECLUSAGE_NORMAL);
vs->aCol[0] = ureg_imm1f(ureg, 1.0f); vs->aCol[0] = ureg_imm1f(ureg, 1.0f);
vs->aCol[1] = ureg_imm1f(ureg, 1.0f); vs->aCol[1] = ureg_imm1f(ureg, 1.0f);
@ -382,9 +382,9 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
const unsigned mask = key->mtl_diffuse | key->mtl_specular | const unsigned mask = key->mtl_diffuse | key->mtl_specular |
key->mtl_ambient | key->mtl_emissive; key->mtl_ambient | key->mtl_emissive;
if ((mask & 0x1) && !key->color0in_one) if ((mask & 0x1) && !key->color0in_one)
vs->aCol[0] = build_vs_add_input(vs, NINE_DECLUSAGE_COLOR(0)); vs->aCol[0] = build_vs_add_input(vs, NINE_DECLUSAGE_i(COLOR, 0));
if ((mask & 0x2) && !key->color1in_one) if ((mask & 0x2) && !key->color1in_one)
vs->aCol[1] = build_vs_add_input(vs, NINE_DECLUSAGE_COLOR(1)); vs->aCol[1] = build_vs_add_input(vs, NINE_DECLUSAGE_i(COLOR, 1));
vs->mtlD = MATERIAL_CONST(1); vs->mtlD = MATERIAL_CONST(1);
vs->mtlA = MATERIAL_CONST(2); vs->mtlA = MATERIAL_CONST(2);
@ -399,20 +399,20 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
if (key->mtl_emissive == 1) vs->mtlE = vs->aCol[0]; else if (key->mtl_emissive == 1) vs->mtlE = vs->aCol[0]; else
if (key->mtl_emissive == 2) vs->mtlE = vs->aCol[1]; if (key->mtl_emissive == 2) vs->mtlE = vs->aCol[1];
} else { } else {
if (!key->color0in_one) vs->aCol[0] = build_vs_add_input(vs, NINE_DECLUSAGE_COLOR(0)); if (!key->color0in_one) vs->aCol[0] = build_vs_add_input(vs, NINE_DECLUSAGE_i(COLOR, 0));
if (!key->color1in_one) vs->aCol[1] = build_vs_add_input(vs, NINE_DECLUSAGE_COLOR(1)); if (!key->color1in_one) vs->aCol[1] = build_vs_add_input(vs, NINE_DECLUSAGE_i(COLOR, 1));
} }
if (key->vertexpointsize) if (key->vertexpointsize)
vs->aPsz = build_vs_add_input(vs, NINE_DECLUSAGE_PSIZE); vs->aPsz = build_vs_add_input(vs, NINE_DECLUSAGE_PSIZE);
if (key->vertexblend_indexed) if (key->vertexblend_indexed)
vs->aInd = build_vs_add_input(vs, NINE_DECLUSAGE_BLENDINDICES(0)); vs->aInd = build_vs_add_input(vs, NINE_DECLUSAGE_BLENDINDICES);
if (key->vertexblend) if (key->vertexblend)
vs->aWgt = build_vs_add_input(vs, NINE_DECLUSAGE_BLENDWEIGHT(0)); vs->aWgt = build_vs_add_input(vs, NINE_DECLUSAGE_BLENDWEIGHT);
if (key->vertextween) { if (key->vertextween) {
vs->aVtx1 = build_vs_add_input(vs, NINE_DECLUSAGE_POSITION(1)); vs->aVtx1 = build_vs_add_input(vs, NINE_DECLUSAGE_i(POSITION,1));
vs->aNrm1 = build_vs_add_input(vs, NINE_DECLUSAGE_NORMAL(1)); vs->aNrm1 = build_vs_add_input(vs, NINE_DECLUSAGE_i(NORMAL,1));
} }
/* Declare outputs: /* Declare outputs:
@ -596,7 +596,7 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
oTex[i] = ureg_DECL_output(ureg, texcoord_sn, i); oTex[i] = ureg_DECL_output(ureg, texcoord_sn, i);
if (tci == NINED3DTSS_TCI_PASSTHRU) if (tci == NINED3DTSS_TCI_PASSTHRU)
vs->aTex[idx] = build_vs_add_input(vs, NINE_DECLUSAGE_TEXCOORD(idx)); vs->aTex[idx] = build_vs_add_input(vs, NINE_DECLUSAGE_i(TEXCOORD,idx));
if (!dim) { if (!dim) {
dst[c = 4] = oTex[i]; dst[c = 4] = oTex[i];
@ -1374,7 +1374,7 @@ nine_ff_get_vs(struct NineDevice9 *device)
enum pipe_error err; enum pipe_error err;
struct vs_build_ctx bld; struct vs_build_ctx bld;
struct nine_ff_vs_key key; struct nine_ff_vs_key key;
unsigned s; unsigned s, i;
assert(sizeof(key) <= sizeof(key.value32)); assert(sizeof(key) <= sizeof(key.value32));
@ -1385,15 +1385,20 @@ nine_ff_get_vs(struct NineDevice9 *device)
/* FIXME: this shouldn't be NULL, but it is on init */ /* FIXME: this shouldn't be NULL, but it is on init */
if (state->vdecl) { if (state->vdecl) {
if (state->vdecl->usage_map[NINE_DECLUSAGE_POSITIONT] != 0xff)
key.position_t = 1;
if (state->vdecl->usage_map[NINE_DECLUSAGE_COLOR(0)] == 0xff)
key.color0in_one = 1; key.color0in_one = 1;
if (state->vdecl->usage_map[NINE_DECLUSAGE_COLOR(1)] == 0xff)
key.color1in_one = 1; key.color1in_one = 1;
if (state->vdecl->usage_map[NINE_DECLUSAGE_PSIZE] != 0xff) for (i = 0; i < state->vdecl->nelems; i++) {
uint16_t usage = state->vdecl->usage_map[i];
if (usage == NINE_DECLUSAGE_POSITIONT)
key.position_t = 1;
else if (usage == NINE_DECLUSAGE_i(COLOR, 0))
key.color0in_one = 0;
else if (usage == NINE_DECLUSAGE_i(COLOR, 1))
key.color1in_one = 0;
else if (usage == NINE_DECLUSAGE_PSIZE)
key.vertexpointsize = 1; key.vertexpointsize = 1;
} }
}
if (!key.vertexpointsize) if (!key.vertexpointsize)
key.pointscale = !!state->rs[D3DRS_POINTSCALEENABLE]; key.pointscale = !!state->rs[D3DRS_POINTSCALEENABLE];

View file

@ -48,7 +48,7 @@ struct nine_shader_info
void *cso; /* out, pipe cso for bind_vs,fs_state */ void *cso; /* out, pipe cso for bind_vs,fs_state */
uint8_t input_map[PIPE_MAX_ATTRIBS]; /* VS input -> NINE_DECLUSAGE_x */ uint16_t input_map[PIPE_MAX_ATTRIBS]; /* VS input -> NINE_DECLUSAGE_x */
uint8_t num_inputs; /* there may be unused inputs (NINE_DECLUSAGE_NONE) */ uint8_t num_inputs; /* there may be unused inputs (NINE_DECLUSAGE_NONE) */
boolean position_t; /* out, true if VP writes pre-transformed position */ boolean position_t; /* out, true if VP writes pre-transformed position */

View file

@ -184,7 +184,8 @@ update_vertex_elements(struct NineDevice9 *device)
struct nine_state *state = &device->state; struct nine_state *state = &device->state;
const struct NineVertexDeclaration9 *vdecl = device->state.vdecl; const struct NineVertexDeclaration9 *vdecl = device->state.vdecl;
const struct NineVertexShader9 *vs; const struct NineVertexShader9 *vs;
unsigned n, l, b; unsigned n, b, i;
int index;
struct pipe_vertex_element ve[PIPE_MAX_ATTRIBS]; struct pipe_vertex_element ve[PIPE_MAX_ATTRIBS];
state->stream_usage_mask = 0; state->stream_usage_mask = 0;
@ -197,11 +198,16 @@ update_vertex_elements(struct NineDevice9 *device)
DBG("looking up input %u (usage %u) from vdecl(%p)\n", DBG("looking up input %u (usage %u) from vdecl(%p)\n",
n, vs->input_map[n].ndecl, vdecl); n, vs->input_map[n].ndecl, vdecl);
assert(vs->input_map[n].ndecl < Elements(vdecl->usage_map)); index = -1;
l = vdecl->usage_map[vs->input_map[n].ndecl]; for (i = 0; i < vdecl->nelems; i++) {
if (vdecl->usage_map[i] == vs->input_map[n].ndecl) {
index = i;
break;
}
}
if (likely(l < vdecl->nelems)) { if (index >= 0) {
ve[n] = vdecl->elems[l]; ve[n] = vdecl->elems[index];
b = ve[n].vertex_buffer_index; b = ve[n].vertex_buffer_index;
state->stream_usage_mask |= 1 << b; state->stream_usage_mask |= 1 << b;
/* XXX wine just uses 1 here: */ /* XXX wine just uses 1 here: */

View file

@ -95,21 +95,20 @@ nine_d3ddeclusage_check(unsigned usage, unsigned usage_idx)
{ {
switch (usage) { switch (usage) {
case D3DDECLUSAGE_POSITIONT: case D3DDECLUSAGE_POSITIONT:
case D3DDECLUSAGE_PSIZE:
case D3DDECLUSAGE_TESSFACTOR: case D3DDECLUSAGE_TESSFACTOR:
case D3DDECLUSAGE_DEPTH: case D3DDECLUSAGE_DEPTH:
case D3DDECLUSAGE_FOG:
case D3DDECLUSAGE_SAMPLE:
return usage_idx <= 0;
case D3DDECLUSAGE_NORMAL: case D3DDECLUSAGE_NORMAL:
case D3DDECLUSAGE_TANGENT: case D3DDECLUSAGE_TANGENT:
case D3DDECLUSAGE_BINORMAL: case D3DDECLUSAGE_BINORMAL:
return usage_idx <= 1;
case D3DDECLUSAGE_POSITION: case D3DDECLUSAGE_POSITION:
case D3DDECLUSAGE_BLENDWEIGHT: case D3DDECLUSAGE_BLENDWEIGHT:
case D3DDECLUSAGE_BLENDINDICES: case D3DDECLUSAGE_BLENDINDICES:
case D3DDECLUSAGE_COLOR: case D3DDECLUSAGE_COLOR:
return usage_idx <= 4; return TRUE;
case D3DDECLUSAGE_PSIZE:
case D3DDECLUSAGE_FOG:
case D3DDECLUSAGE_SAMPLE:
return usage_idx <= 0;
case D3DDECLUSAGE_TEXCOORD: case D3DDECLUSAGE_TEXCOORD:
return usage_idx <= 15; return usage_idx <= 15;
default: default:
@ -118,8 +117,8 @@ nine_d3ddeclusage_check(unsigned usage, unsigned usage_idx)
} }
#define NINE_DECLUSAGE_CASE0(n) case D3DDECLUSAGE_##n: return NINE_DECLUSAGE_##n #define NINE_DECLUSAGE_CASE0(n) case D3DDECLUSAGE_##n: return NINE_DECLUSAGE_##n
#define NINE_DECLUSAGE_CASEi(n) case D3DDECLUSAGE_##n: return NINE_DECLUSAGE_##n(usage_idx) #define NINE_DECLUSAGE_CASEi(n) case D3DDECLUSAGE_##n: return NINE_DECLUSAGE_i(n, usage_idx)
INLINE unsigned uint16_t
nine_d3d9_to_nine_declusage(unsigned usage, unsigned usage_idx) nine_d3d9_to_nine_declusage(unsigned usage, unsigned usage_idx)
{ {
if (!nine_d3ddeclusage_check(usage, usage_idx)) if (!nine_d3ddeclusage_check(usage, usage_idx))
@ -135,7 +134,7 @@ nine_d3d9_to_nine_declusage(unsigned usage, unsigned usage_idx)
NINE_DECLUSAGE_CASEi(TANGENT); NINE_DECLUSAGE_CASEi(TANGENT);
NINE_DECLUSAGE_CASEi(BINORMAL); NINE_DECLUSAGE_CASEi(BINORMAL);
NINE_DECLUSAGE_CASE0(TESSFACTOR); NINE_DECLUSAGE_CASE0(TESSFACTOR);
NINE_DECLUSAGE_CASE0(POSITIONT); NINE_DECLUSAGE_CASEi(POSITIONT);
NINE_DECLUSAGE_CASEi(COLOR); NINE_DECLUSAGE_CASEi(COLOR);
NINE_DECLUSAGE_CASE0(DEPTH); NINE_DECLUSAGE_CASE0(DEPTH);
NINE_DECLUSAGE_CASE0(FOG); NINE_DECLUSAGE_CASE0(FOG);
@ -148,58 +147,25 @@ nine_d3d9_to_nine_declusage(unsigned usage, unsigned usage_idx)
static const char *nine_declusage_names[] = static const char *nine_declusage_names[] =
{ {
[NINE_DECLUSAGE_POSITION(0)] = "POSITION", [NINE_DECLUSAGE_POSITION] = "POSITION",
[NINE_DECLUSAGE_POSITION(1)] = "POSITION1", [NINE_DECLUSAGE_BLENDWEIGHT] = "BLENDWEIGHT",
[NINE_DECLUSAGE_POSITION(2)] = "POSITION2", [NINE_DECLUSAGE_BLENDINDICES] = "BLENDINDICES",
[NINE_DECLUSAGE_POSITION(3)] = "POSITION3", [NINE_DECLUSAGE_NORMAL] = "NORMAL",
[NINE_DECLUSAGE_POSITION(4)] = "POSITION4",
[NINE_DECLUSAGE_BLENDWEIGHT(0)] = "BLENDWEIGHT",
[NINE_DECLUSAGE_BLENDWEIGHT(1)] = "BLENDWEIGHT1",
[NINE_DECLUSAGE_BLENDWEIGHT(2)] = "BLENDWEIGHT2",
[NINE_DECLUSAGE_BLENDWEIGHT(3)] = "BLENDWEIGHT3",
[NINE_DECLUSAGE_BLENDINDICES(0)] = "BLENDINDICES",
[NINE_DECLUSAGE_BLENDINDICES(1)] = "BLENDINDICES1",
[NINE_DECLUSAGE_BLENDINDICES(2)] = "BLENDINDICES2",
[NINE_DECLUSAGE_BLENDINDICES(3)] = "BLENDINDICES3",
[NINE_DECLUSAGE_NORMAL(0)] = "NORMAL",
[NINE_DECLUSAGE_NORMAL(1)] = "NORMAL1",
[NINE_DECLUSAGE_PSIZE] = "PSIZE", [NINE_DECLUSAGE_PSIZE] = "PSIZE",
[NINE_DECLUSAGE_TEXCOORD(0)] = "TEXCOORD0", [NINE_DECLUSAGE_TEXCOORD] = "TEXCOORD",
[NINE_DECLUSAGE_TEXCOORD(1)] = "TEXCOORD1", [NINE_DECLUSAGE_TANGENT] = "TANGENT",
[NINE_DECLUSAGE_TEXCOORD(2)] = "TEXCOORD2", [NINE_DECLUSAGE_BINORMAL] = "BINORMAL",
[NINE_DECLUSAGE_TEXCOORD(3)] = "TEXCOORD3",
[NINE_DECLUSAGE_TEXCOORD(4)] = "TEXCOORD4",
[NINE_DECLUSAGE_TEXCOORD(5)] = "TEXCOORD5",
[NINE_DECLUSAGE_TEXCOORD(6)] = "TEXCOORD6",
[NINE_DECLUSAGE_TEXCOORD(7)] = "TEXCOORD7",
[NINE_DECLUSAGE_TEXCOORD(8)] = "TEXCOORD8",
[NINE_DECLUSAGE_TEXCOORD(9)] = "TEXCOORD9",
[NINE_DECLUSAGE_TEXCOORD(10)] = "TEXCOORD10",
[NINE_DECLUSAGE_TEXCOORD(11)] = "TEXCOORD11",
[NINE_DECLUSAGE_TEXCOORD(12)] = "TEXCOORD12",
[NINE_DECLUSAGE_TEXCOORD(13)] = "TEXCOORD13",
[NINE_DECLUSAGE_TEXCOORD(14)] = "TEXCOORD14",
[NINE_DECLUSAGE_TEXCOORD(15)] = "TEXCOORD15",
[NINE_DECLUSAGE_TANGENT(0)] = "TANGENT",
[NINE_DECLUSAGE_TANGENT(1)] = "TANGENT1",
[NINE_DECLUSAGE_BINORMAL(0)] = "BINORMAL",
[NINE_DECLUSAGE_BINORMAL(1)] = "BINORMAL1",
[NINE_DECLUSAGE_TESSFACTOR] = "TESSFACTOR", [NINE_DECLUSAGE_TESSFACTOR] = "TESSFACTOR",
[NINE_DECLUSAGE_POSITIONT] = "POSITIONT", [NINE_DECLUSAGE_POSITIONT] = "POSITIONT",
[NINE_DECLUSAGE_COLOR(0)] = "DIFFUSE", [NINE_DECLUSAGE_COLOR] = "DIFFUSE",
[NINE_DECLUSAGE_COLOR(1)] = "SPECULAR",
[NINE_DECLUSAGE_COLOR(2)] = "COLOR2",
[NINE_DECLUSAGE_COLOR(3)] = "COLOR3",
[NINE_DECLUSAGE_COLOR(4)] = "COLOR4",
[NINE_DECLUSAGE_DEPTH] = "DEPTH", [NINE_DECLUSAGE_DEPTH] = "DEPTH",
[NINE_DECLUSAGE_FOG] = "FOG", [NINE_DECLUSAGE_FOG] = "FOG",
[NINE_DECLUSAGE_NONE] = "(NONE)", [NINE_DECLUSAGE_NONE] = "(NONE)",
[NINE_DECLUSAGE_COUNT] = "(OOB)"
}; };
static INLINE const char * static INLINE const char *
nine_declusage_name(unsigned ndcl) nine_declusage_name(unsigned ndcl)
{ {
return nine_declusage_names[MIN2(ndcl, Elements(nine_declusage_names) - 1)]; return nine_declusage_names[ndcl % NINE_DECLUSAGE_COUNT];
} }
HRESULT HRESULT
@ -225,15 +191,14 @@ NineVertexDeclaration9_ctor( struct NineVertexDeclaration9 *This,
This->decls = CALLOC(This->nelems+1, sizeof(D3DVERTEXELEMENT9)); This->decls = CALLOC(This->nelems+1, sizeof(D3DVERTEXELEMENT9));
This->elems = CALLOC(This->nelems, sizeof(struct pipe_vertex_element)); This->elems = CALLOC(This->nelems, sizeof(struct pipe_vertex_element));
This->usage_map = CALLOC(This->nelems, sizeof(uint16_t));
if (!This->decls || !This->elems) { return E_OUTOFMEMORY; } if (!This->decls || !This->elems) { return E_OUTOFMEMORY; }
memcpy(This->decls, pElements, sizeof(D3DVERTEXELEMENT9)*(This->nelems+1)); memcpy(This->decls, pElements, sizeof(D3DVERTEXELEMENT9)*(This->nelems+1));
memset(This->usage_map, 0xff, sizeof(This->usage_map));
for (i = 0; i < This->nelems; ++i) { for (i = 0; i < This->nelems; ++i) {
uint8_t usage = nine_d3d9_to_nine_declusage(This->decls[i].Usage, uint16_t usage = nine_d3d9_to_nine_declusage(This->decls[i].Usage,
This->decls[i].UsageIndex); This->decls[i].UsageIndex);
This->usage_map[usage] = i; This->usage_map[i] = usage;
This->elems[i].src_offset = This->decls[i].Offset; This->elems[i].src_offset = This->decls[i].Offset;
This->elems[i].instance_divisor = 0; This->elems[i].instance_divisor = 0;
@ -241,11 +206,12 @@ NineVertexDeclaration9_ctor( struct NineVertexDeclaration9 *This,
This->elems[i].src_format = decltype_format(This->decls[i].Type); This->elems[i].src_format = decltype_format(This->decls[i].Type);
/* XXX Remember Method (tesselation), Usage, UsageIndex */ /* XXX Remember Method (tesselation), Usage, UsageIndex */
DBG("VERTEXELEMENT[%u]: Stream=%u Offset=%u Type=%s DeclUsage=%s\n", i, DBG("VERTEXELEMENT[%u]: Stream=%u Offset=%u Type=%s DeclUsage=%s%d\n", i,
This->decls[i].Stream, This->decls[i].Stream,
This->decls[i].Offset, This->decls[i].Offset,
util_format_name(This->elems[i].src_format), util_format_name(This->elems[i].src_format),
nine_declusage_name(usage)); nine_declusage_name(usage),
usage / NINE_DECLUSAGE_COUNT);
} }
return D3D_OK; return D3D_OK;
@ -258,6 +224,8 @@ NineVertexDeclaration9_dtor( struct NineVertexDeclaration9 *This )
FREE(This->decls); FREE(This->decls);
if (This->elems) if (This->elems)
FREE(This->elems); FREE(This->elems);
if (This->usage_map)
FREE(This->usage_map);
NineUnknown_dtor(&This->base); NineUnknown_dtor(&This->base);
} }

View file

@ -40,9 +40,9 @@ struct NineVertexDeclaration9
struct pipe_vertex_element *elems; struct pipe_vertex_element *elems;
unsigned nelems; unsigned nelems;
/* DECLUSAGE -> element index, for selecting the vertex element /* index -> DECLUSAGE, for selecting the vertex element
* for each VS input */ * for each VS input */
uint8_t usage_map[NINE_DECLUSAGE_COUNT]; uint16_t *usage_map;
D3DVERTEXELEMENT9 *decls; D3DVERTEXELEMENT9 *decls;
DWORD fvf; DWORD fvf;

View file

@ -32,7 +32,7 @@ struct NineVertexShader9
struct nine_shader_variant variant; struct nine_shader_variant variant;
struct { struct {
uint8_t ndecl; /* NINE_DECLUSAGE_x */ uint16_t ndecl; /* NINE_DECLUSAGE_x */
} input_map[PIPE_MAX_ATTRIBS]; } input_map[PIPE_MAX_ATTRIBS];
unsigned num_inputs; unsigned num_inputs;