static HRESULT WINAPI d3drm_device3_InitFromD3D2(IDirect3DRMDevice3 *iface, IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device) { struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface); IDirect3D *d3d1; IDirect3DDevice *d3d_device1; HRESULT hr; TRACE("iface %p, d3d %p, d3d_device %p.\n", iface, d3d, d3d_device); if (!d3d || !d3d_device) return D3DRMERR_BADVALUE; if (FAILED(hr = IDirect3D2_QueryInterface(d3d, &IID_IDirect3D, (void **)&d3d1))) return hr; if (FAILED(hr = IDirect3DDevice2_QueryInterface(d3d_device, &IID_IDirect3DDevice, (void **)&d3d_device1))) { IDirect3D_Release(d3d1); return hr; } hr = d3drm_device_set_ddraw_device_d3d(device, d3d1, d3d_device1); IDirect3D_Release(d3d1); IDirect3DDevice_Release(d3d_device1); return hr; }
int d3d_device_close() { if (_lpD3DDev) { IDirect3DDevice_Release(_lpD3DDev); _lpD3DDev = NULL; } return 0; }
void d3drm_device_destroy(struct d3drm_device *device) { d3drm_object_cleanup((IDirect3DRMObject *)&device->IDirect3DRMDevice_iface, &device->obj); 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); }