[PATCH 1/4] ddraw: Retrieve transform state from the primary stateblock.

Zebediah Figura z.figura12 at gmail.com
Thu Feb 27 18:48:43 CST 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ddraw/ddraw_private.h |  6 +++---
 dlls/ddraw/device.c        | 38 +++++++++++++++-----------------------
 dlls/ddraw/executebuffer.c |  2 +-
 dlls/ddraw/utils.c         | 21 +++------------------
 dlls/ddraw/viewport.c      | 24 +++++++++---------------
 5 files changed, 31 insertions(+), 60 deletions(-)

diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 088092830c..42a7a85e4e 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 92c726c10d..ee860d4010 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 1b680f627e..e0a9445bf7 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 2aa4cc2e88..23e75a32fc 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 1b7f778699..2f2515036d 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)
-- 
2.25.0




More information about the wine-devel mailing list