d3drm: Implement IDirect3DRM::CreateDeviceFromClipper
Aaryaman Vasishta
jem456.vasishta at gmail.com
Tue Aug 18 08:53:52 CDT 2015
---
dlls/d3drm/d3drm.c | 57 ++++++++++++++++++++++++++++++++++++++++++----
dlls/d3drm/d3drm_private.h | 4 ++--
dlls/d3drm/device.c | 54 +++++++++++++++++++++++++++----------------
dlls/d3drm/tests/d3drm.c | 8 +++----
4 files changed, 93 insertions(+), 30 deletions(-)
diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c
index d734c3b..910fbce 100644
--- a/dlls/d3drm/d3drm.c
+++ b/dlls/d3drm/d3drm.c
@@ -258,10 +258,59 @@ static HRESULT WINAPI d3drm1_CreateDeviceFromClipper(IDirect3DRM *iface,
IDirectDrawClipper *clipper, GUID *guid, int width, int height,
IDirect3DRMDevice **device)
{
- FIXME("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
+ struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
+ IDirectDraw *ddraw;
+ IDirectDrawSurface *surface, *primary_surface;
+ DDSURFACEDESC surface_desc;
+ HWND window;
+ HRESULT hr;
+
+ TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
iface, clipper, debugstr_guid(guid), width, height, device);
- return Direct3DRMDevice_create(&IID_IDirect3DRMDevice, (IUnknown **)device);
+ if (!clipper || !width || !height)
+ return D3DRMERR_BADVALUE;
+
+ hr = DirectDrawCreate(NULL, &ddraw, NULL);
+ if (FAILED(hr))
+ return hr;
+
+ hr = IDirectDrawClipper_GetHWnd(clipper, &window);
+ if (FAILED(hr))
+ return hr;
+
+ hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+ if (FAILED(hr))
+ return hr;
+
+ hr = Direct3DRMDevice_create(&IID_IDirect3DRMDevice, (IUnknown **)device);
+ if (FAILED(hr))
+ return hr;
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_CAPS;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+ hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &primary_surface, NULL);
+ if (FAILED(hr))
+ return hr;
+ hr = IDirectDrawSurface_SetClipper(primary_surface, clipper);
+ if (FAILED(hr))
+ return hr;
+ set_primary_surface((void **)device, 1, clipper, primary_surface);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
+ surface_desc.dwWidth = width;
+ surface_desc.dwHeight = height;
+
+ hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+ if (FAILED(hr))
+ return hr;
+
+ return init_device(&d3drm->IDirect3DRM_iface, guid, ddraw, surface, TRUE, NULL, width, height, (void **)device);
}
static HRESULT WINAPI d3drm1_CreateTextureFromSurface(IDirect3DRM *iface,
@@ -655,7 +704,7 @@ static HRESULT WINAPI d3drm2_CreateDeviceFromClipper(IDirect3DRM2 *iface,
hr = IDirectDrawSurface_SetClipper(primary_surface, clipper);
if (FAILED(hr))
return hr;
- set_primary_surface(device, clipper, primary_surface);
+ set_primary_surface((void **)device, 2, clipper, primary_surface);
memset(&surface_desc, 0, sizeof(surface_desc));
surface_desc.dwSize = sizeof(surface_desc);
@@ -676,7 +725,7 @@ static HRESULT WINAPI d3drm2_CreateDeviceFromClipper(IDirect3DRM2 *iface,
}
IDirectDraw2_Release(ddraw2);
- return init_device(&d3drm->IDirect3DRM_iface, guid, ddraw1, surface, TRUE, d3d2, width, height, device);
+ return init_device(&d3drm->IDirect3DRM_iface, guid, ddraw1, surface, TRUE, d3d2, width, height, (void **)device);
}
static HRESULT WINAPI d3drm2_CreateTextureFromSurface(IDirect3DRM2 *iface,
diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h
index 6744a54..668f361 100644
--- a/dlls/d3drm/d3drm_private.h
+++ b/dlls/d3drm/d3drm_private.h
@@ -37,10 +37,10 @@ HRESULT Direct3DRMTexture_create(REFIID riid, IUnknown** ret_iface) DECLSPEC_HID
HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *data,
D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg) DECLSPEC_HIDDEN;
-void set_primary_surface(IDirect3DRMDevice2 **device, IDirectDrawClipper *clipper, IDirectDrawSurface *primary_surface) DECLSPEC_HIDDEN;
+void set_primary_surface(void **device, UINT version, IDirectDrawClipper *clipper, IDirectDrawSurface *primary_surface) DECLSPEC_HIDDEN;
HRESULT init_device(IDirect3DRM *d3drm, GUID *guid, IDirectDraw *ddraw, IDirectDrawSurface *surface, BOOL z_surface, IDirect3D2 *d3d2,
- int width, int height, IDirect3DRMDevice2 **device) DECLSPEC_HIDDEN;
+ int width, int height, void **device) DECLSPEC_HIDDEN;
struct d3drm_file_header
{
diff --git a/dlls/d3drm/device.c b/dlls/d3drm/device.c
index bc69e29..b096798 100644
--- a/dlls/d3drm/device.c
+++ b/dlls/d3drm/device.c
@@ -70,9 +70,14 @@ static inline struct d3drm_device *impl_from_IDirect3DRMWinDevice(IDirect3DRMWin
return CONTAINING_RECORD(iface, struct d3drm_device, IDirect3DRMWinDevice_iface);
}
-void set_primary_surface(IDirect3DRMDevice2 **device, IDirectDrawClipper *clipper, IDirectDrawSurface *primary_surface)
+void set_primary_surface(void **device, UINT version, IDirectDrawClipper *clipper, IDirectDrawSurface *primary_surface)
{
- struct d3drm_device *object = impl_from_IDirect3DRMDevice2(*device);
+ struct d3drm_device *object;
+
+ if (version == 1)
+ object = impl_from_IDirect3DRMDevice(*device);
+ else
+ object = impl_from_IDirect3DRMDevice2(*device);
object->primary_surface = primary_surface;
object->clipper = clipper;
@@ -80,19 +85,21 @@ void set_primary_surface(IDirect3DRMDevice2 **device, IDirectDrawClipper *clippe
}
HRESULT init_device(IDirect3DRM *d3drm, GUID *guid, IDirectDraw *ddraw, IDirectDrawSurface *surface, BOOL z_surface, IDirect3D2 *d3d2,
- int width, int height, IDirect3DRMDevice2 **device)
+ int width, int height, void **device)
{
- struct d3drm_device *object = impl_from_IDirect3DRMDevice2(*device);
- IDirectDraw2 *ddraw2;
+ struct d3drm_device *object;
IDirectDrawSurface *ds;
IDirect3DDevice *device1;
IDirect3DDevice2 *device2;
DDSURFACEDESC surface_desc;
HRESULT hr;
- hr = IDirectDraw2_QueryInterface(ddraw, &IID_IDirectDraw2, (void**)&ddraw2);
- if (FAILED(hr))
- return hr;
+ if (d3d2)
+ {
+ object = impl_from_IDirect3DRMDevice2(*device);
+ }
+ else
+ object = impl_from_IDirect3DRMDevice(*device);
if (z_surface)
{
@@ -103,7 +110,7 @@ HRESULT init_device(IDirect3DRM *d3drm, GUID *guid, IDirectDraw *ddraw, IDirectD
surface_desc.dwZBufferBitDepth = 16;
surface_desc.dwWidth = width;
surface_desc.dwHeight = height;
- hr = IDirectDraw2_CreateSurface(ddraw2, &surface_desc, &ds, NULL);
+ hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &ds, NULL);
if (FAILED(hr))
return hr;
@@ -112,31 +119,38 @@ HRESULT init_device(IDirect3DRM *d3drm, GUID *guid, IDirectDraw *ddraw, IDirectD
if (FAILED(hr))
return hr;
- hr = IDirect3D2_CreateDevice(d3d2, &IID_IDirect3DRGBDevice, surface, &device2);
+ if (d3d2)
+ hr = IDirect3D2_CreateDevice(d3d2, &IID_IDirect3DRGBDevice, surface, &device2);
+ else
+ hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirect3DRGBDevice, (void **)&device1);
if (FAILED(hr))
return hr;
}
else
- hr = IDirect3D2_CreateDevice(d3d2, &IID_IDirect3DRGBDevice, surface, &device2);
-
+ {
+ if (d3d2)
+ hr = IDirect3D2_CreateDevice(d3d2, &IID_IDirect3DRGBDevice, surface, &device2);
+ else
+ hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirect3DRGBDevice, (void **)&device1);
+ }
if (FAILED(hr))
return hr;
-
- IDirect3D2_Release(d3d2);
IDirectDrawSurface_Release(surface);
- hr = IDirect3DDevice2_QueryInterface(device2, &IID_IDirect3DDevice, (void**)&device1);
- if (FAILED(hr))
- return hr;
-
+ if (d3d2)
+ {
+ IDirect3D2_Release(d3d2);
+ hr = IDirect3DDevice2_QueryInterface(device2, &IID_IDirect3DDevice, (void**)&device1);
+ if (FAILED(hr))
+ return hr;
+ IDirect3DDevice2_Release(device2);
+ }
object->device = device1;
object->ddraw = ddraw;
object->d3drm = d3drm;
IDirect3DRM_AddRef(d3drm);
- IDirect3DDevice2_Release(device2);
- IDirectDraw2_Release(ddraw2);
return D3DRM_OK;
}
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 12f71dd..ea1e08f 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -1993,18 +1993,18 @@ static void test_create_device_from_clipper1(void)
cref1 = get_refcount((IUnknown *)clipper);
hr = IDirect3DRM_CreateDeviceFromClipper(d3drm1, clipper, &driver, 0, 0, &device1);
- todo_wine ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %x.\n", hr);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %x.\n", hr);
/* If NULL is passed for clipper, CreateDeviceFromClipper returns D3DRMERR_BADVALUE */
hr = IDirect3DRM_CreateDeviceFromClipper(d3drm1, NULL, &driver, 0, 0, &device1);
- todo_wine ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %x.\n", hr);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %x.\n", hr);
hr = IDirect3DRM_CreateDeviceFromClipper(d3drm1, clipper, &driver, 300, 200, &device1);
ok(hr == D3DRM_OK, "Cannot create IDirect3DRMDevice interface (hr = %x).\n", hr);
ref2 = get_refcount((IUnknown *)d3drm1);
- todo_wine ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %u , ref2 = %u.\n", ref1, ref2);
+ ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %u , ref2 = %u.\n", ref1, ref2);
cref2 = get_refcount((IUnknown *)clipper);
- todo_wine ok(cref2 > cref1, "expected cref2 > cref1, got cref1 = %u , cref2 = %u.\n", cref1, cref2);
+ ok(cref2 > cref1, "expected cref2 > cref1, got cref1 = %u , cref2 = %u.\n", cref1, cref2);
/* Fetch immediate mode device in order to access render target */
hr = IDirect3DRMDevice_GetDirect3DDevice(device1, &d3ddevice1);
--
2.3.2 (Apple Git-55)
More information about the wine-patches
mailing list