From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/glsl_shader.c | 18 +++++------------- dlls/wined3d/stateblock.c | 21 ++++++++++++++++++--- 2 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index ecc9dcd2ef5..6eb83ec3f2c 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1539,9 +1539,7 @@ static void shader_glsl_ffp_vertex_light_uniform(const struct wined3d_context_gl const struct wined3d_state *state, unsigned int light, enum wined3d_light_type type, const struct wined3d_light_constants *constants, struct glsl_shader_prog_link *prog) { - const struct wined3d_matrix *view = &state->transforms[WINED3D_TS_VIEW]; const struct wined3d_gl_info *gl_info = context_gl->gl_info; - struct wined3d_vec4 vec4;
GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].diffuse, 1, &constants->diffuse.r)); GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].specular, 1, &constants->specular.r)); @@ -1550,8 +1548,7 @@ static void shader_glsl_ffp_vertex_light_uniform(const struct wined3d_context_gl switch (type) { case WINED3D_LIGHT_POINT: - wined3d_vec4_transform(&vec4, &constants->position, view); - GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &vec4.x)); + GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &constants->position.x)); GL_EXTCALL(glUniform1f(prog->vs.light_location[light].range, constants->range)); GL_EXTCALL(glUniform1f(prog->vs.light_location[light].c_att, constants->const_att)); GL_EXTCALL(glUniform1f(prog->vs.light_location[light].l_att, constants->linear_att)); @@ -1559,11 +1556,9 @@ static void shader_glsl_ffp_vertex_light_uniform(const struct wined3d_context_gl break;
case WINED3D_LIGHT_SPOT: - wined3d_vec4_transform(&vec4, &constants->position, view); - GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &vec4.x)); + GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &constants->position.x));
- wined3d_vec4_transform(&vec4, &constants->direction, view); - GL_EXTCALL(glUniform3fv(prog->vs.light_location[light].direction, 1, &vec4.x)); + GL_EXTCALL(glUniform3fv(prog->vs.light_location[light].direction, 1, &constants->direction.x));
GL_EXTCALL(glUniform1f(prog->vs.light_location[light].range, constants->range)); GL_EXTCALL(glUniform1f(prog->vs.light_location[light].falloff, constants->falloff)); @@ -1575,13 +1570,11 @@ static void shader_glsl_ffp_vertex_light_uniform(const struct wined3d_context_gl break;
case WINED3D_LIGHT_DIRECTIONAL: - wined3d_vec4_transform(&vec4, &constants->direction, view); - GL_EXTCALL(glUniform3fv(prog->vs.light_location[light].direction, 1, &vec4.x)); + GL_EXTCALL(glUniform3fv(prog->vs.light_location[light].direction, 1, &constants->direction.x)); break;
case WINED3D_LIGHT_PARALLELPOINT: - wined3d_vec4_transform(&vec4, &constants->position, view); - GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &vec4.x)); + GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &constants->position.x)); break;
default: @@ -11867,7 +11860,6 @@ static void glsl_vertex_pipe_view(struct wined3d_context *context, const struct unsigned int k;
context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_MODELVIEW - | WINED3D_SHADER_CONST_FFP_LIGHTS | WINED3D_SHADER_CONST_FFP_VERTEXBLEND;
if (needs_legacy_glsl_syntax(gl_info)) diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 244d31e5d81..5d275be1ae1 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -3294,6 +3294,10 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, { j = wined3d_bit_scan(&map); idx = i * word_bit_count + j; + + if (idx == WINED3D_TS_VIEW) + changed->lights = 1; + wined3d_device_set_transform(device, idx, &state->transforms[idx]); } } @@ -3392,12 +3396,16 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, for (unsigned int i = 0; i < WINED3D_MAX_ACTIVE_LIGHTS; ++i) { const struct wined3d_light_info *light_info = state->light_state->lights[i]; + const struct wined3d_light_constants *light_constants; + enum wined3d_light_type type; unsigned int idx;
if (!light_info) continue; + type = light_info->OriginalParms.type; + light_constants = &state->light_state->lights[i]->constants;
- switch (light_info->OriginalParms.type) + switch (type) { case WINED3D_LIGHT_POINT: idx = point_idx++; @@ -3412,10 +3420,17 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, idx = parallel_point_idx++; break; default: - FIXME("Unhandled light type %#x.\n", light_info->OriginalParms.type); + FIXME("Unhandled light type %#x.\n", type); continue; } - constants.lights[idx] = state->light_state->lights[i]->constants; + constants.lights[idx] = *light_constants; + + if (type != WINED3D_LIGHT_DIRECTIONAL) + wined3d_vec4_transform(&constants.lights[idx].position, + &light_constants->position, &state->transforms[WINED3D_TS_VIEW]); + if (type == WINED3D_LIGHT_SPOT || type == WINED3D_LIGHT_DIRECTIONAL) + wined3d_vec4_transform(&constants.lights[idx].direction, + &light_constants->direction, &state->transforms[WINED3D_TS_VIEW]); }
wined3d_device_context_push_constants(context, WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_SHADER_CONST_FFP_LIGHTS,