From: Aaryaman Vasishta Subject: [PATCH 5/7] d3drm: Fix device not assigning width and height after creation. Message-Id: <1466804973-82867-5-git-send-email-jem456.vasishta@gmail.com> Date: Sat, 25 Jun 2016 03:19:31 +0530 In-Reply-To: <1466804973-82867-1-git-send-email-jem456.vasishta@gmail.com> References: <1466804973-82867-1-git-send-email-jem456.vasishta@gmail.com> Signed-off-by: Aaryaman Vasishta --- dlls/d3drm/device.c | 29 ++++++++++++++++++++++++++ dlls/d3drm/tests/d3drm.c | 54 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/dlls/d3drm/device.c b/dlls/d3drm/device.c index 3115e9f..8cde5bd 100644 --- a/dlls/d3drm/device.c +++ b/dlls/d3drm/device.c @@ -237,17 +237,46 @@ HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirect3DRM } } device->device = device1; + device->width = desc.dwWidth; + device->height = desc.dwHeight; return hr; } HRESULT d3drm_device_set_ddraw_device_d3d(struct d3drm_device *device, IDirect3DRM *d3drm, IDirect3D *d3d, IDirect3DDevice *d3d_device) { + IDirectDrawSurface *surface; + IDirect3DDevice2 *d3d_device2; + DDSURFACEDESC desc; + HRESULT hr; + device->d3drm = d3drm; IDirect3DRM_AddRef(d3drm); device->device = d3d_device; IDirect3DDevice_AddRef(d3d_device); + /* Fetch render target and get width/height from there */ + if (FAILED(hr = IDirect3DDevice_QueryInterface(d3d_device, &IID_IDirectDrawSurface, (void **)&surface))) + { + if (FAILED(hr = IDirect3DDevice_QueryInterface(d3d_device, &IID_IDirect3DDevice2, (void **)&d3d_device2))) + return hr; + hr = IDirect3DDevice2_GetRenderTarget(d3d_device2, &surface); + IDirect3DDevice2_Release(d3d_device2); + if (FAILED(hr)) + return hr; + } + + desc.dwSize = sizeof(desc); + if (FAILED(hr = IDirectDrawSurface_GetSurfaceDesc(surface, &desc))) + { + IDirectDrawSurface_Release(surface); + return hr; + } + + device->width = desc.dwWidth; + device->height = desc.dwHeight; + IDirectDrawSurface_Release(surface); + return IDirect3D_QueryInterface(d3d, &IID_IDirectDraw, (void **)&device->ddraw); } diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 0a95afc..4321bc9 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -2764,7 +2764,7 @@ static void test_create_device_from_clipper1(void) IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_primary = NULL; IDirectDrawSurface7 *surface7 = NULL; DDSURFACEDESC desc, surface_desc; - DWORD expected_flags; + DWORD expected_flags, ret_val; HWND window; GUID driver = IID_IDirect3DRGBDevice; HRESULT hr; @@ -2800,6 +2800,10 @@ static void test_create_device_from_clipper1(void) ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %u , ref2 = %u.\n", ref1, ref2); cref2 = get_refcount((IUnknown *)clipper); ok(cref2 > cref1, "expected cref2 > cref1, got cref1 = %u , cref2 = %u.\n", cref1, cref2); + ret_val = IDirect3DRMDevice_GetWidth(device1); + ok(ret_val == 300, "Expected device width = 300, got %u.\n", ret_val); + ret_val = IDirect3DRMDevice_GetHeight(device1); + ok(ret_val == 200, "Expected device height == 200, got %u.\n", ret_val); /* Fetch immediate mode device in order to access render target */ hr = IDirect3DRMDevice_GetDirect3DDevice(device1, &d3ddevice1); @@ -2931,7 +2935,7 @@ static void test_create_device_from_clipper2(void) IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_primary = NULL; IDirectDrawSurface7 *surface7 = NULL; DDSURFACEDESC desc, surface_desc; - DWORD expected_flags; + DWORD expected_flags, ret_val; HWND window; GUID driver = IID_IDirect3DRGBDevice; HRESULT hr; @@ -2973,6 +2977,10 @@ static void test_create_device_from_clipper2(void) ok(ref3 == ref2, "expected ref3 == ref2, got ref2 = %u , ref3 = %u.\n", ref2, ref3); cref2 = get_refcount((IUnknown *)clipper); ok(cref2 > cref1, "expected cref2 > cref1, got cref1 = %u , cref2 = %u.\n", cref1, cref2); + ret_val = IDirect3DRMDevice2_GetWidth(device2); + ok(ret_val == 300, "Expected device width = 300, got %u.\n", ret_val); + ret_val = IDirect3DRMDevice2_GetHeight(device2); + ok(ret_val == 200, "Expected device height == 200, got %u.\n", ret_val); /* Fetch immediate mode device in order to access render target */ hr = IDirect3DRMDevice2_GetDirect3DDevice2(device2, &d3ddevice2); @@ -3105,7 +3113,7 @@ static void test_create_device_from_clipper3(void) IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_primary = NULL; IDirectDrawSurface7 *surface7 = NULL; DDSURFACEDESC desc, surface_desc; - DWORD expected_flags; + DWORD expected_flags, ret_val; HWND window; GUID driver = IID_IDirect3DRGBDevice; HRESULT hr; @@ -3147,6 +3155,10 @@ static void test_create_device_from_clipper3(void) ok(ref3 == ref2, "expected ref3 == ref2, got ref2 = %u , ref3 = %u.\n", ref2, ref3); cref2 = get_refcount((IUnknown *)clipper); ok(cref2 > cref1, "expected cref2 > cref1, got cref1 = %u , cref2 = %u.\n", cref1, cref2); + ret_val = IDirect3DRMDevice3_GetWidth(device3); + ok(ret_val == 300, "Expected device width = 300, got %u.\n", ret_val); + ret_val = IDirect3DRMDevice3_GetHeight(device3); + ok(ret_val == 200, "Expected device height == 200, got %u.\n", ret_val); /* Fetch immediate mode device in order to access render target */ hr = IDirect3DRMDevice3_GetDirect3DDevice2(device3, &d3ddevice2); @@ -3275,7 +3287,7 @@ static void test_create_device_from_surface1(void) IDirect3DRMDevice *device1 = (IDirect3DRMDevice *)0xdeadbeef; IDirect3DDevice *d3ddevice1 = NULL; IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_surface = NULL, *d3drm_ds = NULL; - DWORD expected_flags; + DWORD expected_flags, ret_val; HWND window; GUID driver = IID_IDirect3DRGBDevice; ULONG ref1, ref2, surface_ref1, surface_ref2; @@ -3330,6 +3342,10 @@ static void test_create_device_from_surface1(void) ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %u , ref2 = %u.\n", ref1, ref2); surface_ref2 = get_refcount((IUnknown *)surface); ok(surface_ref2 > surface_ref1, "Expected surface_ref2 > surface_ref1, got surface_ref1 = %u, surface_ref2 = %u.\n", surface_ref1, surface_ref2); + ret_val = IDirect3DRMDevice_GetWidth(device1); + ok(ret_val == rc.right, "Expected device width = 300, got %u.\n", ret_val); + ret_val = IDirect3DRMDevice_GetHeight(device1); + ok(ret_val == rc.bottom, "Expected device height == 200, got %u.\n", ret_val); /* Check if CreateDeviceFromSurface creates a primary surface */ hr = IDirectDraw_EnumSurfaces(ddraw, DDENUMSURFACES_ALL | DDENUMSURFACES_DOESEXIST, @@ -3443,7 +3459,7 @@ static void test_create_device_from_surface2(void) IDirect3DRMDevice2 *device2 = (IDirect3DRMDevice2 *)0xdeadbeef; IDirect3DDevice2 *d3ddevice2 = NULL; IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_surface = NULL, *d3drm_ds = NULL; - DWORD expected_flags; + DWORD expected_flags, ret_val; HWND window; GUID driver = IID_IDirect3DRGBDevice; ULONG ref1, ref2, ref3, surface_ref1, surface_ref2; @@ -3504,6 +3520,10 @@ static void test_create_device_from_surface2(void) ok(ref3 == ref2, "expected ref3 == ref2, got ref2 = %u , ref3 = %u.\n", ref2, ref3); surface_ref2 = get_refcount((IUnknown *)surface); ok(surface_ref2 > surface_ref1, "Expected surface_ref2 > surface_ref1, got surface_ref1 = %u, surface_ref2 = %u.\n", surface_ref1, surface_ref2); + ret_val = IDirect3DRMDevice2_GetWidth(device2); + ok(ret_val == rc.right, "Expected device width = 300, got %u.\n", ret_val); + ret_val = IDirect3DRMDevice2_GetHeight(device2); + ok(ret_val == rc.bottom, "Expected device height == 200, got %u.\n", ret_val); /* Check if CreateDeviceFromSurface creates a primary surface */ hr = IDirectDraw_EnumSurfaces(ddraw, DDENUMSURFACES_ALL | DDENUMSURFACES_DOESEXIST, @@ -3621,7 +3641,7 @@ static void test_create_device_from_surface3(void) IDirect3DRMDevice3 *device3 = (IDirect3DRMDevice3 *)0xdeadbeef; IDirect3DDevice2 *d3ddevice2 = NULL; IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_surface = NULL, *d3drm_ds = NULL; - DWORD expected_flags; + DWORD expected_flags, ret_val; HWND window; GUID driver = IID_IDirect3DRGBDevice; ULONG ref1, ref2, ref3, surface_ref1, surface_ref2; @@ -3682,6 +3702,10 @@ static void test_create_device_from_surface3(void) ok(ref3 == ref2, "expected ref3 == ref2, got ref2 = %u , ref3 = %u.\n", ref2, ref3); surface_ref2 = get_refcount((IUnknown *)surface); ok(surface_ref2 > surface_ref1, "Expected surface_ref2 > surface_ref1, got surface_ref1 = %u, surface_ref2 = %u.\n", surface_ref1, surface_ref2); + ret_val = IDirect3DRMDevice3_GetWidth(device3); + ok(ret_val == rc.right, "Expected device width = 300, got %u.\n", ret_val); + ret_val = IDirect3DRMDevice3_GetHeight(device3); + ok(ret_val == rc.bottom, "Expected device height == 200, got %u.\n", ret_val); /* Check if CreateDeviceFromSurface creates a primary surface */ hr = IDirectDraw_EnumSurfaces(ddraw, DDENUMSURFACES_ALL | DDENUMSURFACES_DOESEXIST, @@ -3914,7 +3938,7 @@ static void test_create_device_from_d3d1(void) IDirect3DDevice *d3ddevice1 = NULL, *d3drm_d3ddevice1 = NULL; IDirect3DDevice2 *d3ddevice2 = (IDirect3DDevice2 *)0xdeadbeef; IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_ds = NULL; - DWORD expected_flags; + DWORD expected_flags, ret_val; DDSCAPS caps = { DDSCAPS_ZBUFFER }; DDSURFACEDESC desc; RECT rc; @@ -3960,6 +3984,10 @@ static void test_create_device_from_d3d1(void) ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %u , ref2 = %u.\n", ref1, ref2); device_ref2 = get_refcount((IUnknown *)d3ddevice1); ok(device_ref2 > device_ref1, "Expected device_ref2 > device_ref1, got device_ref1 = %u, device_ref2 = %u.\n", device_ref1, device_ref2); + ret_val = IDirect3DRMDevice_GetWidth(device1); + ok(ret_val == rc.right, "Expected device width = 300, got %u.\n", ret_val); + ret_val = IDirect3DRMDevice_GetHeight(device1); + ok(ret_val == rc.bottom, "Expected device height == 200, got %u.\n", ret_val); hr = IDirect3DRMDevice_QueryInterface(device1, &IID_IDirect3DRMDevice2, (void **)&device2); ok(SUCCEEDED(hr), "Cannot get IDirect3DRMDevice2 Interface (hr = %x).\n", hr); @@ -4111,7 +4139,7 @@ static void test_create_device_from_d3d2(void) IDirect3DRMDevice2 *device2 = (IDirect3DRMDevice2 *)0xdeadbeef; IDirect3DDevice2 *d3ddevice2 = NULL, *d3drm_d3ddevice2 = NULL; IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_ds = NULL; - DWORD expected_flags; + DWORD expected_flags, ret_val; DDSCAPS caps = { DDSCAPS_ZBUFFER }; DDSURFACEDESC desc; RECT rc; @@ -4166,6 +4194,10 @@ static void test_create_device_from_d3d2(void) ok(ref3 == ref2, "expected ref3 == ref2, got ref2 = %u , ref3 = %u.\n", ref2, ref3); device_ref2 = get_refcount((IUnknown *)d3ddevice2); ok(device_ref2 > device_ref1, "Expected device_ref2 > device_ref1, got device_ref1 = %u, device_ref2 = %u.\n", device_ref1, device_ref2); + ret_val = IDirect3DRMDevice2_GetWidth(device2); + ok(ret_val == rc.right, "Expected device width = 300, got %u.\n", ret_val); + ret_val = IDirect3DRMDevice2_GetHeight(device2); + ok(ret_val == rc.bottom, "Expected device height == 200, got %u.\n", ret_val); hr = IDirectDraw_EnumSurfaces(ddraw1, DDENUMSURFACES_ALL | DDENUMSURFACES_DOESEXIST, NULL, &surface, surface_callback); @@ -4237,7 +4269,7 @@ static void test_create_device_from_d3d3(void) IDirect3DRMDevice3 *device3 = (IDirect3DRMDevice3 *)0xdeadbeef; IDirect3DDevice2 *d3ddevice2 = NULL, *d3drm_d3ddevice2 = NULL; IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_ds = NULL; - DWORD expected_flags; + DWORD expected_flags, ret_val; DDSCAPS caps = { DDSCAPS_ZBUFFER }; DDSURFACEDESC desc; RECT rc; @@ -4292,6 +4324,10 @@ static void test_create_device_from_d3d3(void) ok(ref3 == ref2, "expected ref3 == ref2, got ref2 = %u , ref3 = %u.\n", ref2, ref3); device_ref2 = get_refcount((IUnknown *)d3ddevice2); ok(device_ref2 > device_ref1, "Expected device_ref2 > device_ref1, got device_ref1 = %u, device_ref2 = %u.\n", device_ref1, device_ref2); + ret_val = IDirect3DRMDevice3_GetWidth(device3); + ok(ret_val == rc.right, "Expected device width = 300, got %u.\n", ret_val); + ret_val = IDirect3DRMDevice3_GetHeight(device3); + ok(ret_val == rc.bottom, "Expected device height == 200, got %u.\n", ret_val); hr = IDirectDraw_EnumSurfaces(ddraw1, DDENUMSURFACES_ALL | DDENUMSURFACES_DOESEXIST, NULL, &surface, surface_callback); -- 2.3.2 (Apple Git-55)