From e3ecfa5974da9be707e38bc45445fa4c81438543 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 22 May 2012 18:01:06 +0200 Subject: [PATCH] wined3d: Store user clip planes as 4-component float vectors. --- 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 eec9ccefc21..a11c3558b7a 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 3d8642df7b6..fecb31683fe 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 266facc7d0a..37775acabe8 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 e1e28d1f2d3..f154e44eb6a 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 fc6fedc85cc..8904aaa9d1a 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 9544c6f6e38..276c1a816fd 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 6e6aecb7846..63b7161089e 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 2006c9217a8..00d398f97a0 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,