From: Amine Khaldi Date: Tue, 24 Nov 2015 10:43:48 +0000 (+0000) Subject: [D3DRM] Sync with Wine Staging 1.7.55. CORE-10536 X-Git-Tag: ReactOS-0.4.0~60^2~24 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=65242a97096e6cb99b8eba441fea8482ab6885fc [D3DRM] Sync with Wine Staging 1.7.55. CORE-10536 svn path=/trunk/; revision=70083 --- diff --git a/reactos/dll/directx/wine/d3drm/CMakeLists.txt b/reactos/dll/directx/wine/d3drm/CMakeLists.txt index e686fd07e50..8ba7988bc14 100644 --- a/reactos/dll/directx/wine/d3drm/CMakeLists.txt +++ b/reactos/dll/directx/wine/d3drm/CMakeLists.txt @@ -30,6 +30,6 @@ if(CMAKE_C_COMPILER_ID STREQUAL "Clang") target_link_libraries(d3drm mingwex) endif() -add_importlibs(d3drm d3dxof msvcrt kernel32 ntdll) +add_importlibs(d3drm ddraw d3dxof msvcrt kernel32 ntdll) add_pch(d3drm d3drm_private.h SOURCE) add_cd_file(TARGET d3drm DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/directx/wine/d3drm/d3drm.c b/reactos/dll/directx/wine/d3drm/d3drm.c index 627bd69b71a..6724850cf4c 100644 --- a/reactos/dll/directx/wine/d3drm/d3drm.c +++ b/reactos/dll/directx/wine/d3drm/d3drm.c @@ -220,37 +220,125 @@ static HRESULT WINAPI d3drm1_CreateMaterial(IDirect3DRM *iface, static HRESULT WINAPI d3drm1_CreateDevice(IDirect3DRM *iface, DWORD width, DWORD height, IDirect3DRMDevice **device) { + struct d3drm_device *object; + HRESULT hr; FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device); - return Direct3DRMDevice_create(&IID_IDirect3DRMDevice, (IUnknown **)device); + hr = d3drm_device_create(&object); + if (FAILED(hr)) + return hr; + + *device = IDirect3DRMDevice_from_impl(object); + + return D3DRM_OK; } static HRESULT WINAPI d3drm1_CreateDeviceFromSurface(IDirect3DRM *iface, GUID *guid, IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice **device) { - FIXME("iface %p, guid %s, ddraw %p, backbuffer %p, device %p partial stub.\n", + struct d3drm *d3drm = impl_from_IDirect3DRM(iface); + struct d3drm_device *object; + HRESULT hr; + + TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n", iface, debugstr_guid(guid), ddraw, backbuffer, device); - return Direct3DRMDevice_create(&IID_IDirect3DRMDevice, (IUnknown **)device); + if (!device) + return D3DRMERR_BADVALUE; + *device = NULL; + + if (!backbuffer || !ddraw) + return D3DRMERR_BADDEVICE; + + hr = d3drm_device_create(&object); + if (FAILED(hr)) + return hr; + + hr = d3drm_device_init(object, 1, &d3drm->IDirect3DRM_iface, ddraw, backbuffer, TRUE); + if (SUCCEEDED(hr)) + *device = IDirect3DRMDevice_from_impl(object); + else + d3drm_device_destroy(object); + + return hr; } static HRESULT WINAPI d3drm1_CreateDeviceFromD3D(IDirect3DRM *iface, IDirect3D *d3d, IDirect3DDevice *d3d_device, IDirect3DRMDevice **device) { - FIXME("iface %p, d3d %p, d3d_device %p, device %p partial stub.\n", + struct d3drm_device *object; + HRESULT hr; + TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n", iface, d3d, d3d_device, device); - return Direct3DRMDevice_create(&IID_IDirect3DRMDevice, (IUnknown **)device); + if (!device) + return D3DRMERR_BADVALUE; + *device = NULL; + if (!d3d || !d3d_device) + return D3DRMERR_BADVALUE; + + hr = d3drm_device_create(&object); + if (FAILED(hr)) + return hr; + + hr = d3drm_device_set_ddraw_device_d3d(object, iface, d3d, d3d_device); + if (FAILED(hr)) + { + d3drm_device_destroy(object); + return hr; + } + *device = IDirect3DRMDevice_from_impl(object); + + return D3DRM_OK; } 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_device *object; + IDirectDraw *ddraw; + IDirectDrawSurface *render_target; + 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 (!device) + return D3DRMERR_BADVALUE; + *device = NULL; + + if (!clipper || !width || !height) + return D3DRMERR_BADVALUE; + + hr = DirectDrawCreate(NULL, &ddraw, NULL); + if (FAILED(hr)) + return hr; + + hr = d3drm_device_create(&object); + if (FAILED(hr)) + { + IDirectDraw_Release(ddraw); + return hr; + } + + hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target); + if (FAILED(hr)) + { + IDirectDraw_Release(ddraw); + d3drm_device_destroy(object); + return hr; + } + + hr = d3drm_device_init(object, 1, iface, ddraw, render_target, TRUE); + IDirectDraw_Release(ddraw); + IDirectDrawSurface_Release(render_target); + if (FAILED(hr)) + d3drm_device_destroy(object); + else + *device = IDirect3DRMDevice_from_impl(object); + + return hr; } static HRESULT WINAPI d3drm1_CreateTextureFromSurface(IDirect3DRM *iface, @@ -572,37 +660,103 @@ static HRESULT WINAPI d3drm2_CreateMaterial(IDirect3DRM2 *iface, static HRESULT WINAPI d3drm2_CreateDevice(IDirect3DRM2 *iface, DWORD width, DWORD height, IDirect3DRMDevice2 **device) { - FIXME("iface %p, width %u, height %u, device %p.\n", iface, width, height, device); + struct d3drm_device *object; + HRESULT hr; + FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device); + + hr = d3drm_device_create(&object); + if (FAILED(hr)) + return hr; - return Direct3DRMDevice_create(&IID_IDirect3DRMDevice2, (IUnknown **)device); + *device = IDirect3DRMDevice2_from_impl(object); + + return D3DRM_OK; } static HRESULT WINAPI d3drm2_CreateDeviceFromSurface(IDirect3DRM2 *iface, GUID *guid, IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice2 **device) { - FIXME("iface %p, guid %s, ddraw %p, backbuffer %p, device %p partial stub.\n", + struct d3drm *d3drm = impl_from_IDirect3DRM2(iface); + IDirect3DRMDevice3 *device3; + HRESULT hr; + TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n", iface, debugstr_guid(guid), ddraw, backbuffer, device); - return Direct3DRMDevice_create(&IID_IDirect3DRMDevice2, (IUnknown **)device); + if (!device) + return D3DRMERR_BADVALUE; + *device = NULL; + hr = IDirect3DRM3_CreateDeviceFromSurface(&d3drm->IDirect3DRM3_iface, guid, ddraw, backbuffer, 0, &device3); + if (FAILED(hr)) + return hr; + + hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device); + IDirect3DRMDevice3_Release(device3); + + return hr; } static HRESULT WINAPI d3drm2_CreateDeviceFromD3D(IDirect3DRM2 *iface, - IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice2 **device) + IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice2 **device) { - FIXME("iface %p, d3d %p, d3d_device %p, device %p partial stub.\n", + struct d3drm *d3drm = impl_from_IDirect3DRM2(iface); + IDirect3D *d3d1; + IDirect3DDevice *d3d_device1; + IDirect3DRMDevice *device1; + HRESULT hr; + TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n", iface, d3d, d3d_device, device); - return Direct3DRMDevice_create(&IID_IDirect3DRMDevice2, (IUnknown **)device); + if (!device) + return D3DRMERR_BADVALUE; + *device = NULL; + if (!d3d || !d3d_device) + return D3DRMERR_BADVALUE; + + hr = IDirect3D2_QueryInterface(d3d, &IID_IDirect3D, (void **)&d3d1); + if (FAILED(hr)) + return hr; + + hr = IDirect3DDevice2_QueryInterface(d3d_device, &IID_IDirect3DDevice, (void **)&d3d_device1); + if (FAILED(hr)) + { + IDirect3D_Release(d3d1); + return hr; + } + + hr = IDirect3DRM_CreateDeviceFromD3D(&d3drm->IDirect3DRM_iface, d3d1, d3d_device1, &device1); + IDirect3D_Release(d3d1); + IDirect3DDevice_Release(d3d_device1); + if (FAILED(hr)) + return hr; + + hr = IDirect3DRMDevice_QueryInterface(device1, &IID_IDirect3DRMDevice2, (void **)device); + IDirect3DRMDevice_Release(device1); + + return hr; } static HRESULT WINAPI d3drm2_CreateDeviceFromClipper(IDirect3DRM2 *iface, IDirectDrawClipper *clipper, GUID *guid, int width, int height, IDirect3DRMDevice2 **device) { - FIXME("iface %p, clipper %p, guid %s, width %d, height %d, device %p partial stub.\n", + struct d3drm *d3drm = impl_from_IDirect3DRM2(iface); + IDirect3DRMDevice3 *device3; + 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_IDirect3DRMDevice2, (IUnknown **)device); + if (!device) + return D3DRMERR_BADVALUE; + *device = NULL; + hr = IDirect3DRM3_CreateDeviceFromClipper(&d3drm->IDirect3DRM3_iface, clipper, guid, width, height, &device3); + if (FAILED(hr)) + return hr; + + hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device); + IDirect3DRMDevice3_Release(device3); + + return hr; } static HRESULT WINAPI d3drm2_CreateTextureFromSurface(IDirect3DRM2 *iface, @@ -946,37 +1100,139 @@ static HRESULT WINAPI d3drm3_CreateMaterial(IDirect3DRM3 *iface, static HRESULT WINAPI d3drm3_CreateDevice(IDirect3DRM3 *iface, DWORD width, DWORD height, IDirect3DRMDevice3 **device) { + struct d3drm_device *object; + HRESULT hr; FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device); - return Direct3DRMDevice_create(&IID_IDirect3DRMDevice3, (IUnknown **)device); + hr = d3drm_device_create(&object); + if (FAILED(hr)) + return hr; + + *device = IDirect3DRMDevice3_from_impl(object); + + return D3DRM_OK; } static HRESULT WINAPI d3drm3_CreateDeviceFromSurface(IDirect3DRM3 *iface, GUID *guid, IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, DWORD flags, IDirect3DRMDevice3 **device) { - FIXME("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p partial stub.\n", + struct d3drm *d3drm = impl_from_IDirect3DRM3(iface); + struct d3drm_device *object; + BOOL use_z_surface; + HRESULT hr; + + TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n", iface, debugstr_guid(guid), ddraw, backbuffer, flags, device); - return Direct3DRMDevice_create(&IID_IDirect3DRMDevice3, (IUnknown **)device); + if (!device) + return D3DRMERR_BADVALUE; + *device = NULL; + + if (!backbuffer || !ddraw) + return D3DRMERR_BADDEVICE; + + hr = d3drm_device_create(&object); + if (FAILED(hr)) + return hr; + + use_z_surface = !(flags & D3DRMDEVICE_NOZBUFFER); + + hr = d3drm_device_init(object, 3, &d3drm->IDirect3DRM_iface, ddraw, backbuffer, use_z_surface); + if (SUCCEEDED(hr)) + *device = IDirect3DRMDevice3_from_impl(object); + else + d3drm_device_destroy(object); + + return hr; } static HRESULT WINAPI d3drm3_CreateDeviceFromD3D(IDirect3DRM3 *iface, IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice3 **device) { - FIXME("iface %p, d3d %p, d3d_device %p, device %p partial stub.\n", + struct d3drm *d3drm = impl_from_IDirect3DRM3(iface); + IDirect3D *d3d1; + IDirect3DDevice *d3d_device1; + IDirect3DRMDevice *device1; + HRESULT hr; + TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n", iface, d3d, d3d_device, device); - return Direct3DRMDevice_create(&IID_IDirect3DRMDevice3, (IUnknown **)device); + if (!device) + return D3DRMERR_BADVALUE; + *device = NULL; + if (!d3d || !d3d_device) + return D3DRMERR_BADVALUE; + + hr = IDirect3D2_QueryInterface(d3d, &IID_IDirect3D, (void **)&d3d1); + if (FAILED(hr)) + return hr; + hr = IDirect3DDevice2_QueryInterface(d3d_device, &IID_IDirect3DDevice, (void **)&d3d_device1); + if (FAILED(hr)) + { + IDirect3D_Release(d3d1); + return hr; + } + + hr = IDirect3DRM_CreateDeviceFromD3D(&d3drm->IDirect3DRM_iface, d3d1, d3d_device1, &device1); + IDirect3D_Release(d3d1); + IDirect3DDevice_Release(d3d_device1); + if (FAILED(hr)) + return hr; + + hr = IDirect3DRMDevice_QueryInterface(device1, &IID_IDirect3DRMDevice3, (void **)device); + IDirect3DRMDevice_Release(device1); + + return hr; } static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface, IDirectDrawClipper *clipper, GUID *guid, int width, int height, IDirect3DRMDevice3 **device) { - FIXME("iface %p, clipper %p, guid %s, width %d, height %d, device %p partial stub.\n", + struct d3drm *d3drm = impl_from_IDirect3DRM3(iface); + struct d3drm_device *object; + IDirectDraw *ddraw; + IDirectDrawSurface *render_target; + 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_IDirect3DRMDevice3, (IUnknown **)device); + if (!device) + return D3DRMERR_BADVALUE; + *device = NULL; + + if (!clipper || !width || !height) + return D3DRMERR_BADVALUE; + + hr = DirectDrawCreate(NULL, &ddraw, NULL); + if (FAILED(hr)) + return hr; + + hr = d3drm_device_create(&object); + if (FAILED(hr)) + { + IDirectDraw_Release(ddraw); + return hr; + } + + hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target); + if (FAILED(hr)) + { + IDirectDraw_Release(ddraw); + d3drm_device_destroy(object); + return hr; + } + + hr = d3drm_device_init(object, 3, &d3drm->IDirect3DRM_iface, ddraw, render_target, TRUE); + IDirectDraw_Release(ddraw); + IDirectDrawSurface_Release(render_target); + if (FAILED(hr)) + d3drm_device_destroy(object); + else + *device = IDirect3DRMDevice3_from_impl(object); + + return hr; } static HRESULT WINAPI d3drm3_CreateShadow(IDirect3DRM3 *iface, IUnknown *object, IDirect3DRMLight *light, diff --git a/reactos/dll/directx/wine/d3drm/d3drm_private.h b/reactos/dll/directx/wine/d3drm/d3drm_private.h index f5004c6f901..4906f7b4fd3 100644 --- a/reactos/dll/directx/wine/d3drm/d3drm_private.h +++ b/reactos/dll/directx/wine/d3drm/d3drm_private.h @@ -38,7 +38,12 @@ #include WINE_DEFAULT_DEBUG_CHANNEL(d3drm); -HRESULT Direct3DRMDevice_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN; +struct d3drm_device; + +HRESULT d3drm_device_create(struct d3drm_device **out) DECLSPEC_HIDDEN; +IDirect3DRMDevice *IDirect3DRMDevice_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN; +IDirect3DRMDevice2 *IDirect3DRMDevice2_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN; +IDirect3DRMDevice3 *IDirect3DRMDevice3_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN; HRESULT Direct3DRMFace_create(REFIID riid, IUnknown** ret_iface) DECLSPEC_HIDDEN; HRESULT Direct3DRMFrame_create(REFIID riid, IUnknown* parent_frame, IUnknown** ret_iface) DECLSPEC_HIDDEN; HRESULT Direct3DRMLight_create(IUnknown** ppObj) DECLSPEC_HIDDEN; @@ -51,6 +56,16 @@ 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 d3drm_device_destroy(struct d3drm_device *device) DECLSPEC_HIDDEN; + +HRESULT d3drm_device_create_surfaces_from_clipper(struct d3drm_device *object, IDirectDraw *ddraw, IDirectDrawClipper *clipper, int width, int height, + IDirectDrawSurface **surface) DECLSPEC_HIDDEN; + +HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirect3DRM *d3drm, IDirectDraw *ddraw, IDirectDrawSurface *surface, + BOOL create_z_surface) DECLSPEC_HIDDEN; + +HRESULT d3drm_device_set_ddraw_device_d3d(struct d3drm_device *device, IDirect3DRM *d3drm, IDirect3D *d3d, IDirect3DDevice *d3d_device) DECLSPEC_HIDDEN; + struct d3drm_file_header { WORD major; diff --git a/reactos/dll/directx/wine/d3drm/device.c b/reactos/dll/directx/wine/d3drm/device.c index 25676a9afef..692440b146e 100644 --- a/reactos/dll/directx/wine/d3drm/device.c +++ b/reactos/dll/directx/wine/d3drm/device.c @@ -24,9 +24,15 @@ struct d3drm_device { + IDirect3DRMDevice IDirect3DRMDevice_iface; IDirect3DRMDevice2 IDirect3DRMDevice2_iface; IDirect3DRMDevice3 IDirect3DRMDevice3_iface; IDirect3DRMWinDevice IDirect3DRMWinDevice_iface; + IDirect3DRM *d3drm; + IDirectDraw *ddraw; + IDirectDrawSurface *primary_surface, *render_target; + IDirectDrawClipper *clipper; + IDirect3DDevice *device; LONG ref; BOOL dither; D3DRMRENDERQUALITY quality; @@ -35,6 +41,11 @@ struct d3drm_device DWORD width; }; +static inline struct d3drm_device *impl_from_IDirect3DRMDevice(IDirect3DRMDevice *iface) +{ + return CONTAINING_RECORD(iface, struct d3drm_device, IDirect3DRMDevice_iface); +} + static inline struct d3drm_device *impl_from_IDirect3DRMDevice2(IDirect3DRMDevice2 *iface) { return CONTAINING_RECORD(iface, struct d3drm_device, IDirect3DRMDevice2_iface); @@ -45,71 +56,570 @@ static inline struct d3drm_device *impl_from_IDirect3DRMDevice3(IDirect3DRMDevic return CONTAINING_RECORD(iface, struct d3drm_device, IDirect3DRMDevice3_iface); } +IDirect3DRMDevice *IDirect3DRMDevice_from_impl(struct d3drm_device *device) +{ + return &device->IDirect3DRMDevice_iface; +} + +IDirect3DRMDevice2 *IDirect3DRMDevice2_from_impl(struct d3drm_device *device) +{ + return &device->IDirect3DRMDevice2_iface; +} + +IDirect3DRMDevice3 *IDirect3DRMDevice3_from_impl(struct d3drm_device *device) +{ + return &device->IDirect3DRMDevice3_iface; +} + +void d3drm_device_destroy(struct d3drm_device *device) +{ + if (device->device) + { + TRACE("Releasing attached ddraw interfaces.\n"); + IDirect3DDevice_Release(device->device); + } + if (device->render_target) + IDirectDrawSurface_Release(device->render_target); + if (device->primary_surface) + { + TRACE("Releasing primary surface and attached clipper.\n"); + IDirectDrawSurface_Release(device->primary_surface); + IDirectDrawClipper_Release(device->clipper); + } + if (device->ddraw) + { + IDirectDraw_Release(device->ddraw); + IDirect3DRM_Release(device->d3drm); + } + HeapFree(GetProcessHeap(), 0, device); +} + static inline struct d3drm_device *impl_from_IDirect3DRMWinDevice(IDirect3DRMWinDevice *iface) { return CONTAINING_RECORD(iface, struct d3drm_device, IDirect3DRMWinDevice_iface); } -static HRESULT WINAPI d3drm_device2_QueryInterface(IDirect3DRMDevice2 *iface, REFIID riid, void **out) +HRESULT d3drm_device_create_surfaces_from_clipper(struct d3drm_device *object, IDirectDraw *ddraw, IDirectDrawClipper *clipper, int width, int height, IDirectDrawSurface **surface) { - struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); + DDSURFACEDESC surface_desc; + IDirectDrawSurface *primary_surface, *render_target; + HWND window; + HRESULT hr; - TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + hr = IDirectDrawClipper_GetHWnd(clipper, &window); + if (FAILED(hr)) + return hr; - if (IsEqualGUID(riid, &IID_IDirect3DRMDevice2) - || IsEqualGUID(riid, &IID_IDirect3DRMDevice) - || IsEqualGUID(riid, &IID_IUnknown)) + hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); + 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)) { - *out = &device->IDirect3DRMDevice2_iface; + IDirectDrawSurface_Release(primary_surface); + return hr; } - else if (IsEqualGUID(riid, &IID_IDirect3DRMDevice3)) + + 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, &render_target, NULL); + if (FAILED(hr)) { - *out = &device->IDirect3DRMDevice3_iface; + IDirectDrawSurface_Release(primary_surface); + return hr; } - else if (IsEqualGUID(riid, &IID_IDirect3DRMWinDevice)) + + object->primary_surface = primary_surface; + object->clipper = clipper; + IDirectDrawClipper_AddRef(clipper); + *surface = render_target; + + return D3DRM_OK; +} + +HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirect3DRM *d3drm, IDirectDraw *ddraw, IDirectDrawSurface *surface, + BOOL create_z_surface) +{ + DDSCAPS caps = { DDSCAPS_ZBUFFER }; + IDirectDrawSurface *ds = NULL; + IDirect3DDevice *device1 = NULL; + IDirect3DDevice2 *device2 = NULL; + IDirect3D2 *d3d2 = NULL; + DDSURFACEDESC desc, surface_desc; + HRESULT hr; + + device->ddraw = ddraw; + IDirectDraw_AddRef(ddraw); + device->d3drm = d3drm; + IDirect3DRM_AddRef(d3drm); + device->render_target = surface; + IDirectDrawSurface_AddRef(surface); + + desc.dwSize = sizeof(desc); + hr = IDirectDrawSurface_GetSurfaceDesc(surface, &desc); + if (FAILED(hr)) + return hr; + + if (!(desc.ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) + return DDERR_INVALIDCAPS; + + hr = IDirectDrawSurface_GetAttachedSurface(surface, &caps, &ds); + if (SUCCEEDED(hr)) { - *out = &device->IDirect3DRMWinDevice_iface; + create_z_surface = FALSE; + IDirectDrawSurface_Release(ds); + ds = NULL; + } + + if (create_z_surface) + { + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_ZBUFFERBITDEPTH | DDSD_WIDTH | DDSD_HEIGHT; + surface_desc.ddsCaps.dwCaps = DDSCAPS_ZBUFFER; + surface_desc.u2.dwZBufferBitDepth = 16; + surface_desc.dwWidth = desc.dwWidth; + surface_desc.dwHeight = desc.dwHeight; + hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &ds, NULL); + if (FAILED(hr)) + return hr; + + hr = IDirectDrawSurface_AddAttachedSurface(surface, ds); + IDirectDrawSurface_Release(ds); + if (FAILED(hr)) + return hr; } + + if (version == 1) + hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirect3DRGBDevice, (void **)&device1); else { - *out = NULL; - WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); - return E_NOINTERFACE; + IDirectDraw_QueryInterface(ddraw, &IID_IDirect3D2, (void**)&d3d2); + hr = IDirect3D2_CreateDevice(d3d2, &IID_IDirect3DRGBDevice, surface, &device2); + IDirect3D2_Release(d3d2); + } + if (FAILED(hr)) + { + IDirectDrawSurface_DeleteAttachedSurface(surface, 0, ds); + return hr; } - IUnknown_AddRef((IUnknown *)*out); - return S_OK; + if (version != 1) + { + hr = IDirect3DDevice2_QueryInterface(device2, &IID_IDirect3DDevice, (void**)&device1); + IDirect3DDevice2_Release(device2); + if (FAILED(hr)) + { + IDirectDrawSurface_DeleteAttachedSurface(surface, 0, ds); + return hr; + } + } + device->device = device1; + + return hr; +} + +HRESULT d3drm_device_set_ddraw_device_d3d(struct d3drm_device *device, IDirect3DRM *d3drm, IDirect3D *d3d, IDirect3DDevice *d3d_device) +{ + device->d3drm = d3drm; + IDirect3DRM_AddRef(d3drm); + device->device = d3d_device; + IDirect3DDevice_AddRef(d3d_device); + + return IDirect3D_QueryInterface(d3d, &IID_IDirectDraw, (void **)&device->ddraw); +} + +static HRESULT WINAPI d3drm_device1_QueryInterface(IDirect3DRMDevice *iface, REFIID riid, void **out) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + + return IDirect3DRMDevice3_QueryInterface(&device->IDirect3DRMDevice3_iface, riid, out); +} + +static ULONG WINAPI d3drm_device1_AddRef(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_AddRef(&device->IDirect3DRMDevice3_iface); +} + +static ULONG WINAPI d3drm_device1_Release(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_Release(&device->IDirect3DRMDevice3_iface); +} + +static HRESULT WINAPI d3drm_device1_Clone(IDirect3DRMDevice *iface, + IUnknown *outer, REFIID iid, void **out) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, outer %p, iid %s, out %p.\n", iface, outer, debugstr_guid(iid), out); + + return IDirect3DRMDevice3_Clone(&device->IDirect3DRMDevice3_iface, outer, iid, out); +} + +static HRESULT WINAPI d3drm_device1_AddDestroyCallback(IDirect3DRMDevice *iface, + D3DRMOBJECTCALLBACK cb, void *ctx) +{ + FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_device1_DeleteDestroyCallback(IDirect3DRMDevice *iface, + D3DRMOBJECTCALLBACK cb, void *ctx) +{ + FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_device1_SetAppData(IDirect3DRMDevice *iface, DWORD data) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, data %#x.\n", iface, data); + + return IDirect3DRMDevice3_SetAppData(&device->IDirect3DRMDevice3_iface, data); +} + +static DWORD WINAPI d3drm_device1_GetAppData(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetAppData(&device->IDirect3DRMDevice3_iface); +} + +static HRESULT WINAPI d3drm_device1_SetName(IDirect3DRMDevice *iface, const char *name) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, name %s.\n", iface, debugstr_a(name)); + + return IDirect3DRMDevice3_SetName(&device->IDirect3DRMDevice3_iface, name); +} + +static HRESULT WINAPI d3drm_device1_GetName(IDirect3DRMDevice *iface, DWORD *size, char *name) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, size %p, name %p.\n", iface, size, name); + + return IDirect3DRMDevice3_GetName(&device->IDirect3DRMDevice3_iface, size, name); +} + +static HRESULT WINAPI d3drm_device1_GetClassName(IDirect3DRMDevice *iface, DWORD *size, char *name) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, size %p, name %p.\n", iface, size, name); + + return IDirect3DRMDevice3_GetClassName(&device->IDirect3DRMDevice3_iface, size, name); +} + +static HRESULT WINAPI d3drm_device1_Init(IDirect3DRMDevice *iface, ULONG width, ULONG height) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, width %u, height %u.\n", iface, width, height); + + return IDirect3DRMDevice3_Init(&device->IDirect3DRMDevice3_iface, width, height); +} + +static HRESULT WINAPI d3drm_device1_InitFromD3D(IDirect3DRMDevice *iface, + IDirect3D *d3d, IDirect3DDevice *d3d_device) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, d3d %p, d3d_device %p.\n", iface, d3d, d3d_device); + + return IDirect3DRMDevice3_InitFromD3D(&device->IDirect3DRMDevice3_iface, d3d, d3d_device); +} + +static HRESULT WINAPI d3drm_device1_InitFromClipper(IDirect3DRMDevice *iface, + IDirectDrawClipper *clipper, GUID *guid, int width, int height) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, clipper %p, guid %s, width %d, height %d.\n", + iface, clipper, debugstr_guid(guid), width, height); + + return IDirect3DRMDevice3_InitFromClipper(&device->IDirect3DRMDevice3_iface, + clipper, guid, width, height); +} + +static HRESULT WINAPI d3drm_device1_Update(IDirect3DRMDevice *iface) +{ + FIXME("iface %p stub!\n", iface); + + return D3DRM_OK; +} + +static HRESULT WINAPI d3drm_device1_AddUpdateCallback(IDirect3DRMDevice *iface, + D3DRMUPDATECALLBACK cb, void *ctx) +{ + FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_device1_DeleteUpdateCallback(IDirect3DRMDevice *iface, + D3DRMUPDATECALLBACK cb, void *ctx) +{ + FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_device1_SetBufferCount(IDirect3DRMDevice *iface, DWORD count) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, count %u.\n", iface, count); + + return IDirect3DRMDevice3_SetBufferCount(&device->IDirect3DRMDevice3_iface, count); +} + +static DWORD WINAPI d3drm_device1_GetBufferCount(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetBufferCount(&device->IDirect3DRMDevice3_iface); +} + +static HRESULT WINAPI d3drm_device1_SetDither(IDirect3DRMDevice *iface, BOOL enable) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, enabled %#x.\n", iface, enable); + + return IDirect3DRMDevice3_SetDither(&device->IDirect3DRMDevice3_iface, enable); +} + +static HRESULT WINAPI d3drm_device1_SetShades(IDirect3DRMDevice *iface, DWORD count) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, count %u.\n", iface, count); + + return IDirect3DRMDevice3_SetShades(&device->IDirect3DRMDevice3_iface, count); +} + +static HRESULT WINAPI d3drm_device1_SetQuality(IDirect3DRMDevice *iface, D3DRMRENDERQUALITY quality) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, quality %u.\n", iface, quality); + + return IDirect3DRMDevice3_SetQuality(&device->IDirect3DRMDevice3_iface, quality); +} + +static HRESULT WINAPI d3drm_device1_SetTextureQuality(IDirect3DRMDevice *iface, D3DRMTEXTUREQUALITY quality) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, quality %u.\n", iface, quality); + + return IDirect3DRMDevice3_SetTextureQuality(&device->IDirect3DRMDevice3_iface, quality); +} + +static HRESULT WINAPI d3drm_device1_GetViewports(IDirect3DRMDevice *iface, IDirect3DRMViewportArray **array) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, array %p.\n", iface, array); + + return IDirect3DRMDevice3_GetViewports(&device->IDirect3DRMDevice3_iface, array); +} + +static BOOL WINAPI d3drm_device1_GetDither(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetDither(&device->IDirect3DRMDevice3_iface); +} + +static DWORD WINAPI d3drm_device1_GetShades(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetShades(&device->IDirect3DRMDevice3_iface); +} + +static DWORD WINAPI d3drm_device1_GetHeight(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetHeight(&device->IDirect3DRMDevice3_iface); +} + +static DWORD WINAPI d3drm_device1_GetWidth(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetWidth(&device->IDirect3DRMDevice3_iface); +} + +static DWORD WINAPI d3drm_device1_GetTrianglesDrawn(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetTrianglesDrawn(&device->IDirect3DRMDevice3_iface); +} + +static DWORD WINAPI d3drm_device1_GetWireframeOptions(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetWireframeOptions(&device->IDirect3DRMDevice3_iface); +} + +static D3DRMRENDERQUALITY WINAPI d3drm_device1_GetQuality(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetQuality(&device->IDirect3DRMDevice3_iface); +} + +static D3DCOLORMODEL WINAPI d3drm_device1_GetColorModel(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p stub!\n", iface); + + return IDirect3DRMDevice3_GetColorModel(&device->IDirect3DRMDevice3_iface); +} + +static D3DRMTEXTUREQUALITY WINAPI d3drm_device1_GetTextureQuality(IDirect3DRMDevice *iface) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetTextureQuality(&device->IDirect3DRMDevice3_iface); +} + +static HRESULT WINAPI d3drm_device1_GetDirect3DDevice(IDirect3DRMDevice *iface, IDirect3DDevice **d3d_device) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface); + + TRACE("iface %p, d3d_device %p.\n", iface, d3d_device); + + return IDirect3DRMDevice3_GetDirect3DDevice(&device->IDirect3DRMDevice3_iface, d3d_device); +} + +static const struct IDirect3DRMDeviceVtbl d3drm_device1_vtbl = +{ + d3drm_device1_QueryInterface, + d3drm_device1_AddRef, + d3drm_device1_Release, + d3drm_device1_Clone, + d3drm_device1_AddDestroyCallback, + d3drm_device1_DeleteDestroyCallback, + d3drm_device1_SetAppData, + d3drm_device1_GetAppData, + d3drm_device1_SetName, + d3drm_device1_GetName, + d3drm_device1_GetClassName, + d3drm_device1_Init, + d3drm_device1_InitFromD3D, + d3drm_device1_InitFromClipper, + d3drm_device1_Update, + d3drm_device1_AddUpdateCallback, + d3drm_device1_DeleteUpdateCallback, + d3drm_device1_SetBufferCount, + d3drm_device1_GetBufferCount, + d3drm_device1_SetDither, + d3drm_device1_SetShades, + d3drm_device1_SetQuality, + d3drm_device1_SetTextureQuality, + d3drm_device1_GetViewports, + d3drm_device1_GetDither, + d3drm_device1_GetShades, + d3drm_device1_GetHeight, + d3drm_device1_GetWidth, + d3drm_device1_GetTrianglesDrawn, + d3drm_device1_GetWireframeOptions, + d3drm_device1_GetQuality, + d3drm_device1_GetColorModel, + d3drm_device1_GetTextureQuality, + d3drm_device1_GetDirect3DDevice, +}; + +static HRESULT WINAPI d3drm_device2_QueryInterface(IDirect3DRMDevice2 *iface, REFIID riid, void **out) +{ + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); + + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + + return IDirect3DRMDevice3_QueryInterface(&device->IDirect3DRMDevice3_iface, riid, out); } static ULONG WINAPI d3drm_device2_AddRef(IDirect3DRMDevice2 *iface) { struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - ULONG refcount = InterlockedIncrement(&device->ref); - TRACE("%p increasing refcount to %u.\n", iface, refcount); + TRACE("iface %p.\n", iface); - return refcount; + return IDirect3DRMDevice3_AddRef(&device->IDirect3DRMDevice3_iface); } static ULONG WINAPI d3drm_device2_Release(IDirect3DRMDevice2 *iface) { struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - ULONG refcount = InterlockedDecrement(&device->ref); - TRACE("%p decreasing refcount to %u.\n", iface, refcount); - - if (!refcount) - HeapFree(GetProcessHeap(), 0, device); + TRACE("iface %p.\n", iface); - return refcount; + return IDirect3DRMDevice3_Release(&device->IDirect3DRMDevice3_iface); } static HRESULT WINAPI d3drm_device2_Clone(IDirect3DRMDevice2 *iface, IUnknown *outer, REFIID iid, void **out) { - FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, outer %p, iid %s, out %p\n", iface, outer, debugstr_guid(iid), out); + + return IDirect3DRMDevice3_Clone(&device->IDirect3DRMDevice3_iface, outer, iid, out); } static HRESULT WINAPI d3drm_device2_AddDestroyCallback(IDirect3DRMDevice2 *iface, @@ -130,30 +640,38 @@ static HRESULT WINAPI d3drm_device2_DeleteDestroyCallback(IDirect3DRMDevice2 *if static HRESULT WINAPI d3drm_device2_SetAppData(IDirect3DRMDevice2 *iface, DWORD data) { - FIXME("iface %p, data %#x stub!\n", iface, data); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, data %#x.\n", iface, data); + + return IDirect3DRMDevice3_SetAppData(&device->IDirect3DRMDevice3_iface, data); } static DWORD WINAPI d3drm_device2_GetAppData(IDirect3DRMDevice2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return 0; + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetAppData(&device->IDirect3DRMDevice3_iface); } static HRESULT WINAPI d3drm_device2_SetName(IDirect3DRMDevice2 *iface, const char *name) { - FIXME("iface %p, name %s stub!\n", iface, debugstr_a(name)); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, name %s.\n", iface, debugstr_a(name)); + + return IDirect3DRMDevice3_SetName(&device->IDirect3DRMDevice3_iface, name); } static HRESULT WINAPI d3drm_device2_GetName(IDirect3DRMDevice2 *iface, DWORD *size, char *name) { - FIXME("iface %p, size %p, name %p stub!\n", iface, size, name); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, size %p, name %p.\n", iface, size, name); + + return IDirect3DRMDevice3_GetName(&device->IDirect3DRMDevice3_iface, size, name); } static HRESULT WINAPI d3drm_device2_GetClassName(IDirect3DRMDevice2 *iface, DWORD *size, char *name) @@ -177,9 +695,11 @@ static HRESULT WINAPI d3drm_device2_Init(IDirect3DRMDevice2 *iface, ULONG width, static HRESULT WINAPI d3drm_device2_InitFromD3D(IDirect3DRMDevice2 *iface, IDirect3D *d3d, IDirect3DDevice *d3d_device) { - FIXME("iface %p, d3d %p, d3d_device %p stub!\n", iface, d3d, d3d_device); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, d3d %p, d3d_device %p.\n", iface, d3d, d3d_device); + + return IDirect3DRMDevice3_InitFromD3D(&device->IDirect3DRMDevice3_iface, d3d, d3d_device); } static HRESULT WINAPI d3drm_device2_InitFromClipper(IDirect3DRMDevice2 *iface, @@ -219,16 +739,20 @@ static HRESULT WINAPI d3drm_device2_DeleteUpdateCallback(IDirect3DRMDevice2 *ifa static HRESULT WINAPI d3drm_device2_SetBufferCount(IDirect3DRMDevice2 *iface, DWORD count) { - FIXME("iface %p, count %u.\n", iface, count); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, count %u.\n", iface, count); + + return IDirect3DRMDevice3_SetBufferCount(&device->IDirect3DRMDevice3_iface, count); } static DWORD WINAPI d3drm_device2_GetBufferCount(IDirect3DRMDevice2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetBufferCount(&device->IDirect3DRMDevice3_iface); } static HRESULT WINAPI d3drm_device2_SetDither(IDirect3DRMDevice2 *iface, BOOL enable) @@ -242,9 +766,11 @@ static HRESULT WINAPI d3drm_device2_SetDither(IDirect3DRMDevice2 *iface, BOOL en static HRESULT WINAPI d3drm_device2_SetShades(IDirect3DRMDevice2 *iface, DWORD count) { - FIXME("iface %p, count %u stub!\n", iface, count); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, count %u.\n", iface, count); + + return IDirect3DRMDevice3_SetShades(&device->IDirect3DRMDevice3_iface, count); } static HRESULT WINAPI d3drm_device2_SetQuality(IDirect3DRMDevice2 *iface, D3DRMRENDERQUALITY quality) @@ -258,16 +784,20 @@ static HRESULT WINAPI d3drm_device2_SetQuality(IDirect3DRMDevice2 *iface, D3DRMR static HRESULT WINAPI d3drm_device2_SetTextureQuality(IDirect3DRMDevice2 *iface, D3DRMTEXTUREQUALITY quality) { - FIXME("iface %p, quality %u stub!\n", iface, quality); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, quality %u.\n", iface, quality); + + return IDirect3DRMDevice3_SetTextureQuality(&device->IDirect3DRMDevice3_iface, quality); } static HRESULT WINAPI d3drm_device2_GetViewports(IDirect3DRMDevice2 *iface, IDirect3DRMViewportArray **array) { - FIXME("iface %p, array %p stub!\n", iface, array); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, array %p.\n", iface, array); + + return IDirect3DRMDevice3_GetViewports(&device->IDirect3DRMDevice3_iface, array); } static BOOL WINAPI d3drm_device2_GetDither(IDirect3DRMDevice2 *iface) @@ -281,9 +811,11 @@ static BOOL WINAPI d3drm_device2_GetDither(IDirect3DRMDevice2 *iface) static DWORD WINAPI d3drm_device2_GetShades(IDirect3DRMDevice2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetShades(&device->IDirect3DRMDevice3_iface); } static DWORD WINAPI d3drm_device2_GetHeight(IDirect3DRMDevice2 *iface) @@ -306,16 +838,20 @@ static DWORD WINAPI d3drm_device2_GetWidth(IDirect3DRMDevice2 *iface) static DWORD WINAPI d3drm_device2_GetTrianglesDrawn(IDirect3DRMDevice2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetTrianglesDrawn(&device->IDirect3DRMDevice3_iface); } static DWORD WINAPI d3drm_device2_GetWireframeOptions(IDirect3DRMDevice2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetWireframeOptions(&device->IDirect3DRMDevice3_iface); } static D3DRMRENDERQUALITY WINAPI d3drm_device2_GetQuality(IDirect3DRMDevice2 *iface) @@ -329,40 +865,50 @@ static D3DRMRENDERQUALITY WINAPI d3drm_device2_GetQuality(IDirect3DRMDevice2 *if static D3DCOLORMODEL WINAPI d3drm_device2_GetColorModel(IDirect3DRMDevice2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetColorModel(&device->IDirect3DRMDevice3_iface); } static D3DRMTEXTUREQUALITY WINAPI d3drm_device2_GetTextureQuality(IDirect3DRMDevice2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetTextureQuality(&device->IDirect3DRMDevice3_iface); } static HRESULT WINAPI d3drm_device2_GetDirect3DDevice(IDirect3DRMDevice2 *iface, IDirect3DDevice **d3d_device) { - FIXME("iface %p, d3d_device %p stub!\n", iface, d3d_device); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, d3d_device %p.\n", iface, d3d_device); + + return IDirect3DRMDevice3_GetDirect3DDevice(&device->IDirect3DRMDevice3_iface, d3d_device); } static HRESULT WINAPI d3drm_device2_InitFromD3D2(IDirect3DRMDevice2 *iface, IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device) { - FIXME("iface %p, d3d %p, d3d_device %p stub!\n", iface, d3d, d3d_device); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, d3d %p, d3d_device %p.\n", iface, d3d, d3d_device); + + return IDirect3DRMDevice3_InitFromD3D2(&device->IDirect3DRMDevice3_iface, d3d, d3d_device); } static HRESULT WINAPI d3drm_device2_InitFromSurface(IDirect3DRMDevice2 *iface, GUID *guid, IDirectDraw *ddraw, IDirectDrawSurface *backbuffer) { - FIXME("iface %p, guid %s, ddraw %p, backbuffer %p stub!\n", + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); + + TRACE("iface %p, guid %s, ddraw %p, backbuffer %p.\n", iface, debugstr_guid(guid), ddraw, backbuffer); - return E_NOTIMPL; + return IDirect3DRMDevice3_InitFromSurface(&device->IDirect3DRMDevice3_iface, guid, ddraw, backbuffer); } static HRESULT WINAPI d3drm_device2_SetRenderMode(IDirect3DRMDevice2 *iface, DWORD flags) @@ -385,9 +931,11 @@ static DWORD WINAPI d3drm_device2_GetRenderMode(IDirect3DRMDevice2 *iface) static HRESULT WINAPI d3drm_device2_GetDirect3DDevice2(IDirect3DRMDevice2 *iface, IDirect3DDevice2 **d3d_device) { - FIXME("iface %p, d3d_device %p stub!\n", iface, d3d_device); + struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface); - return E_NOTIMPL; + TRACE("iface %p, d3d_device %p.\n", iface, d3d_device); + + return IDirect3DRMDevice3_GetDirect3DDevice2(&device->IDirect3DRMDevice3_iface, d3d_device); } static const struct IDirect3DRMDevice2Vtbl d3drm_device2_vtbl = @@ -437,21 +985,58 @@ static HRESULT WINAPI d3drm_device3_QueryInterface(IDirect3DRMDevice3 *iface, RE { struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface); - return d3drm_device2_QueryInterface(&device->IDirect3DRMDevice2_iface, riid, out); + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + + if (IsEqualGUID(riid, &IID_IDirect3DRMDevice3) + || IsEqualGUID(riid, &IID_IDirect3DRMObject) + || IsEqualGUID(riid, &IID_IUnknown)) + { + *out = &device->IDirect3DRMDevice3_iface; + } + else if (IsEqualGUID(riid, &IID_IDirect3DRMDevice2)) + { + *out = &device->IDirect3DRMDevice2_iface; + } + else if (IsEqualGUID(riid, &IID_IDirect3DRMDevice)) + { + *out = &device->IDirect3DRMDevice_iface; + } + else if (IsEqualGUID(riid, &IID_IDirect3DRMWinDevice)) + { + *out = &device->IDirect3DRMWinDevice_iface; + } + else + { + *out = NULL; + WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid)); + return CLASS_E_CLASSNOTAVAILABLE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; } static ULONG WINAPI d3drm_device3_AddRef(IDirect3DRMDevice3 *iface) { struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface); + ULONG refcount = InterlockedIncrement(&device->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); - return d3drm_device2_AddRef(&device->IDirect3DRMDevice2_iface); + return refcount; } static ULONG WINAPI d3drm_device3_Release(IDirect3DRMDevice3 *iface) { struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface); + ULONG refcount = InterlockedDecrement(&device->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + d3drm_device_destroy(device); - return d3drm_device2_Release(&device->IDirect3DRMDevice2_iface); + return refcount; } static HRESULT WINAPI d3drm_device3_Clone(IDirect3DRMDevice3 *iface, @@ -706,9 +1291,13 @@ static D3DRMTEXTUREQUALITY WINAPI d3drm_device3_GetTextureQuality(IDirect3DRMDev static HRESULT WINAPI d3drm_device3_GetDirect3DDevice(IDirect3DRMDevice3 *iface, IDirect3DDevice **d3d_device) { - FIXME("iface %p, d3d_device %p stub!\n", iface, d3d_device); + struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface); + TRACE("iface %p, d3d_device %p!\n", iface, d3d_device); - return E_NOTIMPL; + *d3d_device = device->device; + IDirect3DDevice_AddRef(*d3d_device); + + return D3DRM_OK; } static HRESULT WINAPI d3drm_device3_InitFromD3D2(IDirect3DRMDevice3 *iface, @@ -750,9 +1339,13 @@ static DWORD WINAPI d3drm_device3_GetRenderMode(IDirect3DRMDevice3 *iface) static HRESULT WINAPI d3drm_device3_GetDirect3DDevice2(IDirect3DRMDevice3 *iface, IDirect3DDevice2 **d3d_device) { - FIXME("iface %p, d3d_device %p stub!\n", iface, d3d_device); + struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface); - return E_NOTIMPL; + TRACE("iface %p, d3d_device %p.\n", iface, d3d_device); + + IDirect3DDevice_QueryInterface(device->device, &IID_IDirect3DDevice2, (void**)d3d_device); + + return D3DRM_OK; } static HRESULT WINAPI d3drm_device3_FindPreferredTextureFormat(IDirect3DRMDevice3 *iface, @@ -849,29 +1442,37 @@ static HRESULT WINAPI d3drm_device_win_QueryInterface(IDirect3DRMWinDevice *ifac { struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface); - return d3drm_device2_QueryInterface(&device->IDirect3DRMDevice2_iface, riid, out); + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + + return d3drm_device3_QueryInterface(&device->IDirect3DRMDevice3_iface, riid, out); } static ULONG WINAPI d3drm_device_win_AddRef(IDirect3DRMWinDevice *iface) { struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface); - return d3drm_device2_AddRef(&device->IDirect3DRMDevice2_iface); + TRACE("iface %p.\n", iface); + + return d3drm_device3_AddRef(&device->IDirect3DRMDevice3_iface); } static ULONG WINAPI d3drm_device_win_Release(IDirect3DRMWinDevice *iface) { struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface); - return d3drm_device2_Release(&device->IDirect3DRMDevice2_iface); + TRACE("iface %p.\n", iface); + + return d3drm_device3_Release(&device->IDirect3DRMDevice3_iface); } static HRESULT WINAPI d3drm_device_win_Clone(IDirect3DRMWinDevice *iface, IUnknown *outer, REFIID iid, void **out) { - FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out); + struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface); - return E_NOTIMPL; + TRACE("iface %p, outer %p, iid %s, out %p\n", iface, outer, debugstr_guid(iid), out); + + return IDirect3DRMDevice3_Clone(&device->IDirect3DRMDevice3_iface, outer, iid, out); } static HRESULT WINAPI d3drm_device_win_AddDestroyCallback(IDirect3DRMWinDevice *iface, @@ -892,30 +1493,38 @@ static HRESULT WINAPI d3drm_device_win_DeleteDestroyCallback(IDirect3DRMWinDevic static HRESULT WINAPI d3drm_device_win_SetAppData(IDirect3DRMWinDevice *iface, DWORD data) { - FIXME("iface %p, data %#x stub!\n", iface, data); + struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface); - return E_NOTIMPL; + TRACE("iface %p, data %#x.\n", iface, data); + + return IDirect3DRMDevice3_SetAppData(&device->IDirect3DRMDevice3_iface, data); } static DWORD WINAPI d3drm_device_win_GetAppData(IDirect3DRMWinDevice *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface); - return 0; + TRACE("iface %p.\n", iface); + + return IDirect3DRMDevice3_GetAppData(&device->IDirect3DRMDevice3_iface); } static HRESULT WINAPI d3drm_device_win_SetName(IDirect3DRMWinDevice *iface, const char *name) { - FIXME("iface %p, name %s stub!\n", iface, debugstr_a(name)); + struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface); - return E_NOTIMPL; + TRACE("iface %p, name %s.\n", iface, debugstr_a(name)); + + return IDirect3DRMDevice3_SetName(&device->IDirect3DRMDevice3_iface, name); } static HRESULT WINAPI d3drm_device_win_GetName(IDirect3DRMWinDevice *iface, DWORD *size, char *name) { - FIXME("iface %p, size %p, name %p stub!\n", iface, size, name); + struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface); - return E_NOTIMPL; + TRACE("iface %p, size %p, name %p stub!\n", iface, size, name); + + return IDirect3DRMDevice3_GetName(&device->IDirect3DRMDevice3_iface, size, name); } static HRESULT WINAPI d3drm_device_win_GetClassName(IDirect3DRMWinDevice *iface, DWORD *size, char *name) @@ -958,24 +1567,22 @@ static const struct IDirect3DRMWinDeviceVtbl d3drm_device_win_vtbl = d3drm_device_win_HandleActivate, }; -HRESULT Direct3DRMDevice_create(REFIID riid, IUnknown **out) +HRESULT d3drm_device_create(struct d3drm_device **out) { struct d3drm_device *object; - TRACE("riid %s, out %p.\n", debugstr_guid(riid), out); + TRACE("out %p.\n", out); if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return E_OUTOFMEMORY; + object->IDirect3DRMDevice_iface.lpVtbl = &d3drm_device1_vtbl; object->IDirect3DRMDevice2_iface.lpVtbl = &d3drm_device2_vtbl; object->IDirect3DRMDevice3_iface.lpVtbl = &d3drm_device3_vtbl; object->IDirect3DRMWinDevice_iface.lpVtbl = &d3drm_device_win_vtbl; object->ref = 1; - if (IsEqualGUID(riid, &IID_IDirect3DRMDevice3)) - *out = (IUnknown*)&object->IDirect3DRMDevice3_iface; - else - *out = (IUnknown*)&object->IDirect3DRMDevice2_iface; + *out = object; - return S_OK; + return D3DRM_OK; } diff --git a/reactos/dll/directx/wine/d3drm/frame.c b/reactos/dll/directx/wine/d3drm/frame.c index c5622e9d44b..bff49abac01 100644 --- a/reactos/dll/directx/wine/d3drm/frame.c +++ b/reactos/dll/directx/wine/d3drm/frame.c @@ -1065,7 +1065,7 @@ static BOOL WINAPI d3drm_frame2_GetBoxEnable(IDirect3DRMFrame2 *iface) { FIXME("iface %p stub!\n", iface); - return E_NOTIMPL; + return FALSE; } static HRESULT WINAPI d3drm_frame2_GetAxes(IDirect3DRMFrame2 *iface, D3DVECTOR *dir, D3DVECTOR *up) @@ -1086,7 +1086,7 @@ static BOOL WINAPI d3drm_frame2_GetInheritAxes(IDirect3DRMFrame2 *iface) { FIXME("iface %p stub!\n", iface); - return E_NOTIMPL; + return FALSE; } static HRESULT WINAPI d3drm_frame2_GetHierarchyBox(IDirect3DRMFrame2 *iface, D3DRMBOX *box) @@ -2006,7 +2006,7 @@ static BOOL WINAPI d3drm_frame3_GetBoxEnable(IDirect3DRMFrame3 *iface) { FIXME("iface %p stub!\n", iface); - return E_NOTIMPL; + return FALSE; } static HRESULT WINAPI d3drm_frame3_GetAxes(IDirect3DRMFrame3 *iface, D3DVECTOR *dir, D3DVECTOR *up) @@ -2027,7 +2027,7 @@ static BOOL WINAPI d3drm_frame3_GetInheritAxes(IDirect3DRMFrame3 *iface) { FIXME("iface %p stub!\n", iface); - return E_NOTIMPL; + return FALSE; } static HRESULT WINAPI d3drm_frame3_GetHierarchyBox(IDirect3DRMFrame3 *iface, D3DRMBOX *box) diff --git a/reactos/dll/directx/wine/d3drm/texture.c b/reactos/dll/directx/wine/d3drm/texture.c index fb580a1fcf9..7ba596e9aac 100644 --- a/reactos/dll/directx/wine/d3drm/texture.c +++ b/reactos/dll/directx/wine/d3drm/texture.c @@ -22,12 +22,18 @@ struct d3drm_texture { + IDirect3DRMTexture IDirect3DRMTexture_iface; IDirect3DRMTexture2 IDirect3DRMTexture2_iface; IDirect3DRMTexture3 IDirect3DRMTexture3_iface; LONG ref; DWORD app_data; }; +static inline struct d3drm_texture *impl_from_IDirect3DRMTexture(IDirect3DRMTexture *iface) +{ + return CONTAINING_RECORD(iface, struct d3drm_texture, IDirect3DRMTexture_iface); +} + static inline struct d3drm_texture *impl_from_IDirect3DRMTexture2(IDirect3DRMTexture2 *iface) { return CONTAINING_RECORD(iface, struct d3drm_texture, IDirect3DRMTexture2_iface); @@ -38,62 +44,337 @@ static inline struct d3drm_texture *impl_from_IDirect3DRMTexture3(IDirect3DRMTex return CONTAINING_RECORD(iface, struct d3drm_texture, IDirect3DRMTexture3_iface); } +static HRESULT WINAPI d3drm_texture1_QueryInterface(IDirect3DRMTexture *iface, REFIID riid, void **out) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + + return IDirect3DRMTexture3_QueryInterface(&texture->IDirect3DRMTexture3_iface, riid, out); +} + +static ULONG WINAPI d3drm_texture1_AddRef(IDirect3DRMTexture *iface) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_AddRef(&texture->IDirect3DRMTexture3_iface); +} + +static ULONG WINAPI d3drm_texture1_Release(IDirect3DRMTexture *iface) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_Release(&texture->IDirect3DRMTexture3_iface); +} + +static HRESULT WINAPI d3drm_texture1_Clone(IDirect3DRMTexture *iface, + IUnknown *outer, REFIID iid, void **out) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, outer %p, iid %s, out %p.\n", iface, outer, debugstr_guid(iid), out); + + return IDirect3DRMTexture3_Clone(&texture->IDirect3DRMTexture3_iface, outer, iid, out); +} + +static HRESULT WINAPI d3drm_texture1_AddDestroyCallback(IDirect3DRMTexture *iface, + D3DRMOBJECTCALLBACK cb, void *ctx) +{ + FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_texture1_DeleteDestroyCallback(IDirect3DRMTexture *iface, + D3DRMOBJECTCALLBACK cb, void *ctx) +{ + FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_texture1_SetAppData(IDirect3DRMTexture *iface, DWORD data) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, data %#x.\n", iface, data); + + return IDirect3DRMTexture3_SetAppData(&texture->IDirect3DRMTexture3_iface, data); +} + +static DWORD WINAPI d3drm_texture1_GetAppData(IDirect3DRMTexture *iface) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetAppData(&texture->IDirect3DRMTexture3_iface); +} + +static HRESULT WINAPI d3drm_texture1_SetName(IDirect3DRMTexture *iface, const char *name) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, name %s.\n", iface, debugstr_a(name)); + + return IDirect3DRMTexture3_SetName(&texture->IDirect3DRMTexture3_iface, name); +} + +static HRESULT WINAPI d3drm_texture1_GetName(IDirect3DRMTexture *iface, DWORD *size, char *name) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, size %p, name %p.\n", iface, size, name); + + return IDirect3DRMTexture3_GetName(&texture->IDirect3DRMTexture3_iface, size, name); +} + +static HRESULT WINAPI d3drm_texture1_GetClassName(IDirect3DRMTexture *iface, DWORD *size, char *name) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, size %p, name %p.\n", iface, size, name); + + return IDirect3DRMTexture3_GetClassName(&texture->IDirect3DRMTexture3_iface, size, name); +} + +static HRESULT WINAPI d3drm_texture1_InitFromFile(IDirect3DRMTexture *iface, const char *filename) +{ + FIXME("iface %p, filename %s stub!\n", iface, debugstr_a(filename)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_texture1_InitFromSurface(IDirect3DRMTexture *iface, + IDirectDrawSurface *surface) +{ + FIXME("iface %p, surface %p stub!\n", iface, surface); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_texture1_InitFromResource(IDirect3DRMTexture *iface, HRSRC resource) +{ + FIXME("iface %p, resource %p stub!\n", iface, resource); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_texture1_Changed(IDirect3DRMTexture *iface, BOOL pixels, BOOL palette) +{ + FIXME("iface %p, pixels %#x, palette %#x stub!\n", iface, pixels, palette); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_texture1_SetColors(IDirect3DRMTexture *iface, DWORD max_colors) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, max_colors %u.\n", iface, max_colors); + + return IDirect3DRMTexture3_SetColors(&texture->IDirect3DRMTexture3_iface, max_colors); +} + +static HRESULT WINAPI d3drm_texture1_SetShades(IDirect3DRMTexture *iface, DWORD max_shades) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, max_shades %u.\n", iface, max_shades); + + return IDirect3DRMTexture3_SetShades(&texture->IDirect3DRMTexture3_iface, max_shades); +} + +static HRESULT WINAPI d3drm_texture1_SetDecalSize(IDirect3DRMTexture *iface, D3DVALUE width, D3DVALUE height) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, width %.8e, height %.8e stub!\n", iface, width, height); + + return IDirect3DRMTexture3_SetDecalSize(&texture->IDirect3DRMTexture3_iface, width, height); +} + +static HRESULT WINAPI d3drm_texture1_SetDecalOrigin(IDirect3DRMTexture *iface, LONG x, LONG y) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, x %d, y %d.\n", iface, x, y); + + return IDirect3DRMTexture3_SetDecalOrigin(&texture->IDirect3DRMTexture3_iface, x, y); +} + +static HRESULT WINAPI d3drm_texture1_SetDecalScale(IDirect3DRMTexture *iface, DWORD scale) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, scale %u.\n", iface, scale); + + return IDirect3DRMTexture3_SetDecalScale(&texture->IDirect3DRMTexture3_iface, scale); +} + +static HRESULT WINAPI d3drm_texture1_SetDecalTransparency(IDirect3DRMTexture *iface, BOOL transparency) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, transparency %#x.\n", iface, transparency); + + return IDirect3DRMTexture3_SetDecalTransparency(&texture->IDirect3DRMTexture3_iface, transparency); +} + +static HRESULT WINAPI d3drm_texture1_SetDecalTransparentColor(IDirect3DRMTexture *iface, D3DCOLOR color) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, color 0x%08x.\n", iface, color); + + return IDirect3DRMTexture3_SetDecalTransparentColor(&texture->IDirect3DRMTexture3_iface, color); +} + +static HRESULT WINAPI d3drm_texture1_GetDecalSize(IDirect3DRMTexture *iface, D3DVALUE *width, D3DVALUE *height) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, width %p, height %p.\n", iface, width, height); + + return IDirect3DRMTexture3_GetDecalSize(&texture->IDirect3DRMTexture3_iface, width, height); +} + +static HRESULT WINAPI d3drm_texture1_GetDecalOrigin(IDirect3DRMTexture *iface, LONG *x, LONG *y) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p, x %p, y %p.\n", iface, x, y); + + return IDirect3DRMTexture3_GetDecalOrigin(&texture->IDirect3DRMTexture3_iface, x, y); +} + +static D3DRMIMAGE * WINAPI d3drm_texture1_GetImage(IDirect3DRMTexture *iface) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetImage(&texture->IDirect3DRMTexture3_iface); +} + +static DWORD WINAPI d3drm_texture1_GetShades(IDirect3DRMTexture *iface) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetShades(&texture->IDirect3DRMTexture3_iface); +} + +static DWORD WINAPI d3drm_texture1_GetColors(IDirect3DRMTexture *iface) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetColors(&texture->IDirect3DRMTexture3_iface); +} + +static DWORD WINAPI d3drm_texture1_GetDecalScale(IDirect3DRMTexture *iface) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetDecalScale(&texture->IDirect3DRMTexture3_iface); +} + +static BOOL WINAPI d3drm_texture1_GetDecalTransparency(IDirect3DRMTexture *iface) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetDecalTransparency(&texture->IDirect3DRMTexture3_iface); +} + +static D3DCOLOR WINAPI d3drm_texture1_GetDecalTransparentColor(IDirect3DRMTexture *iface) +{ + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface); + + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetDecalTransparentColor(&texture->IDirect3DRMTexture3_iface); +} + +static const struct IDirect3DRMTextureVtbl d3drm_texture1_vtbl = +{ + d3drm_texture1_QueryInterface, + d3drm_texture1_AddRef, + d3drm_texture1_Release, + d3drm_texture1_Clone, + d3drm_texture1_AddDestroyCallback, + d3drm_texture1_DeleteDestroyCallback, + d3drm_texture1_SetAppData, + d3drm_texture1_GetAppData, + d3drm_texture1_SetName, + d3drm_texture1_GetName, + d3drm_texture1_GetClassName, + d3drm_texture1_InitFromFile, + d3drm_texture1_InitFromSurface, + d3drm_texture1_InitFromResource, + d3drm_texture1_Changed, + d3drm_texture1_SetColors, + d3drm_texture1_SetShades, + d3drm_texture1_SetDecalSize, + d3drm_texture1_SetDecalOrigin, + d3drm_texture1_SetDecalScale, + d3drm_texture1_SetDecalTransparency, + d3drm_texture1_SetDecalTransparentColor, + d3drm_texture1_GetDecalSize, + d3drm_texture1_GetDecalOrigin, + d3drm_texture1_GetImage, + d3drm_texture1_GetShades, + d3drm_texture1_GetColors, + d3drm_texture1_GetDecalScale, + d3drm_texture1_GetDecalTransparency, + d3drm_texture1_GetDecalTransparentColor, +}; + static HRESULT WINAPI d3drm_texture2_QueryInterface(IDirect3DRMTexture2 *iface, REFIID riid, void **out) { struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); - if (IsEqualGUID(riid, &IID_IDirect3DRMTexture2) - || IsEqualGUID(riid, &IID_IDirect3DRMTexture) - || IsEqualGUID(riid, &IID_IUnknown)) - { - *out = &texture->IDirect3DRMTexture2_iface; - } - else if (IsEqualGUID(riid, &IID_IDirect3DRMTexture3)) - { - *out = &texture->IDirect3DRMTexture3_iface; - } - else - { - *out = NULL; - WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown *)*out); - return S_OK; + return IDirect3DRMTexture3_QueryInterface(&texture->IDirect3DRMTexture3_iface, riid, out); } static ULONG WINAPI d3drm_texture2_AddRef(IDirect3DRMTexture2 *iface) { struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - ULONG refcount = InterlockedIncrement(&texture->ref); - TRACE("%p increasing refcount to %u.\n", iface, refcount); + TRACE("iface %p.\n", iface); - return refcount; + return IDirect3DRMTexture3_AddRef(&texture->IDirect3DRMTexture3_iface); } static ULONG WINAPI d3drm_texture2_Release(IDirect3DRMTexture2 *iface) { struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - ULONG refcount = InterlockedDecrement(&texture->ref); - TRACE("%p decreasing refcount to %u.\n", iface, refcount); - - if (!refcount) - HeapFree(GetProcessHeap(), 0, texture); + TRACE("iface %p.\n", iface); - return refcount; + return IDirect3DRMTexture3_Release(&texture->IDirect3DRMTexture3_iface); } static HRESULT WINAPI d3drm_texture2_Clone(IDirect3DRMTexture2 *iface, IUnknown *outer, REFIID iid, void **out) { - FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, outer %p, iid %s, out %p.\n", iface, outer, debugstr_guid(iid), out); + + return IDirect3DRMTexture3_Clone(&texture->IDirect3DRMTexture3_iface, outer, iid, out); } static HRESULT WINAPI d3drm_texture2_AddDestroyCallback(IDirect3DRMTexture2 *iface, @@ -132,16 +413,20 @@ static DWORD WINAPI d3drm_texture2_GetAppData(IDirect3DRMTexture2 *iface) static HRESULT WINAPI d3drm_texture2_SetName(IDirect3DRMTexture2 *iface, const char *name) { - FIXME("iface %p, name %s stub!\n", iface, debugstr_a(name)); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, name %s.\n", iface, debugstr_a(name)); + + return IDirect3DRMTexture3_SetName(&texture->IDirect3DRMTexture3_iface, name); } static HRESULT WINAPI d3drm_texture2_GetName(IDirect3DRMTexture2 *iface, DWORD *size, char *name) { - FIXME("iface %p, size %p, name %p stub!\n", iface, size, name); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, size %p, name %p.\n", iface, size, name); + + return IDirect3DRMTexture3_GetName(&texture->IDirect3DRMTexture3_iface, size, name); } static HRESULT WINAPI d3drm_texture2_GetClassName(IDirect3DRMTexture2 *iface, DWORD *size, char *name) @@ -184,107 +469,137 @@ static HRESULT WINAPI d3drm_texture2_Changed(IDirect3DRMTexture2 *iface, BOOL pi static HRESULT WINAPI d3drm_texture2_SetColors(IDirect3DRMTexture2 *iface, DWORD max_colors) { - FIXME("iface %p, max_colors %u stub!\n", iface, max_colors); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, max_colors %u.\n", iface, max_colors); + + return IDirect3DRMTexture3_SetColors(&texture->IDirect3DRMTexture3_iface, max_colors); } static HRESULT WINAPI d3drm_texture2_SetShades(IDirect3DRMTexture2 *iface, DWORD max_shades) { - FIXME("iface %p, max_shades %u stub!\n", iface, max_shades); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, max_shades %u.\n", iface, max_shades); + + return IDirect3DRMTexture3_SetShades(&texture->IDirect3DRMTexture3_iface, max_shades); } static HRESULT WINAPI d3drm_texture2_SetDecalSize(IDirect3DRMTexture2 *iface, D3DVALUE width, D3DVALUE height) { - FIXME("iface %p, width %.8e, height %.8e stub!\n", iface, width, height); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, width %.8e, height %.8e stub!\n", iface, width, height); + + return IDirect3DRMTexture3_SetDecalSize(&texture->IDirect3DRMTexture3_iface, width, height); } static HRESULT WINAPI d3drm_texture2_SetDecalOrigin(IDirect3DRMTexture2 *iface, LONG x, LONG y) { - FIXME("iface %p, x %d, y %d stub!\n", iface, x, y); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, x %d, y %d.\n", iface, x, y); + + return IDirect3DRMTexture3_SetDecalOrigin(&texture->IDirect3DRMTexture3_iface, x, y); } static HRESULT WINAPI d3drm_texture2_SetDecalScale(IDirect3DRMTexture2 *iface, DWORD scale) { - FIXME("iface %p, scale %u stub!\n", iface, scale); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, scale %u.\n", iface, scale); + + return IDirect3DRMTexture3_SetDecalScale(&texture->IDirect3DRMTexture3_iface, scale); } static HRESULT WINAPI d3drm_texture2_SetDecalTransparency(IDirect3DRMTexture2 *iface, BOOL transparency) { - FIXME("iface %p, transparency %#x stub!\n", iface, transparency); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, transparency %#x.\n", iface, transparency); + + return IDirect3DRMTexture3_SetDecalTransparency(&texture->IDirect3DRMTexture3_iface, transparency); } static HRESULT WINAPI d3drm_texture2_SetDecalTransparentColor(IDirect3DRMTexture2 *iface, D3DCOLOR color) { - FIXME("iface %p, color 0x%08x stub!\n", iface, color); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, color 0x%08x.\n", iface, color); + + return IDirect3DRMTexture3_SetDecalTransparentColor(&texture->IDirect3DRMTexture3_iface, color); } static HRESULT WINAPI d3drm_texture2_GetDecalSize(IDirect3DRMTexture2 *iface, D3DVALUE *width, D3DVALUE *height) { - FIXME("iface %p, width %p, height %p stub!\n", iface, width, height); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, width %p, height %p.\n", iface, width, height); + + return IDirect3DRMTexture3_GetDecalSize(&texture->IDirect3DRMTexture3_iface, width, height); } static HRESULT WINAPI d3drm_texture2_GetDecalOrigin(IDirect3DRMTexture2 *iface, LONG *x, LONG *y) { - FIXME("iface %p, x %p, y %p stub!\n", iface, x, y); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, x %p, y %p.\n", iface, x, y); + + return IDirect3DRMTexture3_GetDecalOrigin(&texture->IDirect3DRMTexture3_iface, x, y); } static D3DRMIMAGE * WINAPI d3drm_texture2_GetImage(IDirect3DRMTexture2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return NULL; + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetImage(&texture->IDirect3DRMTexture3_iface); } static DWORD WINAPI d3drm_texture2_GetShades(IDirect3DRMTexture2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return 0; + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetShades(&texture->IDirect3DRMTexture3_iface); } static DWORD WINAPI d3drm_texture2_GetColors(IDirect3DRMTexture2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return 0; + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetColors(&texture->IDirect3DRMTexture3_iface); } static DWORD WINAPI d3drm_texture2_GetDecalScale(IDirect3DRMTexture2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return 0; + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetDecalScale(&texture->IDirect3DRMTexture3_iface); } static BOOL WINAPI d3drm_texture2_GetDecalTransparency(IDirect3DRMTexture2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return FALSE; + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetDecalTransparency(&texture->IDirect3DRMTexture3_iface); } static D3DCOLOR WINAPI d3drm_texture2_GetDecalTransparentColor(IDirect3DRMTexture2 *iface) { - FIXME("iface %p stub!\n", iface); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return 0; + TRACE("iface %p.\n", iface); + + return IDirect3DRMTexture3_GetDecalTransparentColor(&texture->IDirect3DRMTexture3_iface); } static HRESULT WINAPI d3drm_texture2_InitFromImage(IDirect3DRMTexture2 *iface, D3DRMIMAGE *image) @@ -305,9 +620,11 @@ static HRESULT WINAPI d3drm_texture2_InitFromResource2(IDirect3DRMTexture2 *ifac static HRESULT WINAPI d3drm_texture2_GenerateMIPMap(IDirect3DRMTexture2 *iface, DWORD flags) { - FIXME("iface %p, flags %#x stub!\n", iface, flags); + struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface); - return E_NOTIMPL; + TRACE("iface %p, flags %#x.\n", iface, flags); + + return IDirect3DRMTexture3_GenerateMIPMap(&texture->IDirect3DRMTexture3_iface, flags); } static const struct IDirect3DRMTexture2Vtbl d3drm_texture2_vtbl = @@ -710,20 +1027,20 @@ static const struct IDirect3DRMTexture3Vtbl d3drm_texture3_vtbl = HRESULT Direct3DRMTexture_create(REFIID riid, IUnknown **out) { struct d3drm_texture *object; + HRESULT hr; TRACE("riid %s, out %p.\n", debugstr_guid(riid), out); if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return E_OUTOFMEMORY; + object->IDirect3DRMTexture_iface.lpVtbl = &d3drm_texture1_vtbl; object->IDirect3DRMTexture2_iface.lpVtbl = &d3drm_texture2_vtbl; object->IDirect3DRMTexture3_iface.lpVtbl = &d3drm_texture3_vtbl; object->ref = 1; - if (IsEqualGUID(riid, &IID_IDirect3DRMTexture3)) - *out = (IUnknown *)&object->IDirect3DRMTexture3_iface; - else - *out = (IUnknown *)&object->IDirect3DRMTexture2_iface; + hr = IDirect3DRMTexture3_QueryInterface(&object->IDirect3DRMTexture3_iface, riid, (void **)out); + IDirect3DRMTexture3_Release(&object->IDirect3DRMTexture3_iface); - return S_OK; + return hr; } diff --git a/reactos/dll/directx/wine/d3drm/viewport.c b/reactos/dll/directx/wine/d3drm/viewport.c index 16edd4de1b1..faf9cb03725 100644 --- a/reactos/dll/directx/wine/d3drm/viewport.c +++ b/reactos/dll/directx/wine/d3drm/viewport.c @@ -298,7 +298,7 @@ static BOOL WINAPI d3drm_viewport1_GetUniformScaling(IDirect3DRMViewport *iface) { FIXME("iface %p stub!\n", iface); - return E_NOTIMPL; + return FALSE; } static LONG WINAPI d3drm_viewport1_GetX(IDirect3DRMViewport *iface) @@ -663,7 +663,7 @@ static BOOL WINAPI d3drm_viewport2_GetUniformScaling(IDirect3DRMViewport2 *iface { FIXME("iface %p stub!\n", iface); - return E_NOTIMPL; + return FALSE; } static LONG WINAPI d3drm_viewport2_GetX(IDirect3DRMViewport2 *iface) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index fdb5892f835..10bb7dcc030 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -25,7 +25,7 @@ reactos/dll/directx/wine/amstream # Synced to WineStaging-1.7.55 reactos/dll/directx/wine/d3d8 # Synced to WineStaging-1.7.55 reactos/dll/directx/wine/d3d9 # Synced to WineStaging-1.7.55 reactos/dll/directx/wine/d3dcompiler_43 # Synced to WineStaging-1.7.55 -reactos/dll/directx/wine/d3drm # Synced to WineStaging-1.7.47 +reactos/dll/directx/wine/d3drm # Synced to WineStaging-1.7.55 reactos/dll/directx/wine/d3dx9_24 => 43 # Synced to WineStaging-1.7.55 reactos/dll/directx/wine/d3dxof # Synced to WineStaging-1.7.47 reactos/dll/directx/wine/ddraw # Synced to WineStaging-1.7.55