[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