diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c index c43f88a2fc4..016e842b1fb 100644 --- a/dlls/d3d10/effect.c +++ b/dlls/d3d10/effect.c @@ -2220,9 +2220,48 @@ static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableB static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableBySemantic(ID3D10Effect *iface, LPCSTR semantic) { - FIXME("iface %p, semantic %s stub!\n", iface, debugstr_a(semantic)); + struct d3d10_effect *This = (struct d3d10_effect *)iface; + unsigned int i; - return NULL; + TRACE("iface %p, semantic %s\n", iface, debugstr_a(semantic)); + + if (!semantic) + { + WARN("Invalid semantic specified\n"); + return (ID3D10EffectVariable *)&null_variable; + } + + for (i = 0; i < This->local_buffer_count; ++i) + { + struct d3d10_effect_variable *l = &This->local_buffers[i]; + unsigned int j; + + for (j = 0; j < l->type->member_count; ++j) + { + struct d3d10_effect_variable *v = &l->members[j]; + + if (!strcmp(v->semantic, semantic)) + { + TRACE("Returning variable %p.\n", v); + return (ID3D10EffectVariable *)v; + } + } + } + + for (i = 0; i < This->local_variable_count; ++i) + { + struct d3d10_effect_variable *v = &This->local_variables[i]; + + if (!strcmp(v->semantic, semantic)) + { + TRACE("Returning variable %p.\n", v); + return (ID3D10EffectVariable *)v; + } + } + + WARN("Invalid semantic specified\n"); + + return (ID3D10EffectVariable *)&null_variable; } static struct ID3D10EffectTechnique * STDMETHODCALLTYPE d3d10_effect_GetTechniqueByIndex(ID3D10Effect *iface,