diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 088092830c4..42a7a85e4ec 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -333,8 +333,7 @@ struct d3d_device BOOL legacyTextureBlending; D3DTEXTUREBLEND texture_map_blend; - D3DMATRIX legacy_projection; - D3DMATRIX legacy_clipspace; + struct wined3d_matrix legacy_projection, legacy_clipspace; /* Light state */ DWORD material; @@ -615,7 +614,8 @@ void DDRAW_dump_cooperativelevel(DWORD cooplevel) DECLSPEC_HIDDEN; void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out) DECLSPEC_HIDDEN; void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out) DECLSPEC_HIDDEN; -void multiply_matrix(D3DMATRIX *dst, const D3DMATRIX *src1, const D3DMATRIX *src2) DECLSPEC_HIDDEN; +void multiply_matrix(struct wined3d_matrix *dst, const struct wined3d_matrix *src1, + const struct wined3d_matrix *src2) DECLSPEC_HIDDEN; static inline BOOL format_is_compressed(const DDPIXELFORMAT *format) { diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 92c726c10df..ee860d40106 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -3173,15 +3173,15 @@ static HRESULT WINAPI d3d_device3_SetTransform(IDirect3DDevice3 *iface, if (state == D3DTRANSFORMSTATE_PROJECTION) { - D3DMATRIX projection; + struct wined3d_matrix projection; wined3d_mutex_lock(); - multiply_matrix(&projection, &device->legacy_clipspace, matrix); + multiply_matrix(&projection, &device->legacy_clipspace, (struct wined3d_matrix *)matrix); wined3d_stateblock_set_transform(device->state, WINED3D_TS_PROJECTION, (struct wined3d_matrix *)&projection); wined3d_device_set_transform(device->wined3d_device, WINED3D_TS_PROJECTION, (struct wined3d_matrix *)&projection); - device->legacy_projection = *matrix; + memcpy(&device->legacy_projection, matrix, sizeof(*matrix)); wined3d_mutex_unlock(); return D3D_OK; @@ -3247,7 +3247,7 @@ static HRESULT d3d_device7_GetTransform(IDirect3DDevice7 *iface, /* Note: D3DMATRIX is compatible with struct wined3d_matrix. */ wined3d_mutex_lock(); - wined3d_device_get_transform(device->wined3d_device, wined3d_state, (struct wined3d_matrix *)matrix); + memcpy(matrix, &wined3d_stateblock_get_state(device->state)->transforms[wined3d_state], sizeof(*matrix)); wined3d_mutex_unlock(); return D3D_OK; @@ -3285,7 +3285,7 @@ static HRESULT WINAPI d3d_device3_GetTransform(IDirect3DDevice3 *iface, if (state == D3DTRANSFORMSTATE_PROJECTION) { wined3d_mutex_lock(); - *matrix = device->legacy_projection; + memcpy(matrix, &device->legacy_projection, sizeof(*matrix)); wined3d_mutex_unlock(); return DD_OK; } @@ -3385,15 +3385,13 @@ static HRESULT WINAPI d3d_device3_MultiplyTransform(IDirect3DDevice3 *iface, if (state == D3DTRANSFORMSTATE_PROJECTION) { - D3DMATRIX projection, tmp; + struct wined3d_matrix projection, tmp; wined3d_mutex_lock(); - multiply_matrix(&tmp, &device->legacy_projection, matrix); + multiply_matrix(&tmp, &device->legacy_projection, (struct wined3d_matrix *)matrix); multiply_matrix(&projection, &device->legacy_clipspace, &tmp); - wined3d_stateblock_set_transform(device->state, - WINED3D_TS_PROJECTION, (struct wined3d_matrix *)&projection); - wined3d_device_set_transform(device->wined3d_device, - WINED3D_TS_PROJECTION, (struct wined3d_matrix *)&projection); + wined3d_stateblock_set_transform(device->state, WINED3D_TS_PROJECTION, &projection); + wined3d_device_set_transform(device->wined3d_device, WINED3D_TS_PROJECTION, &projection); device->legacy_projection = tmp; wined3d_mutex_unlock(); @@ -4579,21 +4577,15 @@ static DWORD in_plane(UINT idx, struct wined3d_vec4 p, D3DVECTOR center, D3DVALU static void prepare_clip_space_planes(struct d3d_device *device, struct wined3d_vec4 *plane) { - D3DMATRIX m, temp; + const struct wined3d_stateblock_state *state; + struct wined3d_matrix m; /* We want the wined3d matrices since those include the legacy viewport * transformation. */ wined3d_mutex_lock(); - wined3d_device_get_transform(device->wined3d_device, - WINED3D_TS_WORLD, (struct wined3d_matrix *)&m); - - wined3d_device_get_transform(device->wined3d_device, - WINED3D_TS_VIEW, (struct wined3d_matrix *)&temp); - multiply_matrix(&m, &temp, &m); - - wined3d_device_get_transform(device->wined3d_device, - WINED3D_TS_PROJECTION, (struct wined3d_matrix *)&temp); - multiply_matrix(&m, &temp, &m); + state = wined3d_stateblock_get_state(device->state); + multiply_matrix(&m, &state->transforms[WINED3D_TS_VIEW], &state->transforms[WINED3D_TS_WORLD]); + multiply_matrix(&m, &state->transforms[WINED3D_TS_PROJECTION], &m); wined3d_mutex_unlock(); /* Left plane. */ @@ -6991,7 +6983,7 @@ static void ddraw_reset_viewport_state(struct ddraw *ddraw) static HRESULT d3d_device_init(struct d3d_device *device, struct ddraw *ddraw, struct ddraw_surface *target, IUnknown *rt_iface, UINT version, IUnknown *outer_unknown) { - static const D3DMATRIX ident = + static const struct wined3d_matrix ident = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, diff --git a/dlls/ddraw/executebuffer.c b/dlls/ddraw/executebuffer.c index 1b680f627ed..e0a9445bf71 100644 --- a/dlls/ddraw/executebuffer.c +++ b/dlls/ddraw/executebuffer.c @@ -205,7 +205,7 @@ HRESULT d3d_execute_buffer_execute(struct d3d_execute_buffer *buffer, struct d3d for (i = 0; i < count; ++i) { D3DMATRIXMULTIPLY *ci = (D3DMATRIXMULTIPLY *)instr; - D3DMATRIX *a, *b, *c; + struct wined3d_matrix *a, *b, *c; a = ddraw_get_object(&device->handle_table, ci->hDestMatrix - 1, DDRAW_HANDLE_MATRIX); b = ddraw_get_object(&device->handle_table, ci->hSrcMatrix1 - 1, DDRAW_HANDLE_MATRIX); diff --git a/dlls/ddraw/utils.c b/dlls/ddraw/utils.c index 2aa4cc2e88e..23e75a32fc7 100644 --- a/dlls/ddraw/utils.c +++ b/dlls/ddraw/utils.c @@ -1155,23 +1155,9 @@ void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps) TRACE(" - ddsCaps : "); DDRAW_dump_DDSCAPS2(&lpcaps->ddsCaps); } -/***************************************************************************** - * multiply_matrix - * - * Multiplies 2 4x4 matrices src1 and src2, and stores the result in dest. - * - * Params: - * dest: Pointer to the destination matrix - * src1: Pointer to the first source matrix - * src2: Pointer to the second source matrix - * - *****************************************************************************/ -void -multiply_matrix(D3DMATRIX *dest, - const D3DMATRIX *src1, - const D3DMATRIX *src2) +void multiply_matrix(struct wined3d_matrix *dst, const struct wined3d_matrix *src1, const struct wined3d_matrix *src2) { - D3DMATRIX temp; + struct wined3d_matrix temp; /* Now do the multiplication 'by hand'. I know that all this could be optimised, but this will be done later :-) */ @@ -1195,8 +1181,7 @@ multiply_matrix(D3DMATRIX *dest, temp._34 = (src1->_14 * src2->_31) + (src1->_24 * src2->_32) + (src1->_34 * src2->_33) + (src1->_44 * src2->_34); temp._44 = (src1->_14 * src2->_41) + (src1->_24 * src2->_42) + (src1->_34 * src2->_43) + (src1->_44 * src2->_44); - /* And copy the new matrix in the good storage.. */ - memcpy(dest, &temp, 16 * sizeof(D3DVALUE)); + *dst = temp; } HRESULT diff --git a/dlls/ddraw/viewport.c b/dlls/ddraw/viewport.c index 1b7f7786993..2f2515036d6 100644 --- a/dlls/ddraw/viewport.c +++ b/dlls/ddraw/viewport.c @@ -28,20 +28,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddraw); static void update_clip_space(struct d3d_device *device, struct wined3d_vec3 *scale, struct wined3d_vec3 *offset) { - D3DMATRIX clip_space = + struct wined3d_matrix clip_space = { scale->x, 0.0f, 0.0f, 0.0f, 0.0f, scale->y, 0.0f, 0.0f, 0.0f, 0.0f, scale->z, 0.0f, offset->x, offset->y, offset->z, 1.0f, }; - D3DMATRIX projection; + struct wined3d_matrix projection; multiply_matrix(&projection, &clip_space, &device->legacy_projection); - wined3d_stateblock_set_transform(device->state, - WINED3D_TS_PROJECTION, (struct wined3d_matrix *)&projection); - wined3d_device_set_transform(device->wined3d_device, - WINED3D_TS_PROJECTION, (struct wined3d_matrix *)&projection); + wined3d_stateblock_set_transform(device->state, WINED3D_TS_PROJECTION, &projection); + wined3d_device_set_transform(device->wined3d_device, WINED3D_TS_PROJECTION, &projection); device->legacy_clipspace = clip_space; } @@ -486,9 +484,10 @@ static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface, DWORD dwVertexCount, D3DTRANSFORMDATA *data, DWORD dwFlags, DWORD *offscreen) { struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface); + const struct wined3d_stateblock_state *state; D3DVIEWPORT vp = viewport->viewports.vp1; - D3DMATRIX view_mat, world_mat, proj_mat, mat; struct transform_vertices_vertex *in, *out; + struct wined3d_matrix mat; float x, y, z, w; unsigned int i; D3DHVERTEX *outH; @@ -522,14 +521,9 @@ static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface, if (activate) viewport_activate(viewport, TRUE); - wined3d_device_get_transform(device->wined3d_device, - D3DTRANSFORMSTATE_VIEW, (struct wined3d_matrix *)&view_mat); - wined3d_device_get_transform(device->wined3d_device, - WINED3D_TS_WORLD_MATRIX(0), (struct wined3d_matrix *)&world_mat); - wined3d_device_get_transform(device->wined3d_device, - WINED3D_TS_PROJECTION, (struct wined3d_matrix *)&proj_mat); - multiply_matrix(&mat, &view_mat, &world_mat); - multiply_matrix(&mat, &proj_mat, &mat); + state = wined3d_stateblock_get_state(device->state); + multiply_matrix(&mat, &state->transforms[WINED3D_TS_VIEW], &state->transforms[WINED3D_TS_WORLD_MATRIX(0)]); + multiply_matrix(&mat, &state->transforms[WINED3D_TS_PROJECTION], &mat); /* The pointer is not tested against NULL on Windows. */ if (dwFlags & D3DTRANSFORM_CLIPPED)