[PATCH 1/5] ddraw: Factor out viewport_alloc_active_light_index() function.

Paul Gofman gofmanp at gmail.com
Tue Jun 11 05:06:18 CDT 2019


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
 dlls/ddraw/ddraw_private.h |  6 ++--
 dlls/ddraw/light.c         |  6 ++--
 dlls/ddraw/viewport.c      | 66 ++++++++++++++++++++++++--------------
 3 files changed, 49 insertions(+), 29 deletions(-)

diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index a5fce2a15e..22910d7cc4 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -66,6 +66,8 @@ struct FvfToDecl
         | WINED3D_LEGACY_UNBOUND_RESOURCE_COLOR | WINED3D_NO_PRIMITIVE_RESTART \
         | WINED3D_LEGACY_CUBEMAP_FILTERING)
 
+#define DDRAW_MAX_ACTIVE_LIGHTS 8
+
 enum ddraw_device_state
 {
     DDRAW_DEVICE_STATE_OK,
@@ -446,7 +448,7 @@ struct d3d_light
     D3DLIGHT2 light;
     D3DLIGHT7 light7;
 
-    DWORD dwLightIndex;
+    DWORD active_light_index;
 
     struct list entry;
 };
@@ -500,7 +502,7 @@ struct d3d_viewport
     /* If this viewport is active for one device, put the device here */
     struct d3d_device *active_device;
 
-    DWORD                     num_lights;
+    DWORD                     active_lights_count;
     DWORD                     map_lights;
 
     enum ddraw_viewport_version version;
diff --git a/dlls/ddraw/light.c b/dlls/ddraw/light.c
index c6513ffe8a..a86f046b74 100644
--- a/dlls/ddraw/light.c
+++ b/dlls/ddraw/light.c
@@ -39,7 +39,7 @@ static void light_update(struct d3d_light *light)
     if (!light->active_viewport || !light->active_viewport->active_device) return;
     device = light->active_viewport->active_device;
 
-    IDirect3DDevice7_SetLight(&device->IDirect3DDevice7_iface, light->dwLightIndex, &light->light7);
+    IDirect3DDevice7_SetLight(&device->IDirect3DDevice7_iface, light->active_light_index, &light->light7);
 }
 
 /*****************************************************************************
@@ -61,7 +61,7 @@ void light_activate(struct d3d_light *light)
 
     light_update(light);
     if (light->light.dwFlags & D3DLIGHT_ACTIVE)
-        IDirect3DDevice7_LightEnable(&device->IDirect3DDevice7_iface, light->dwLightIndex, TRUE);
+        IDirect3DDevice7_LightEnable(&device->IDirect3DDevice7_iface, light->active_light_index, TRUE);
 }
 
 /*****************************************************************************
@@ -83,7 +83,7 @@ void light_deactivate(struct d3d_light *light)
 
     device = light->active_viewport->active_device;
     if (light->light.dwFlags & D3DLIGHT_ACTIVE)
-        IDirect3DDevice7_LightEnable(&device->IDirect3DDevice7_iface, light->dwLightIndex, FALSE);
+        IDirect3DDevice7_LightEnable(&device->IDirect3DDevice7_iface, light->active_light_index, FALSE);
 }
 
 static inline struct d3d_light *impl_from_IDirect3DLight(IDirect3DLight *iface)
diff --git a/dlls/ddraw/viewport.c b/dlls/ddraw/viewport.c
index daa5ac8d5a..31724402b3 100644
--- a/dlls/ddraw/viewport.c
+++ b/dlls/ddraw/viewport.c
@@ -122,6 +122,34 @@ void viewport_deactivate(struct d3d_viewport *viewport)
     }
 }
 
+static void viewport_alloc_active_light_index(struct d3d_light *light)
+{
+    struct d3d_viewport *vp = light->active_viewport;
+    unsigned int i;
+    DWORD map;
+
+    TRACE("vp %p, light %p, index %u, active_lights_count %u.\n",
+            vp, light, light->active_light_index, vp->active_lights_count);
+
+    if (light->active_light_index)
+        return;
+
+    if (vp->active_lights_count >= DDRAW_MAX_ACTIVE_LIGHTS)
+        return;
+
+    map = vp->map_lights;
+
+    i = 0;
+    while (map & 1)
+    {
+        map >>= 1;
+        ++i;
+    }
+    light->active_light_index = i + 1;
+    ++vp->active_lights_count;
+    vp->map_lights |= 1u << i;
+}
+
 /*****************************************************************************
  * _dump_D3DVIEWPORT, _dump_D3DVIEWPORT2
  *
@@ -753,23 +781,15 @@ static HRESULT WINAPI d3d_viewport_Clear(IDirect3DViewport3 *iface,
  *  DDERR_INVALIDPARAMS if there are 8 lights or more
  *
  *****************************************************************************/
-static HRESULT WINAPI d3d_viewport_AddLight(IDirect3DViewport3 *iface, IDirect3DLight *lpDirect3DLight)
+static HRESULT WINAPI d3d_viewport_AddLight(IDirect3DViewport3 *viewport, IDirect3DLight *light)
 {
-    struct d3d_viewport *This = impl_from_IDirect3DViewport3(iface);
-    struct d3d_light *light_impl = unsafe_impl_from_IDirect3DLight(lpDirect3DLight);
-    DWORD i = 0;
-    DWORD map = This->map_lights;
+    struct d3d_light *light_impl = unsafe_impl_from_IDirect3DLight(light);
+    struct d3d_viewport *vp = impl_from_IDirect3DViewport3(viewport);
 
-    TRACE("iface %p, light %p.\n", iface, lpDirect3DLight);
+    TRACE("viewport %p, light %p.\n", viewport, light);
 
     wined3d_mutex_lock();
 
-    if (This->num_lights >= 8)
-    {
-        wined3d_mutex_unlock();
-        return DDERR_INVALIDPARAMS;
-    }
-
     if (light_impl->active_viewport)
     {
         wined3d_mutex_unlock();
@@ -777,22 +797,20 @@ static HRESULT WINAPI d3d_viewport_AddLight(IDirect3DViewport3 *iface, IDirect3D
         return D3DERR_LIGHTHASVIEWPORT;
     }
 
-    /* Find a light number and update both light and viewports objects accordingly */
-    while (map & 1)
+    light_impl->active_viewport = vp;
+    viewport_alloc_active_light_index(light_impl);
+    if (!light_impl->active_light_index)
     {
-        map >>= 1;
-        ++i;
+        light_impl->active_viewport = NULL;
+        wined3d_mutex_unlock();
+        return DDERR_INVALIDPARAMS;
     }
-    light_impl->dwLightIndex = i;
-    This->num_lights++;
-    This->map_lights |= 1<<i;
 
     /* Add the light in the 'linked' chain */
-    list_add_head(&This->light_list, &light_impl->entry);
-    IDirect3DLight_AddRef(lpDirect3DLight);
+    list_add_head(&vp->light_list, &light_impl->entry);
+    IDirect3DLight_AddRef(light);
 
     /* Attach the light to the viewport */
-    light_impl->active_viewport = This;
     light_activate(light_impl);
 
     wined3d_mutex_unlock();
@@ -833,8 +851,8 @@ static HRESULT WINAPI d3d_viewport_DeleteLight(IDirect3DViewport3 *iface, IDirec
     list_remove(&l->entry);
     l->active_viewport = NULL;
     IDirect3DLight_Release(lpDirect3DLight);
-    --viewport->num_lights;
-    viewport->map_lights &= ~(1 << l->dwLightIndex);
+    --viewport->active_lights_count;
+    viewport->map_lights &= ~(1 << l->active_light_index);
 
     wined3d_mutex_unlock();
 
-- 
2.21.0




More information about the wine-devel mailing list