[PATCH 02/11] ddraw: Enable lighting only if material is set in d3d_execute_buffer_execute().

Lukáš Krejčí lskrejci at gmail.com
Thu May 16 05:34:23 CDT 2019


On Wed, 2019-05-15 at 18:06 +0300, Paul Gofman wrote:
> Signed-off-by: Paul Gofman <gofmanp at gmail.com>
> ---
>  dlls/ddraw/executebuffer.c | 20 +++++---------------
>  1 file changed, 5 insertions(+), 15 deletions(-)
> 
> diff --git a/dlls/ddraw/executebuffer.c b/dlls/ddraw/executebuffer.c
> index 637c2bdc5f..d5de513c27 100644
> --- a/dlls/ddraw/executebuffer.c
> +++ b/dlls/ddraw/executebuffer.c
> @@ -306,21 +306,11 @@ HRESULT d3d_execute_buffer_execute(struct d3d_execute_buffer *buffer, struct d3d
>                          case D3DPROCESSVERTICES_TRANSFORM:
>                              wined3d_device_set_stream_source(device->wined3d_device, 0,
>                                      buffer->src_vertex_buffer, buffer->src_vertex_pos, sizeof(D3DVERTEX));
> -                            if (op == D3DPROCESSVERTICES_TRANSFORMLIGHT)
> -                            {
> -                                wined3d_device_set_vertex_declaration(device->wined3d_device,
> -                                        ddraw_find_decl(device->ddraw, D3DFVF_VERTEX));
> -                                wined3d_device_set_render_state(device->wined3d_device,
> -                                        WINED3D_RS_LIGHTING, TRUE);
> -                            }
> -                            else
> -                            {
> -                                wined3d_device_set_vertex_declaration(device->wined3d_device,
> -                                        ddraw_find_decl(device->ddraw, D3DFVF_LVERTEX));
> -                                wined3d_device_set_render_state(device->wined3d_device,
> -                                        WINED3D_RS_LIGHTING, FALSE);
> -                            }
> -
> +                            wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_LIGHTING,
> +                                    op == D3DPROCESSVERTICES_TRANSFORMLIGHT && !!device->material);
> +                            wined3d_device_set_vertex_declaration(device->wined3d_device,
> +                                    ddraw_find_decl(device->ddraw, op == D3DPROCESSVERTICES_TRANSFORMLIGHT
> +                                    ? D3DFVF_VERTEX : D3DFVF_LVERTEX));
>                              wined3d_device_process_vertices(device->wined3d_device, ci->wStart, ci->wDest,
>                                      ci->dwCount, buffer->dst_vertex_buffer, NULL, 0, D3DFVF_TLVERTEX);
>                              break;

I briefly tested your patch set in Tomb Raider 4, and it looks like a
patch is missing that enables lighting based on 'vertex_op' in
d3d_vertex_buffer7_ProcessVertices().

Something like this should do the trick:

diff --git a/dlls/ddraw/vertexbuffer.c b/dlls/ddraw/vertexbuffer.c
index d2c2f8ff80..c44664e514 100644
--- a/dlls/ddraw/vertexbuffer.c
+++ b/dlls/ddraw/vertexbuffer.c
@@ -260,7 +260,7 @@ static HRESULT WINAPI d3d_vertex_buffer7_ProcessVertices(IDirect3DVertexBuffer7
     struct d3d_device *device_impl = dst_buffer_impl->version == 7
             ? unsafe_impl_from_IDirect3DDevice7(device)
             : unsafe_impl_from_IDirect3DDevice3((IDirect3DDevice3 *)device);
-    BOOL oldClip, doClip;
+    BOOL oldClip, doClip, oldLight, doLight;
     HRESULT hr;
 
     TRACE("iface %p, vertex_op %#x, dst_idx %u, count %u, src_buffer %p, src_idx %u, device %p, flags %#x.\n",
@@ -290,6 +290,11 @@ static HRESULT WINAPI d3d_vertex_buffer7_ProcessVertices(IDirect3DVertexBuffer7
     if (doClip != oldClip)
         wined3d_device_set_render_state(device_impl->wined3d_device, WINED3D_RS_CLIPPING, doClip);
 
+    doLight = !!(vertex_op & D3DVOP_LIGHT);
+    oldLight = wined3d_device_get_render_state(device_impl->wined3d_device, WINED3D_RS_LIGHTING);
+    if (doLight != oldLight)
+        wined3d_device_set_render_state(device_impl->wined3d_device, WINED3D_RS_LIGHTING, doLight);
+
     wined3d_device_set_stream_source(device_impl->wined3d_device,
             0, src_buffer_impl->wined3d_buffer, 0, get_flexible_vertex_size(src_buffer_impl->fvf));
     wined3d_device_set_vertex_declaration(device_impl->wined3d_device, src_buffer_impl->wined3d_declaration);
@@ -300,6 +305,9 @@ static HRESULT WINAPI d3d_vertex_buffer7_ProcessVertices(IDirect3DVertexBuffer7
     if (doClip != oldClip)
         wined3d_device_set_render_state(device_impl->wined3d_device, WINED3D_RS_CLIPPING, oldClip);
 
+    if (doLight != oldLight)
+        wined3d_device_set_render_state(device_impl->wined3d_device, WINED3D_RS_LIGHTING, oldLight);
+
     wined3d_mutex_unlock();
 
     return hr;




More information about the wine-devel mailing list