mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
[D3DRM] Sync with Wine Staging 1.9.16. CORE-11866
svn path=/trunk/; revision=72258
This commit is contained in:
@@ -40,6 +40,45 @@ static const char* get_IID_string(const GUID* guid)
|
||||
return "?";
|
||||
}
|
||||
|
||||
static HRESULT d3drm_create_texture_object(void **object, IDirect3DRM *d3drm)
|
||||
{
|
||||
struct d3drm_texture *texture;
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = d3drm_texture_create(&texture, d3drm)))
|
||||
return hr;
|
||||
|
||||
*object = &texture->IDirect3DRMTexture_iface;
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT d3drm_create_device_object(void **object, IDirect3DRM *d3drm)
|
||||
{
|
||||
struct d3drm_device *device;
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = d3drm_device_create(&device, d3drm)))
|
||||
return hr;
|
||||
|
||||
*object = &device->IDirect3DRMDevice_iface;
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT d3drm_create_viewport_object(void **object, IDirect3DRM *d3drm)
|
||||
{
|
||||
struct d3drm_viewport *viewport;
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = d3drm_viewport_create(&viewport, d3drm)))
|
||||
return hr;
|
||||
|
||||
*object = &viewport->IDirect3DRMViewport_iface;
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
struct d3drm
|
||||
{
|
||||
IDirect3DRM IDirect3DRM_iface;
|
||||
@@ -139,9 +178,17 @@ static HRESULT WINAPI d3drm1_CreateObject(IDirect3DRM *iface,
|
||||
static HRESULT WINAPI d3drm1_CreateFrame(IDirect3DRM *iface,
|
||||
IDirect3DRMFrame *parent_frame, IDirect3DRMFrame **frame)
|
||||
{
|
||||
struct d3drm_frame *object;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
|
||||
|
||||
return Direct3DRMFrame_create(&IID_IDirect3DRMFrame, (IUnknown *)parent_frame, (IUnknown **)frame);
|
||||
if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, iface)))
|
||||
return hr;
|
||||
|
||||
*frame = &object->IDirect3DRMFrame_iface;
|
||||
|
||||
return D3DRM_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3drm1_CreateMesh(IDirect3DRM *iface, IDirect3DRMMesh **mesh)
|
||||
@@ -241,13 +288,13 @@ static HRESULT WINAPI d3drm1_CreateDevice(IDirect3DRM *iface,
|
||||
{
|
||||
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))
|
||||
if (FAILED(hr = d3drm_device_create(&object, iface)))
|
||||
return hr;
|
||||
|
||||
*device = IDirect3DRMDevice_from_impl(object);
|
||||
*device = &object->IDirect3DRMDevice_iface;
|
||||
|
||||
return D3DRM_OK;
|
||||
}
|
||||
@@ -255,7 +302,6 @@ static HRESULT WINAPI d3drm1_CreateDevice(IDirect3DRM *iface,
|
||||
static HRESULT WINAPI d3drm1_CreateDeviceFromSurface(IDirect3DRM *iface, GUID *guid,
|
||||
IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice **device)
|
||||
{
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
|
||||
struct d3drm_device *object;
|
||||
HRESULT hr;
|
||||
|
||||
@@ -269,13 +315,11 @@ static HRESULT WINAPI d3drm1_CreateDeviceFromSurface(IDirect3DRM *iface, GUID *g
|
||||
if (!backbuffer || !ddraw)
|
||||
return D3DRMERR_BADDEVICE;
|
||||
|
||||
hr = d3drm_device_create(&object);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(hr = d3drm_device_create(&object, iface)))
|
||||
return hr;
|
||||
|
||||
hr = d3drm_device_init(object, 1, &d3drm->IDirect3DRM_iface, ddraw, backbuffer, TRUE);
|
||||
if (SUCCEEDED(hr))
|
||||
*device = IDirect3DRMDevice_from_impl(object);
|
||||
if (SUCCEEDED(hr = d3drm_device_init(object, 1, ddraw, backbuffer, TRUE)))
|
||||
*device = &object->IDirect3DRMDevice_iface;
|
||||
else
|
||||
d3drm_device_destroy(object);
|
||||
|
||||
@@ -293,20 +337,16 @@ static HRESULT WINAPI d3drm1_CreateDeviceFromD3D(IDirect3DRM *iface,
|
||||
if (!device)
|
||||
return D3DRMERR_BADVALUE;
|
||||
*device = NULL;
|
||||
if (!d3d || !d3d_device)
|
||||
return D3DRMERR_BADVALUE;
|
||||
|
||||
hr = d3drm_device_create(&object);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(hr = d3drm_device_create(&object, iface)))
|
||||
return hr;
|
||||
|
||||
hr = d3drm_device_set_ddraw_device_d3d(object, iface, d3d, d3d_device);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(hr = IDirect3DRMDevice_InitFromD3D(&object->IDirect3DRMDevice_iface, d3d, d3d_device)))
|
||||
{
|
||||
d3drm_device_destroy(object);
|
||||
return hr;
|
||||
}
|
||||
*device = IDirect3DRMDevice_from_impl(object);
|
||||
*device = &object->IDirect3DRMDevice_iface;
|
||||
|
||||
return D3DRM_OK;
|
||||
}
|
||||
@@ -334,8 +374,7 @@ static HRESULT WINAPI d3drm1_CreateDeviceFromClipper(IDirect3DRM *iface,
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
hr = d3drm_device_create(&object);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(hr = d3drm_device_create(&object, iface)))
|
||||
{
|
||||
IDirectDraw_Release(ddraw);
|
||||
return hr;
|
||||
@@ -349,13 +388,13 @@ static HRESULT WINAPI d3drm1_CreateDeviceFromClipper(IDirect3DRM *iface,
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = d3drm_device_init(object, 1, iface, ddraw, render_target, TRUE);
|
||||
hr = d3drm_device_init(object, 1, ddraw, render_target, TRUE);
|
||||
IDirectDraw_Release(ddraw);
|
||||
IDirectDrawSurface_Release(render_target);
|
||||
if (FAILED(hr))
|
||||
d3drm_device_destroy(object);
|
||||
else
|
||||
*device = IDirect3DRMDevice_from_impl(object);
|
||||
*device = &object->IDirect3DRMDevice_iface;
|
||||
|
||||
return hr;
|
||||
}
|
||||
@@ -381,10 +420,39 @@ static HRESULT WINAPI d3drm1_CreateShadow(IDirect3DRM *iface, IDirect3DRMVisual
|
||||
static HRESULT WINAPI d3drm1_CreateViewport(IDirect3DRM *iface, IDirect3DRMDevice *device,
|
||||
IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
|
||||
{
|
||||
FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
|
||||
IDirect3DRMDevice3 *device3;
|
||||
IDirect3DRMFrame3 *camera3;
|
||||
IDirect3DRMViewport2 *viewport2;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
|
||||
iface, device, camera, x, y, width, height, viewport);
|
||||
|
||||
return Direct3DRMViewport_create(&IID_IDirect3DRMViewport, (IUnknown **)viewport);
|
||||
if (!device || !camera)
|
||||
return D3DRMERR_BADOBJECT;
|
||||
if (!viewport)
|
||||
return D3DRMERR_BADVALUE;
|
||||
|
||||
if (FAILED(hr = IDirect3DRMDevice_QueryInterface(device, &IID_IDirect3DRMDevice3, (void **)&device3)))
|
||||
return hr;
|
||||
|
||||
if (FAILED(hr = IDirect3DRMFrame_QueryInterface(camera, &IID_IDirect3DRMFrame3, (void **)&camera3)))
|
||||
{
|
||||
IDirect3DRMDevice3_Release(device3);
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = IDirect3DRM3_CreateViewport(&d3drm->IDirect3DRM3_iface, device3, camera3, x, y, width, height, &viewport2);
|
||||
IDirect3DRMDevice3_Release(device3);
|
||||
IDirect3DRMFrame3_Release(camera3);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
hr = IDirect3DRMViewport2_QueryInterface(viewport2, &IID_IDirect3DRMViewport, (void **)viewport);
|
||||
IDirect3DRMViewport2_Release(viewport2);
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3drm1_CreateWrap(IDirect3DRM *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
|
||||
@@ -613,9 +681,18 @@ static HRESULT WINAPI d3drm2_CreateObject(IDirect3DRM2 *iface,
|
||||
static HRESULT WINAPI d3drm2_CreateFrame(IDirect3DRM2 *iface,
|
||||
IDirect3DRMFrame *parent_frame, IDirect3DRMFrame2 **frame)
|
||||
{
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
|
||||
struct d3drm_frame *object;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
|
||||
|
||||
return Direct3DRMFrame_create(&IID_IDirect3DRMFrame2, (IUnknown*)parent_frame, (IUnknown**)frame);
|
||||
if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, &d3drm->IDirect3DRM_iface)))
|
||||
return hr;
|
||||
|
||||
*frame = &object->IDirect3DRMFrame2_iface;
|
||||
|
||||
return D3DRM_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3drm2_CreateMesh(IDirect3DRM2 *iface, IDirect3DRMMesh **mesh)
|
||||
@@ -713,15 +790,16 @@ static HRESULT WINAPI d3drm2_CreateMaterial(IDirect3DRM2 *iface,
|
||||
static HRESULT WINAPI d3drm2_CreateDevice(IDirect3DRM2 *iface,
|
||||
DWORD width, DWORD height, IDirect3DRMDevice2 **device)
|
||||
{
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
|
||||
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))
|
||||
if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
|
||||
return hr;
|
||||
|
||||
*device = IDirect3DRMDevice2_from_impl(object);
|
||||
*device = &object->IDirect3DRMDevice2_iface;
|
||||
|
||||
return D3DRM_OK;
|
||||
}
|
||||
@@ -752,38 +830,22 @@ static HRESULT WINAPI d3drm2_CreateDeviceFromD3D(IDirect3DRM2 *iface,
|
||||
IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice2 **device)
|
||||
{
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
|
||||
IDirect3D *d3d1;
|
||||
IDirect3DDevice *d3d_device1;
|
||||
IDirect3DRMDevice *device1;
|
||||
IDirect3DRMDevice3 *device3;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
|
||||
iface, d3d, d3d_device, device);
|
||||
|
||||
if (!device)
|
||||
return D3DRMERR_BADVALUE;
|
||||
*device = NULL;
|
||||
if (!d3d || !d3d_device)
|
||||
return D3DRMERR_BADVALUE;
|
||||
|
||||
hr = IDirect3D2_QueryInterface(d3d, &IID_IDirect3D, (void **)&d3d1);
|
||||
hr = IDirect3DRM3_CreateDeviceFromD3D(&d3drm->IDirect3DRM3_iface, d3d, d3d_device, &device3);
|
||||
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);
|
||||
hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void **)device);
|
||||
IDirect3DRMDevice3_Release(device3);
|
||||
|
||||
return hr;
|
||||
}
|
||||
@@ -833,10 +895,39 @@ static HRESULT WINAPI d3drm2_CreateShadow(IDirect3DRM2 *iface, IDirect3DRMVisual
|
||||
static HRESULT WINAPI d3drm2_CreateViewport(IDirect3DRM2 *iface, IDirect3DRMDevice *device,
|
||||
IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
|
||||
{
|
||||
FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
|
||||
iface, device, camera, x, y, width, height, viewport);
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
|
||||
IDirect3DRMDevice3 *device3;
|
||||
IDirect3DRMFrame3 *camera3;
|
||||
IDirect3DRMViewport2 *viewport2;
|
||||
HRESULT hr;
|
||||
|
||||
return Direct3DRMViewport_create(&IID_IDirect3DRMViewport, (IUnknown **)viewport);
|
||||
TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
|
||||
iface, device, camera, x, y, width, height, viewport);
|
||||
|
||||
if (!device || !camera)
|
||||
return D3DRMERR_BADOBJECT;
|
||||
if (!viewport)
|
||||
return D3DRMERR_BADVALUE;
|
||||
|
||||
if (FAILED(hr = IDirect3DRMDevice_QueryInterface(device, &IID_IDirect3DRMDevice3, (void **)&device3)))
|
||||
return hr;
|
||||
|
||||
if (FAILED(hr = IDirect3DRMFrame_QueryInterface(camera, &IID_IDirect3DRMFrame3, (void **)&camera3)))
|
||||
{
|
||||
IDirect3DRMDevice3_Release(device3);
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = IDirect3DRM3_CreateViewport(&d3drm->IDirect3DRM3_iface, device3, camera3, x, y, width, height, &viewport2);
|
||||
IDirect3DRMDevice3_Release(device3);
|
||||
IDirect3DRMFrame3_Release(camera3);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
hr = IDirect3DRMViewport2_QueryInterface(viewport2, &IID_IDirect3DRMViewport, (void **)viewport);
|
||||
IDirect3DRMViewport2_Release(viewport2);
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3drm2_CreateWrap(IDirect3DRM2 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
|
||||
@@ -1067,8 +1158,21 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
|
||||
{
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
|
||||
IUnknown *object;
|
||||
unsigned int i;
|
||||
HRESULT hr;
|
||||
|
||||
static const struct
|
||||
{
|
||||
const CLSID *clsid;
|
||||
HRESULT (*create_object)(void **object, IDirect3DRM *d3drm);
|
||||
}
|
||||
object_table[] =
|
||||
{
|
||||
{&CLSID_CDirect3DRMTexture, d3drm_create_texture_object},
|
||||
{&CLSID_CDirect3DRMDevice, d3drm_create_device_object},
|
||||
{&CLSID_CDirect3DRMViewport, d3drm_create_viewport_object},
|
||||
};
|
||||
|
||||
TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
|
||||
iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
|
||||
|
||||
@@ -1088,17 +1192,19 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
if (IsEqualGUID(clsid, &CLSID_CDirect3DRMTexture))
|
||||
for (i = 0; i < ARRAY_SIZE(object_table); ++i)
|
||||
{
|
||||
struct d3drm_texture *texture;
|
||||
if (FAILED(hr = d3drm_texture_create(&texture, &d3drm->IDirect3DRM_iface)))
|
||||
if (IsEqualGUID(clsid, object_table[i].clsid))
|
||||
{
|
||||
*out = NULL;
|
||||
return hr;
|
||||
if (FAILED(hr = object_table[i].create_object((void **)&object, &d3drm->IDirect3DRM_iface)))
|
||||
{
|
||||
*out = NULL;
|
||||
return hr;
|
||||
}
|
||||
break;
|
||||
}
|
||||
object = (IUnknown *)&texture->IDirect3DRMTexture3_iface;
|
||||
}
|
||||
else
|
||||
if (i == ARRAY_SIZE(object_table))
|
||||
{
|
||||
FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid));
|
||||
*out = NULL;
|
||||
@@ -1115,9 +1221,18 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
|
||||
static HRESULT WINAPI d3drm3_CreateFrame(IDirect3DRM3 *iface,
|
||||
IDirect3DRMFrame3 *parent, IDirect3DRMFrame3 **frame)
|
||||
{
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
|
||||
struct d3drm_frame *object;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, parent %p, frame %p.\n", iface, parent, frame);
|
||||
|
||||
return Direct3DRMFrame_create(&IID_IDirect3DRMFrame3, (IUnknown *)parent, (IUnknown **)frame);
|
||||
if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent, &d3drm->IDirect3DRM_iface)))
|
||||
return hr;
|
||||
|
||||
*frame = &object->IDirect3DRMFrame3_iface;
|
||||
|
||||
return D3DRM_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3drm3_CreateMesh(IDirect3DRM3 *iface, IDirect3DRMMesh **mesh)
|
||||
@@ -1231,15 +1346,16 @@ static HRESULT WINAPI d3drm3_CreateMaterial(IDirect3DRM3 *iface,
|
||||
static HRESULT WINAPI d3drm3_CreateDevice(IDirect3DRM3 *iface,
|
||||
DWORD width, DWORD height, IDirect3DRMDevice3 **device)
|
||||
{
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
|
||||
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))
|
||||
if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
|
||||
return hr;
|
||||
|
||||
*device = IDirect3DRMDevice3_from_impl(object);
|
||||
*device = &object->IDirect3DRMDevice3_iface;
|
||||
|
||||
return D3DRM_OK;
|
||||
}
|
||||
@@ -1262,15 +1378,13 @@ static HRESULT WINAPI d3drm3_CreateDeviceFromSurface(IDirect3DRM3 *iface, GUID *
|
||||
if (!backbuffer || !ddraw)
|
||||
return D3DRMERR_BADDEVICE;
|
||||
|
||||
hr = d3drm_device_create(&object);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
|
||||
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);
|
||||
if (SUCCEEDED(hr = d3drm_device_init(object, 3, ddraw, backbuffer, use_z_surface)))
|
||||
*device = &object->IDirect3DRMDevice3_iface;
|
||||
else
|
||||
d3drm_device_destroy(object);
|
||||
|
||||
@@ -1281,39 +1395,27 @@ static HRESULT WINAPI d3drm3_CreateDeviceFromD3D(IDirect3DRM3 *iface,
|
||||
IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice3 **device)
|
||||
{
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
|
||||
IDirect3D *d3d1;
|
||||
IDirect3DDevice *d3d_device1;
|
||||
IDirect3DRMDevice *device1;
|
||||
struct d3drm_device *object;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
|
||||
iface, d3d, d3d_device, 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))
|
||||
if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
|
||||
return hr;
|
||||
hr = IDirect3DDevice2_QueryInterface(d3d_device, &IID_IDirect3DDevice, (void **)&d3d_device1);
|
||||
if (FAILED(hr))
|
||||
|
||||
if (FAILED(hr = IDirect3DRMDevice3_InitFromD3D2(&object->IDirect3DRMDevice3_iface, d3d, d3d_device)))
|
||||
{
|
||||
IDirect3D_Release(d3d1);
|
||||
d3drm_device_destroy(object);
|
||||
return hr;
|
||||
}
|
||||
*device = &object->IDirect3DRMDevice3_iface;
|
||||
|
||||
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;
|
||||
return D3DRM_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface,
|
||||
@@ -1340,8 +1442,7 @@ static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface,
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
hr = d3drm_device_create(&object);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
|
||||
{
|
||||
IDirectDraw_Release(ddraw);
|
||||
return hr;
|
||||
@@ -1355,13 +1456,13 @@ static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface,
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = d3drm_device_init(object, 3, &d3drm->IDirect3DRM_iface, ddraw, render_target, TRUE);
|
||||
hr = d3drm_device_init(object, 3, ddraw, render_target, TRUE);
|
||||
IDirectDraw_Release(ddraw);
|
||||
IDirectDrawSurface_Release(render_target);
|
||||
if (FAILED(hr))
|
||||
d3drm_device_destroy(object);
|
||||
else
|
||||
*device = IDirect3DRMDevice3_from_impl(object);
|
||||
*device = &object->IDirect3DRMDevice3_iface;
|
||||
|
||||
return hr;
|
||||
}
|
||||
@@ -1386,10 +1487,31 @@ static HRESULT WINAPI d3drm3_CreateTextureFromSurface(IDirect3DRM3 *iface,
|
||||
static HRESULT WINAPI d3drm3_CreateViewport(IDirect3DRM3 *iface, IDirect3DRMDevice3 *device,
|
||||
IDirect3DRMFrame3 *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport2 **viewport)
|
||||
{
|
||||
FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
|
||||
struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
|
||||
struct d3drm_viewport *object;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
|
||||
iface, device, camera, x, y, width, height, viewport);
|
||||
|
||||
return Direct3DRMViewport_create(&IID_IDirect3DRMViewport2, (IUnknown **)viewport);
|
||||
if (!device || !camera)
|
||||
return D3DRMERR_BADOBJECT;
|
||||
if (!viewport)
|
||||
return D3DRMERR_BADVALUE;
|
||||
|
||||
if (FAILED(hr = d3drm_viewport_create(&object, &d3drm->IDirect3DRM_iface)))
|
||||
return hr;
|
||||
|
||||
*viewport = &object->IDirect3DRMViewport2_iface;
|
||||
|
||||
if (FAILED(hr = IDirect3DRMViewport2_Init(*viewport, device, camera, x, y, width, height)))
|
||||
{
|
||||
IDirect3DRMViewport2_Release(*viewport);
|
||||
*viewport = NULL;
|
||||
return D3DRMERR_BADVALUE;
|
||||
}
|
||||
|
||||
return D3DRM_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI d3drm3_CreateWrap(IDirect3DRM3 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame3 *frame,
|
||||
|
||||
@@ -28,19 +28,25 @@
|
||||
#define COBJMACROS
|
||||
#define NONAMELESSUNION
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <windef.h>
|
||||
#include <winbase.h>
|
||||
#include <wingdi.h>
|
||||
#include <d3drm.h>
|
||||
#include <dxfile.h>
|
||||
#include <d3drmwin.h>
|
||||
#include <rmxfguid.h>
|
||||
|
||||
#include <wine/debug.h>
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
|
||||
|
||||
#include "wine/list.h"
|
||||
#include <wine/list.h>
|
||||
|
||||
#ifndef ARRAY_SIZE
|
||||
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
|
||||
#endif
|
||||
|
||||
struct d3drm_device;
|
||||
struct d3drm_object
|
||||
{
|
||||
LONG ref;
|
||||
@@ -58,37 +64,89 @@ struct d3drm_texture
|
||||
D3DRMIMAGE *image;
|
||||
};
|
||||
|
||||
struct d3drm_frame
|
||||
{
|
||||
IDirect3DRMFrame IDirect3DRMFrame_iface;
|
||||
IDirect3DRMFrame2 IDirect3DRMFrame2_iface;
|
||||
IDirect3DRMFrame3 IDirect3DRMFrame3_iface;
|
||||
IDirect3DRM *d3drm;
|
||||
LONG ref;
|
||||
struct d3drm_frame *parent;
|
||||
ULONG nb_children;
|
||||
ULONG children_capacity;
|
||||
IDirect3DRMFrame3 **children;
|
||||
ULONG nb_visuals;
|
||||
ULONG visuals_capacity;
|
||||
IDirect3DRMVisual **visuals;
|
||||
ULONG nb_lights;
|
||||
ULONG lights_capacity;
|
||||
IDirect3DRMLight **lights;
|
||||
D3DRMMATRIX4D transform;
|
||||
D3DCOLOR scenebackground;
|
||||
};
|
||||
|
||||
struct d3drm_viewport
|
||||
{
|
||||
struct d3drm_object obj;
|
||||
struct d3drm_device *device;
|
||||
IDirect3DRMFrame *camera;
|
||||
IDirect3DRMViewport IDirect3DRMViewport_iface;
|
||||
IDirect3DRMViewport2 IDirect3DRMViewport2_iface;
|
||||
IDirect3DViewport *d3d_viewport;
|
||||
IDirect3DMaterial *material;
|
||||
IDirect3DRM *d3drm;
|
||||
D3DVALUE back;
|
||||
D3DVALUE front;
|
||||
D3DVALUE field;
|
||||
D3DRMPROJECTIONTYPE projection;
|
||||
};
|
||||
|
||||
struct d3drm_device
|
||||
{
|
||||
struct d3drm_object obj;
|
||||
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;
|
||||
BOOL dither;
|
||||
D3DRMRENDERQUALITY quality;
|
||||
DWORD rendermode;
|
||||
DWORD height;
|
||||
DWORD width;
|
||||
};
|
||||
|
||||
HRESULT d3drm_device_create(struct d3drm_device **device, IDirect3DRM *d3drm) 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;
|
||||
void d3drm_device_destroy(struct d3drm_device *device) DECLSPEC_HIDDEN;
|
||||
HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirectDraw *ddraw,
|
||||
IDirectDrawSurface *surface, BOOL create_z_surface) DECLSPEC_HIDDEN;
|
||||
|
||||
void d3drm_object_init(struct d3drm_object *object) DECLSPEC_HIDDEN;
|
||||
HRESULT d3drm_object_add_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx) DECLSPEC_HIDDEN;
|
||||
HRESULT d3drm_object_delete_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx) DECLSPEC_HIDDEN;
|
||||
void d3drm_object_cleanup(IDirect3DRMObject *iface, struct d3drm_object *object) DECLSPEC_HIDDEN;
|
||||
|
||||
HRESULT d3drm_device_create(struct d3drm_device **out) DECLSPEC_HIDDEN;
|
||||
struct d3drm_frame *unsafe_impl_from_IDirect3DRMFrame(IDirect3DRMFrame *iface) DECLSPEC_HIDDEN;
|
||||
struct d3drm_device *unsafe_impl_from_IDirect3DRMDevice3(IDirect3DRMDevice3 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
HRESULT d3drm_texture_create(struct d3drm_texture **texture, IDirect3DRM *d3drm) 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 d3drm_frame_create(struct d3drm_frame **frame, IUnknown *parent_frame, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
|
||||
HRESULT d3drm_viewport_create(struct d3drm_viewport **viewport, IDirect3DRM *d3drm) 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;
|
||||
HRESULT Direct3DRMMesh_create(IDirect3DRMMesh** obj) DECLSPEC_HIDDEN;
|
||||
HRESULT Direct3DRMMeshBuilder_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN;
|
||||
HRESULT Direct3DRMViewport_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN;
|
||||
HRESULT Direct3DRMMaterial_create(IDirect3DRMMaterial2** ret_iface) DECLSPEC_HIDDEN;
|
||||
|
||||
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;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+1387
-754
File diff suppressed because it is too large
Load Diff
@@ -39,7 +39,7 @@ static void d3drm_texture_destroy(struct d3drm_texture *texture)
|
||||
{
|
||||
TRACE("texture %p is being destroyed.\n", texture);
|
||||
|
||||
d3drm_object_cleanup((IDirect3DRMObject*)&texture->IDirect3DRMTexture3_iface, &texture->obj);
|
||||
d3drm_object_cleanup((IDirect3DRMObject*)&texture->IDirect3DRMTexture_iface, &texture->obj);
|
||||
if (texture->image)
|
||||
IDirect3DRM_Release(texture->d3drm);
|
||||
HeapFree(GetProcessHeap(), 0, texture);
|
||||
@@ -696,20 +696,20 @@ static HRESULT WINAPI d3drm_texture3_QueryInterface(IDirect3DRMTexture3 *iface,
|
||||
|
||||
TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
|
||||
|
||||
if (IsEqualGUID(riid, &IID_IDirect3DRMTexture3)
|
||||
if (IsEqualGUID(riid, &IID_IDirect3DRMTexture)
|
||||
|| IsEqualGUID(riid, &IID_IDirect3DRMVisual)
|
||||
|| IsEqualGUID(riid, &IID_IDirect3DRMObject)
|
||||
|| IsEqualGUID(riid, &IID_IUnknown))
|
||||
{
|
||||
*out = &texture->IDirect3DRMTexture3_iface;
|
||||
*out = &texture->IDirect3DRMTexture_iface;
|
||||
}
|
||||
else if (IsEqualGUID(riid, &IID_IDirect3DRMTexture2))
|
||||
{
|
||||
*out = &texture->IDirect3DRMTexture2_iface;
|
||||
}
|
||||
else if (IsEqualGUID(riid, &IID_IDirect3DRMTexture))
|
||||
else if (IsEqualGUID(riid, &IID_IDirect3DRMTexture3))
|
||||
{
|
||||
*out = &texture->IDirect3DRMTexture_iface;
|
||||
*out = &texture->IDirect3DRMTexture3_iface;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,7 @@ reactos/dll/directx/wine/amstream # Synced to WineStaging-1.9.16
|
||||
reactos/dll/directx/wine/d3d8 # Synced to WineStaging-1.9.4
|
||||
reactos/dll/directx/wine/d3d9 # Synced to WineStaging-1.9.4
|
||||
reactos/dll/directx/wine/d3dcompiler_43 # Synced to WineStaging-1.9.4
|
||||
reactos/dll/directx/wine/d3drm # Synced to WineStaging-1.9.11
|
||||
reactos/dll/directx/wine/d3drm # Synced to WineStaging-1.9.16
|
||||
reactos/dll/directx/wine/d3dx9_24 => 43 # Synced to WineStaging-1.9.4
|
||||
reactos/dll/directx/wine/d3dxof # Synced to WineStaging-1.9.11
|
||||
reactos/dll/directx/wine/ddraw # Synced to WineStaging-1.9.4
|
||||
|
||||
Reference in New Issue
Block a user