[PATCH 3/5] wined3d: Store user clip planes as 4-component float vectors.

Henri Verbeet hverbeet at codeweavers.com
Tue May 22 11:01:06 CDT 2012


---
 dlls/d3d8/device.c             |    4 ++--
 dlls/d3d9/device.c             |   14 ++++++--------
 dlls/ddraw/device.c            |    4 ++--
 dlls/wined3d/device.c          |   21 +++++++--------------
 dlls/wined3d/state.c           |   13 ++++++++-----
 dlls/wined3d/stateblock.c      |   12 +++---------
 dlls/wined3d/wined3d_private.h |    2 +-
 include/wine/wined3d.h         |   14 ++++++++++++--
 8 files changed, 41 insertions(+), 43 deletions(-)

diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index eec9cce..a11c355 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -1413,7 +1413,7 @@ static HRESULT WINAPI d3d8_device_SetClipPlane(IDirect3DDevice8 *iface, DWORD in
     TRACE("iface %p, index %u, plane %p.\n", iface, index, plane);
 
     wined3d_mutex_lock();
-    hr = wined3d_device_set_clip_plane(device->wined3d_device, index, plane);
+    hr = wined3d_device_set_clip_plane(device->wined3d_device, index, (const struct wined3d_vec4 *)plane);
     wined3d_mutex_unlock();
 
     return hr;
@@ -1427,7 +1427,7 @@ static HRESULT WINAPI d3d8_device_GetClipPlane(IDirect3DDevice8 *iface, DWORD in
     TRACE("iface %p, index %u, plane %p.\n", iface, index, plane);
 
     wined3d_mutex_lock();
-    hr = wined3d_device_get_clip_plane(device->wined3d_device, index, plane);
+    hr = wined3d_device_get_clip_plane(device->wined3d_device, index, (struct wined3d_vec4 *)plane);
     wined3d_mutex_unlock();
 
     return hr;
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index 3d8642d..fecb316 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -1500,31 +1500,29 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetLightEnable(IDirect3DDevice9Ex *if
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DDevice9Impl_SetClipPlane(IDirect3DDevice9Ex *iface, DWORD Index,
-        const float *pPlane)
+static HRESULT WINAPI IDirect3DDevice9Impl_SetClipPlane(IDirect3DDevice9Ex *iface, DWORD index, const float *plane)
 {
     IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface);
     HRESULT hr;
 
-    TRACE("iface %p, index %u, plane %p.\n", iface, Index, pPlane);
+    TRACE("iface %p, index %u, plane %p.\n", iface, index, plane);
 
     wined3d_mutex_lock();
-    hr = wined3d_device_set_clip_plane(This->wined3d_device, Index, pPlane);
+    hr = wined3d_device_set_clip_plane(This->wined3d_device, index, (const struct wined3d_vec4 *)plane);
     wined3d_mutex_unlock();
 
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DDevice9Impl_GetClipPlane(IDirect3DDevice9Ex *iface, DWORD Index,
-        float *pPlane)
+static HRESULT WINAPI IDirect3DDevice9Impl_GetClipPlane(IDirect3DDevice9Ex *iface, DWORD index, float *plane)
 {
     IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface);
     HRESULT hr;
 
-    TRACE("iface %p, index %u, plane %p.\n", iface, Index, pPlane);
+    TRACE("iface %p, index %u, plane %p.\n", iface, index, plane);
 
     wined3d_mutex_lock();
-    hr = wined3d_device_get_clip_plane(This->wined3d_device, Index, pPlane);
+    hr = wined3d_device_get_clip_plane(This->wined3d_device, index, (struct wined3d_vec4 *)plane);
     wined3d_mutex_unlock();
 
     return hr;
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 266facc..37775ac 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -6162,7 +6162,7 @@ static HRESULT d3d_device7_SetClipPlane(IDirect3DDevice7 *iface, DWORD idx, D3DV
         return DDERR_INVALIDPARAMS;
 
     wined3d_mutex_lock();
-    hr = wined3d_device_set_clip_plane(device->wined3d_device, idx, plane);
+    hr = wined3d_device_set_clip_plane(device->wined3d_device, idx, (struct wined3d_vec4 *)plane);
     wined3d_mutex_unlock();
 
     return hr;
@@ -6211,7 +6211,7 @@ static HRESULT d3d_device7_GetClipPlane(IDirect3DDevice7 *iface, DWORD idx, D3DV
         return DDERR_INVALIDPARAMS;
 
     wined3d_mutex_lock();
-    hr = wined3d_device_get_clip_plane(device->wined3d_device, idx, plane);
+    hr = wined3d_device_get_clip_plane(device->wined3d_device, idx, (struct wined3d_vec4 *)plane);
     wined3d_mutex_unlock();
 
     return hr;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index e1e28d1..f154e44 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2180,7 +2180,8 @@ HRESULT CDECL wined3d_device_get_light_enable(const struct wined3d_device *devic
     return WINED3D_OK;
 }
 
-HRESULT CDECL wined3d_device_set_clip_plane(struct wined3d_device *device, UINT plane_idx, const float *plane)
+HRESULT CDECL wined3d_device_set_clip_plane(struct wined3d_device *device,
+        UINT plane_idx, const struct wined3d_vec4 *plane)
 {
     TRACE("device %p, plane_idx %u, plane %p.\n", device, plane_idx, plane);
 
@@ -2193,19 +2194,13 @@ HRESULT CDECL wined3d_device_set_clip_plane(struct wined3d_device *device, UINT
 
     device->updateStateBlock->changed.clipplane |= 1 << plane_idx;
 
-    if (device->updateStateBlock->state.clip_planes[plane_idx][0] == plane[0]
-            && device->updateStateBlock->state.clip_planes[plane_idx][1] == plane[1]
-            && device->updateStateBlock->state.clip_planes[plane_idx][2] == plane[2]
-            && device->updateStateBlock->state.clip_planes[plane_idx][3] == plane[3])
+    if (!memcmp(&device->updateStateBlock->state.clip_planes[plane_idx], plane, sizeof(*plane)))
     {
         TRACE("Application is setting old values over, nothing to do.\n");
         return WINED3D_OK;
     }
 
-    device->updateStateBlock->state.clip_planes[plane_idx][0] = plane[0];
-    device->updateStateBlock->state.clip_planes[plane_idx][1] = plane[1];
-    device->updateStateBlock->state.clip_planes[plane_idx][2] = plane[2];
-    device->updateStateBlock->state.clip_planes[plane_idx][3] = plane[3];
+    device->updateStateBlock->state.clip_planes[plane_idx] = *plane;
 
     /* Handle recording of state blocks. */
     if (device->isRecordingState)
@@ -2219,7 +2214,8 @@ HRESULT CDECL wined3d_device_set_clip_plane(struct wined3d_device *device, UINT
     return WINED3D_OK;
 }
 
-HRESULT CDECL wined3d_device_get_clip_plane(const struct wined3d_device *device, UINT plane_idx, float *plane)
+HRESULT CDECL wined3d_device_get_clip_plane(const struct wined3d_device *device,
+        UINT plane_idx, struct wined3d_vec4 *plane)
 {
     TRACE("device %p, plane_idx %u, plane %p.\n", device, plane_idx, plane);
 
@@ -2230,10 +2226,7 @@ HRESULT CDECL wined3d_device_get_clip_plane(const struct wined3d_device *device,
         return WINED3DERR_INVALIDCALL;
     }
 
-    plane[0] = (float)device->stateBlock->state.clip_planes[plane_idx][0];
-    plane[1] = (float)device->stateBlock->state.clip_planes[plane_idx][1];
-    plane[2] = (float)device->stateBlock->state.clip_planes[plane_idx][2];
-    plane[3] = (float)device->stateBlock->state.clip_planes[plane_idx][3];
+    *plane = device->stateBlock->state.clip_planes[plane_idx];
 
     return WINED3D_OK;
 }
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index fc6fedc..8904aaa 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3766,6 +3766,7 @@ static void transform_world(struct wined3d_context *context, const struct wined3
 static void clipplane(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
 {
     UINT index = state_id - STATE_CLIPPLANE(0);
+    GLdouble plane[4];
 
     if (isStateDirty(context, STATE_TRANSFORM(WINED3D_TS_VIEW)) || index >= context->gl_info->limits.clipplanes)
         return;
@@ -3782,12 +3783,14 @@ static void clipplane(struct wined3d_context *context, const struct wined3d_stat
          */
         glLoadIdentity();
 
+    plane[0] = state->clip_planes[index].x;
+    plane[1] = state->clip_planes[index].y;
+    plane[2] = state->clip_planes[index].z;
+    plane[3] = state->clip_planes[index].w;
+
     TRACE("Clipplane [%.8e, %.8e, %.8e, %.8e]\n",
-            state->clip_planes[index][0],
-            state->clip_planes[index][1],
-            state->clip_planes[index][2],
-            state->clip_planes[index][3]);
-    glClipPlane(GL_CLIP_PLANE0 + index, state->clip_planes[index]);
+            plane[0], plane[1], plane[2], plane[3]);
+    glClipPlane(GL_CLIP_PLANE0 + index, plane);
     checkGLcall("glClipPlane");
 
     glPopMatrix();
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 9544c6f..276c1a8 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -828,10 +828,10 @@ HRESULT CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock)
     {
         if (!(map & 1)) continue;
 
-        if (memcmp(src_state->clip_planes[i], stateblock->state.clip_planes[i], sizeof(*stateblock->state.clip_planes)))
+        if (memcmp(&stateblock->state.clip_planes[i], &src_state->clip_planes[i], sizeof(src_state->clip_planes[i])))
         {
             TRACE("Updating clipplane %u.\n", i);
-            memcpy(stateblock->state.clip_planes[i], src_state->clip_planes[i], sizeof(*stateblock->state.clip_planes));
+            stateblock->state.clip_planes[i] = src_state->clip_planes[i];
         }
     }
 
@@ -1057,15 +1057,9 @@ HRESULT CDECL wined3d_stateblock_apply(const struct wined3d_stateblock *stateblo
     map = stateblock->changed.clipplane;
     for (i = 0; map; map >>= 1, ++i)
     {
-        float clip[4];
-
         if (!(map & 1)) continue;
 
-        clip[0] = (float) stateblock->state.clip_planes[i][0];
-        clip[1] = (float) stateblock->state.clip_planes[i][1];
-        clip[2] = (float) stateblock->state.clip_planes[i][2];
-        clip[3] = (float) stateblock->state.clip_planes[i][3];
-        wined3d_device_set_clip_plane(device, i, clip);
+        wined3d_device_set_clip_plane(device, i, &stateblock->state.clip_planes[i]);
     }
 
     stateblock->device->stateBlock->state.lowest_disabled_stage = MAX_TEXTURES - 1;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 6e6aecb..63b7161 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2282,7 +2282,7 @@ struct wined3d_state
     DWORD lowest_disabled_stage;
 
     struct wined3d_matrix transforms[HIGHEST_TRANSFORMSTATE + 1];
-    double clip_planes[MAX_CLIPPLANES][4];
+    struct wined3d_vec4 clip_planes[MAX_CLIPPLANES];
     struct wined3d_material material;
     struct wined3d_viewport viewport;
     RECT scissor_rect;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 2006c92..00d398f 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1505,6 +1505,14 @@ struct wined3d_vec3
     float z;
 };
 
+struct wined3d_vec4
+{
+    float x;
+    float y;
+    float z;
+    float w;
+};
+
 struct wined3d_matrix
 {
     union
@@ -2081,7 +2089,8 @@ UINT __cdecl wined3d_device_get_available_texture_mem(const struct wined3d_devic
 HRESULT __cdecl wined3d_device_get_back_buffer(const struct wined3d_device *device, UINT swapchain_idx,
         UINT backbuffer_idx, enum wined3d_backbuffer_type backbuffer_type, struct wined3d_surface **backbuffer);
 INT __cdecl wined3d_device_get_base_vertex_index(const struct wined3d_device *device);
-HRESULT __cdecl wined3d_device_get_clip_plane(const struct wined3d_device *device, UINT plane_idx, float *plane);
+HRESULT __cdecl wined3d_device_get_clip_plane(const struct wined3d_device *device,
+        UINT plane_idx, struct wined3d_vec4 *plane);
 HRESULT __cdecl wined3d_device_get_clip_status(const struct wined3d_device *device,
         struct wined3d_clip_status *clip_status);
 HRESULT __cdecl wined3d_device_get_creation_parameters(const struct wined3d_device *device,
@@ -2162,7 +2171,8 @@ HRESULT __cdecl wined3d_device_reset(struct wined3d_device *device,
         const struct wined3d_swapchain_desc *swapchain_desc, wined3d_device_reset_cb callback);
 void __cdecl wined3d_device_restore_fullscreen_window(struct wined3d_device *device, HWND window);
 HRESULT __cdecl wined3d_device_set_base_vertex_index(struct wined3d_device *device, INT base_index);
-HRESULT __cdecl wined3d_device_set_clip_plane(struct wined3d_device *device, UINT plane_idx, const float *plane);
+HRESULT __cdecl wined3d_device_set_clip_plane(struct wined3d_device *device,
+        UINT plane_idx, const struct wined3d_vec4 *plane);
 HRESULT __cdecl wined3d_device_set_clip_status(struct wined3d_device *device,
         const struct wined3d_clip_status *clip_status);
 void __cdecl wined3d_device_set_cursor_position(struct wined3d_device *device,
-- 
1.7.3.4




More information about the wine-patches mailing list