ddraw: Retrieve transform state from the primary stateblock.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Zebediah Figura 2020-02-27 18:48:43 -06:00 committed by Alexandre Julliard
parent b3fbc70291
commit 0774e76802
5 changed files with 31 additions and 60 deletions

View File

@ -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)
{

View File

@ -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,

View File

@ -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);

View File

@ -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

View File

@ -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)