From: Elizabeth Figura zfigura@codeweavers.com
Do not check the stream info.
This would make a difference if the usage was included in the vertex declaration but the corresponding stream is not bound; however, in that case we supply a default stream containing zero, which provides the same behaviour as if the usage is not included in the vertex declaration. --- dlls/wined3d/utils.c | 7 +++---- dlls/wined3d/vertexdeclaration.c | 2 ++ dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 7d2bef8b7cc..e0519942e1a 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -6507,11 +6507,10 @@ void wined3d_ffp_get_fs_settings(const struct wined3d_context *context, } else { - const struct wined3d_stream_info *si = &context->stream_info; unsigned int coord_idx = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX]; if ((state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX] >> WINED3D_FFP_TCI_SHIFT) & WINED3D_FFP_TCI_MASK - || (coord_idx < WINED3D_MAX_FFP_TEXTURES && (si->use_map & (1u << (WINED3D_FFP_TEXCOORD0 + coord_idx))))) + || (coord_idx < WINED3D_MAX_FFP_TEXTURES && (state->vertex_declaration->texcoords & (1u << coord_idx)))) settings->texcoords_initialized |= 1u << i; } } @@ -6588,7 +6587,7 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context, for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) { coord_idx = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX]; - if (coord_idx < WINED3D_MAX_FFP_TEXTURES && (si->use_map & (1u << (WINED3D_FFP_TEXCOORD0 + coord_idx)))) + if (coord_idx < WINED3D_MAX_FFP_TEXTURES && (vdecl->texcoords & (1u << coord_idx))) settings->texcoords |= 1u << i; settings->texgen[i] = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX]; } @@ -6638,7 +6637,7 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context, for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) { coord_idx = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX]; - if (coord_idx < WINED3D_MAX_FFP_TEXTURES && (si->use_map & (1u << (WINED3D_FFP_TEXCOORD0 + coord_idx)))) + if (coord_idx < WINED3D_MAX_FFP_TEXTURES && (vdecl->texcoords & (1u << coord_idx))) settings->texcoords |= 1u << i; settings->texgen[i] = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX]; } diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c index f2df8979089..7d74d9c385e 100644 --- a/dlls/wined3d/vertexdeclaration.c +++ b/dlls/wined3d/vertexdeclaration.c @@ -228,6 +228,8 @@ static HRESULT vertexdeclaration_init(struct wined3d_vertex_declaration *declara declaration->specular = true; else if (e->usage == WINED3D_DECL_USAGE_NORMAL) declaration->normal = true; + else if (e->usage == WINED3D_DECL_USAGE_TEXCOORD) + declaration->texcoords |= (1u << e->usage_idx);
/* Find the streams used in the declaration. The vertex buffers have * to be loaded when drawing, but filter tessellation pseudo streams. */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 14a91875014..63e05239ac0 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3496,6 +3496,7 @@ struct wined3d_vertex_declaration bool diffuse; bool specular; bool normal; + uint8_t texcoords; };
bool wined3d_light_state_enable_light(struct wined3d_light_state *state, const struct wined3d_d3d_info *d3d_info,