ddraw: Get rid of IDirect3DViewportImpl.

This commit is contained in:
Henri Verbeet 2012-03-14 22:04:32 +01:00 committed by Alexandre Julliard
parent ddfb19e913
commit 0c11c316bb
5 changed files with 161 additions and 207 deletions

View File

@ -4271,7 +4271,7 @@ static HRESULT WINAPI d3d3_CreateViewport(IDirect3D3 *iface, IDirect3DViewport3
IUnknown *outer_unknown) IUnknown *outer_unknown)
{ {
struct ddraw *ddraw = impl_from_IDirect3D3(iface); struct ddraw *ddraw = impl_from_IDirect3D3(iface);
IDirect3DViewportImpl *object; struct d3d_viewport *object;
TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown); TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown);

View File

@ -42,7 +42,6 @@ extern const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops DECLSPEC_HI
/* Typdef the interfaces */ /* Typdef the interfaces */
typedef struct IDirect3DDeviceImpl IDirect3DDeviceImpl; typedef struct IDirect3DDeviceImpl IDirect3DDeviceImpl;
typedef struct IDirect3DViewportImpl IDirect3DViewportImpl;
typedef struct IDirect3DMaterialImpl IDirect3DMaterialImpl; typedef struct IDirect3DMaterialImpl IDirect3DMaterialImpl;
typedef struct IDirect3DExecuteBufferImpl IDirect3DExecuteBufferImpl; typedef struct IDirect3DExecuteBufferImpl IDirect3DExecuteBufferImpl;
typedef struct IDirect3DVertexBufferImpl IDirect3DVertexBufferImpl; typedef struct IDirect3DVertexBufferImpl IDirect3DVertexBufferImpl;
@ -290,7 +289,7 @@ struct IDirect3DDeviceImpl
/* Viewport management */ /* Viewport management */
struct list viewport_list; struct list viewport_list;
IDirect3DViewportImpl *current_viewport; struct d3d_viewport *current_viewport;
D3DVIEWPORT7 active_viewport; D3DVIEWPORT7 active_viewport;
/* Required to keep track which of two available texture blending modes in d3ddevice3 is used */ /* Required to keep track which of two available texture blending modes in d3ddevice3 is used */
@ -410,7 +409,7 @@ struct d3d_light
struct ddraw *ddraw; struct ddraw *ddraw;
/* If this light is active for one viewport, put the viewport here */ /* If this light is active for one viewport, put the viewport here */
IDirect3DViewportImpl *active_viewport; struct d3d_viewport *active_viewport;
D3DLIGHT2 light; D3DLIGHT2 light;
D3DLIGHT7 light7; D3DLIGHT7 light7;
@ -451,7 +450,7 @@ IDirect3DMaterialImpl *d3d_material_create(struct ddraw *ddraw) DECLSPEC_HIDDEN;
/***************************************************************************** /*****************************************************************************
* IDirect3DViewport - Wraps to D3D7 * IDirect3DViewport - Wraps to D3D7
*****************************************************************************/ *****************************************************************************/
struct IDirect3DViewportImpl struct d3d_viewport
{ {
IDirect3DViewport3 IDirect3DViewport3_iface; IDirect3DViewport3 IDirect3DViewport3_iface;
LONG ref; LONG ref;
@ -480,13 +479,13 @@ struct IDirect3DViewportImpl
IDirect3DMaterialImpl *background; IDirect3DMaterialImpl *background;
}; };
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface) DECLSPEC_HIDDEN; struct d3d_viewport *unsafe_impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface) DECLSPEC_HIDDEN;
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport2(IDirect3DViewport2 *iface) DECLSPEC_HIDDEN; struct d3d_viewport *unsafe_impl_from_IDirect3DViewport2(IDirect3DViewport2 *iface) DECLSPEC_HIDDEN;
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport(IDirect3DViewport *iface) DECLSPEC_HIDDEN; struct d3d_viewport *unsafe_impl_from_IDirect3DViewport(IDirect3DViewport *iface) DECLSPEC_HIDDEN;
/* Helper functions */ /* Helper functions */
void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) DECLSPEC_HIDDEN; void viewport_activate(struct d3d_viewport *viewport, BOOL ignore_lights) DECLSPEC_HIDDEN;
void d3d_viewport_init(IDirect3DViewportImpl *viewport, struct ddraw *ddraw) DECLSPEC_HIDDEN; void d3d_viewport_init(struct d3d_viewport *viewport, struct ddraw *ddraw) DECLSPEC_HIDDEN;
/***************************************************************************** /*****************************************************************************
* IDirect3DExecuteBuffer - Wraps to D3D7 * IDirect3DExecuteBuffer - Wraps to D3D7
@ -519,7 +518,7 @@ IDirect3DExecuteBufferImpl *unsafe_impl_from_IDirect3DExecuteBuffer(IDirect3DExe
/* The execute function */ /* The execute function */
HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *execute_buffer, HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *execute_buffer,
IDirect3DDeviceImpl *device, IDirect3DViewportImpl *viewport) DECLSPEC_HIDDEN; IDirect3DDeviceImpl *device, struct d3d_viewport *viewport) DECLSPEC_HIDDEN;
/***************************************************************************** /*****************************************************************************
* IDirect3DVertexBuffer * IDirect3DVertexBuffer

View File

@ -778,7 +778,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_1_Execute(IDirect3DDevice *iface,
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice(iface);
IDirect3DExecuteBufferImpl *buffer = unsafe_impl_from_IDirect3DExecuteBuffer(ExecuteBuffer); IDirect3DExecuteBufferImpl *buffer = unsafe_impl_from_IDirect3DExecuteBuffer(ExecuteBuffer);
IDirect3DViewportImpl *Direct3DViewportImpl = unsafe_impl_from_IDirect3DViewport(Viewport); struct d3d_viewport *viewport_impl = unsafe_impl_from_IDirect3DViewport(Viewport);
HRESULT hr; HRESULT hr;
TRACE("iface %p, buffer %p, viewport %p, flags %#x.\n", iface, ExecuteBuffer, Viewport, Flags); TRACE("iface %p, buffer %p, viewport %p, flags %#x.\n", iface, ExecuteBuffer, Viewport, Flags);
@ -788,7 +788,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_1_Execute(IDirect3DDevice *iface,
/* Execute... */ /* Execute... */
wined3d_mutex_lock(); wined3d_mutex_lock();
hr = d3d_execute_buffer_execute(buffer, This, Direct3DViewportImpl); hr = d3d_execute_buffer_execute(buffer, This, viewport_impl);
wined3d_mutex_unlock(); wined3d_mutex_unlock();
return hr; return hr;
@ -816,7 +816,7 @@ IDirect3DDeviceImpl_3_AddViewport(IDirect3DDevice3 *iface,
IDirect3DViewport3 *Viewport) IDirect3DViewport3 *Viewport)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice3(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice3(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport3(Viewport); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport3(Viewport);
TRACE("iface %p, viewport %p.\n", iface, Viewport); TRACE("iface %p, viewport %p.\n", iface, Viewport);
@ -837,7 +837,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_2_AddViewport(IDirect3DDevice2 *iface,
IDirect3DViewport2 *Direct3DViewport2) IDirect3DViewport2 *Direct3DViewport2)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice2(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice2(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport2(Direct3DViewport2); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport2(Direct3DViewport2);
TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2);
@ -848,7 +848,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_1_AddViewport(IDirect3DDevice *iface,
IDirect3DViewport *Direct3DViewport) IDirect3DViewport *Direct3DViewport)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport(Direct3DViewport); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport(Direct3DViewport);
TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport); TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport);
@ -874,7 +874,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_1_AddViewport(IDirect3DDevice *iface,
static HRESULT WINAPI IDirect3DDeviceImpl_3_DeleteViewport(IDirect3DDevice3 *iface, IDirect3DViewport3 *viewport) static HRESULT WINAPI IDirect3DDeviceImpl_3_DeleteViewport(IDirect3DDevice3 *iface, IDirect3DViewport3 *viewport)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice3(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice3(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport3(viewport); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport3(viewport);
TRACE("iface %p, viewport %p.\n", iface, viewport); TRACE("iface %p, viewport %p.\n", iface, viewport);
@ -899,7 +899,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_2_DeleteViewport(IDirect3DDevice2 *ifa
IDirect3DViewport2 *Direct3DViewport2) IDirect3DViewport2 *Direct3DViewport2)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice2(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice2(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport2(Direct3DViewport2); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport2(Direct3DViewport2);
TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2);
@ -910,7 +910,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_1_DeleteViewport(IDirect3DDevice *ifac
IDirect3DViewport *Direct3DViewport) IDirect3DViewport *Direct3DViewport)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport(Direct3DViewport); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport(Direct3DViewport);
TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport); TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport);
@ -942,8 +942,8 @@ IDirect3DDeviceImpl_3_NextViewport(IDirect3DDevice3 *iface,
DWORD Flags) DWORD Flags)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice3(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice3(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport3(Viewport3); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport3(Viewport3);
IDirect3DViewportImpl *next; struct d3d_viewport *next;
struct list *entry; struct list *entry;
TRACE("iface %p, viewport %p, next %p, flags %#x.\n", TRACE("iface %p, viewport %p, next %p, flags %#x.\n",
@ -980,7 +980,7 @@ IDirect3DDeviceImpl_3_NextViewport(IDirect3DDevice3 *iface,
if (entry) if (entry)
{ {
next = LIST_ENTRY(entry, IDirect3DViewportImpl, entry); next = LIST_ENTRY(entry, struct d3d_viewport, entry);
*lplpDirect3DViewport3 = &next->IDirect3DViewport3_iface; *lplpDirect3DViewport3 = &next->IDirect3DViewport3_iface;
} }
else else
@ -995,7 +995,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_2_NextViewport(IDirect3DDevice2 *iface
IDirect3DViewport2 *Viewport2, IDirect3DViewport2 **lplpDirect3DViewport2, DWORD Flags) IDirect3DViewport2 *Viewport2, IDirect3DViewport2 **lplpDirect3DViewport2, DWORD Flags)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice2(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice2(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport2(Viewport2); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport2(Viewport2);
IDirect3DViewport3 *res; IDirect3DViewport3 *res;
HRESULT hr; HRESULT hr;
@ -1012,7 +1012,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_1_NextViewport(IDirect3DDevice *iface,
IDirect3DViewport *Viewport, IDirect3DViewport **lplpDirect3DViewport, DWORD Flags) IDirect3DViewport *Viewport, IDirect3DViewport **lplpDirect3DViewport, DWORD Flags)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport(Viewport); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport(Viewport);
IDirect3DViewport3 *res; IDirect3DViewport3 *res;
HRESULT hr; HRESULT hr;
@ -1787,7 +1787,7 @@ IDirect3DDeviceImpl_3_SetCurrentViewport(IDirect3DDevice3 *iface,
IDirect3DViewport3 *Direct3DViewport3) IDirect3DViewport3 *Direct3DViewport3)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice3(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice3(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport3(Direct3DViewport3); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport3(Direct3DViewport3);
TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport3); TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport3);
@ -1830,7 +1830,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_2_SetCurrentViewport(IDirect3DDevice2
IDirect3DViewport2 *Direct3DViewport2) IDirect3DViewport2 *Direct3DViewport2)
{ {
IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice2(iface); IDirect3DDeviceImpl *This = impl_from_IDirect3DDevice2(iface);
IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport2(Direct3DViewport2); struct d3d_viewport *vp = unsafe_impl_from_IDirect3DViewport2(Direct3DViewport2);
TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2);

View File

@ -69,7 +69,7 @@ static void _dump_D3DEXECUTEBUFFERDESC(const D3DEXECUTEBUFFERDESC *lpDesc) {
* *
*****************************************************************************/ *****************************************************************************/
HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This, HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
IDirect3DDeviceImpl *lpDevice, IDirect3DViewportImpl *lpViewport) IDirect3DDeviceImpl *lpDevice, struct d3d_viewport *viewport)
{ {
/* DWORD bs = This->desc.dwBufferSize; */ /* DWORD bs = This->desc.dwBufferSize; */
DWORD vs = This->data.dwVertexOffset; DWORD vs = This->data.dwVertexOffset;
@ -79,15 +79,15 @@ HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
char *instr = (char *)This->desc.lpData + is; char *instr = (char *)This->desc.lpData + is;
if (lpViewport->active_device != lpDevice) if (viewport->active_device != lpDevice)
{ {
WARN("Viewport %p active device is %p.\n", WARN("Viewport %p active device is %p.\n",
lpViewport, lpViewport->active_device); viewport, viewport->active_device);
return DDERR_INVALIDPARAMS; return DDERR_INVALIDPARAMS;
} }
/* Activate the viewport */ /* Activate the viewport */
viewport_activate(lpViewport, FALSE); viewport_activate(viewport, FALSE);
TRACE("ExecuteData :\n"); TRACE("ExecuteData :\n");
if (TRACE_ON(ddraw)) if (TRACE_ON(ddraw))
@ -376,8 +376,8 @@ HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
unsigned int nb; unsigned int nb;
D3DVERTEX *src = ((LPD3DVERTEX) ((char *)This->desc.lpData + vs)) + ci->wStart; D3DVERTEX *src = ((LPD3DVERTEX) ((char *)This->desc.lpData + vs)) + ci->wStart;
D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (This->vertex_data)) + ci->wDest; D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (This->vertex_data)) + ci->wDest;
D3DVIEWPORT *Viewport = &viewport->viewports.vp1;
D3DMATRIX mat; D3DMATRIX mat;
D3DVIEWPORT* Viewport = &lpViewport->viewports.vp1;
if (TRACE_ON(ddraw)) if (TRACE_ON(ddraw))
{ {
@ -421,8 +421,8 @@ HRESULT d3d_execute_buffer_execute(IDirect3DExecuteBufferImpl *This,
unsigned int nb; unsigned int nb;
D3DLVERTEX *src = ((LPD3DLVERTEX) ((char *)This->desc.lpData + vs)) + ci->wStart; D3DLVERTEX *src = ((LPD3DLVERTEX) ((char *)This->desc.lpData + vs)) + ci->wStart;
D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (This->vertex_data)) + ci->wDest; D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (This->vertex_data)) + ci->wDest;
D3DVIEWPORT *Viewport = &viewport->viewports.vp1;
D3DMATRIX mat; D3DMATRIX mat;
D3DVIEWPORT* Viewport = &lpViewport->viewports.vp1;
if (TRACE_ON(ddraw)) if (TRACE_ON(ddraw))
{ {

View File

@ -56,7 +56,7 @@ static void update_clip_space(IDirect3DDeviceImpl *device,
* activates the viewport using IDirect3DDevice7::SetViewport * activates the viewport using IDirect3DDevice7::SetViewport
* *
*****************************************************************************/ *****************************************************************************/
void viewport_activate(IDirect3DViewportImpl *This, BOOL ignore_lights) void viewport_activate(struct d3d_viewport *This, BOOL ignore_lights)
{ {
struct wined3d_vec3 scale, offset; struct wined3d_vec3 scale, offset;
D3DVIEWPORT7 vp; D3DVIEWPORT7 vp;
@ -144,9 +144,9 @@ static void _dump_D3DVIEWPORT2(const D3DVIEWPORT2 *lpvp)
lpvp->dvMinZ, lpvp->dvMaxZ); lpvp->dvMinZ, lpvp->dvMaxZ);
} }
static inline IDirect3DViewportImpl *impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface) static inline struct d3d_viewport *impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface)
{ {
return CONTAINING_RECORD(iface, IDirect3DViewportImpl, IDirect3DViewport3_iface); return CONTAINING_RECORD(iface, struct d3d_viewport, IDirect3DViewport3_iface);
} }
/***************************************************************************** /*****************************************************************************
@ -169,7 +169,7 @@ static inline IDirect3DViewportImpl *impl_from_IDirect3DViewport3(IDirect3DViewp
* E_NOINTERFACE if the requested interface wasn't found * E_NOINTERFACE if the requested interface wasn't found
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI IDirect3DViewportImpl_QueryInterface(IDirect3DViewport3 *iface, REFIID riid, void **object) static HRESULT WINAPI d3d_viewport_QueryInterface(IDirect3DViewport3 *iface, REFIID riid, void **object)
{ {
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
@ -198,13 +198,12 @@ static HRESULT WINAPI IDirect3DViewportImpl_QueryInterface(IDirect3DViewport3 *i
* The new refcount * The new refcount
* *
*****************************************************************************/ *****************************************************************************/
static ULONG WINAPI static ULONG WINAPI d3d_viewport_AddRef(IDirect3DViewport3 *iface)
IDirect3DViewportImpl_AddRef(IDirect3DViewport3 *iface)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface);
ULONG ref = InterlockedIncrement(&This->ref); ULONG ref = InterlockedIncrement(&viewport->ref);
TRACE("%p increasing refcount to %u.\n", This, ref); TRACE("%p increasing refcount to %u.\n", viewport, ref);
return ref; return ref;
} }
@ -218,18 +217,16 @@ IDirect3DViewportImpl_AddRef(IDirect3DViewport3 *iface)
* The new refcount * The new refcount
* *
*****************************************************************************/ *****************************************************************************/
static ULONG WINAPI static ULONG WINAPI d3d_viewport_Release(IDirect3DViewport3 *iface)
IDirect3DViewportImpl_Release(IDirect3DViewport3 *iface)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface);
ULONG ref = InterlockedDecrement(&This->ref); ULONG ref = InterlockedDecrement(&viewport->ref);
TRACE("%p decreasing refcount to %u.\n", This, ref); TRACE("%p decreasing refcount to %u.\n", viewport, ref);
if (!ref)
HeapFree(GetProcessHeap(), 0, viewport);
if (!ref) {
HeapFree(GetProcessHeap(), 0, This);
return 0;
}
return ref; return ref;
} }
@ -249,11 +246,9 @@ IDirect3DViewportImpl_Release(IDirect3DViewport3 *iface)
* DDERR_ALREADYINITIALIZED * DDERR_ALREADYINITIALIZED
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_Initialize(IDirect3DViewport3 *iface, IDirect3D *d3d)
IDirect3DViewportImpl_Initialize(IDirect3DViewport3 *iface,
IDirect3D *Direct3D)
{ {
TRACE("iface %p, d3d %p.\n", iface, Direct3D); TRACE("iface %p, d3d %p.\n", iface, d3d);
return DDERR_ALREADYINITIALIZED; return DDERR_ALREADYINITIALIZED;
} }
@ -271,11 +266,9 @@ IDirect3DViewportImpl_Initialize(IDirect3DViewport3 *iface,
* DDERR_INVALIDPARAMS if Data is NULL * DDERR_INVALIDPARAMS if Data is NULL
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_GetViewport(IDirect3DViewport3 *iface, D3DVIEWPORT *lpData)
IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface,
D3DVIEWPORT *lpData)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *This = impl_from_IDirect3DViewport3(iface);
DWORD dwSize; DWORD dwSize;
TRACE("iface %p, data %p.\n", iface, lpData); TRACE("iface %p, data %p.\n", iface, lpData);
@ -326,11 +319,9 @@ IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface,
* DDERR_INVALIDPARAMS if Data is NULL * DDERR_INVALIDPARAMS if Data is NULL
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_SetViewport(IDirect3DViewport3 *iface, D3DVIEWPORT *lpData)
IDirect3DViewportImpl_SetViewport(IDirect3DViewport3 *iface,
D3DVIEWPORT *lpData)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *This = impl_from_IDirect3DViewport3(iface);
IDirect3DViewport3 *current_viewport; IDirect3DViewport3 *current_viewport;
TRACE("iface %p, data %p.\n", iface, lpData); TRACE("iface %p, data %p.\n", iface, lpData);
@ -395,20 +386,16 @@ IDirect3DViewportImpl_SetViewport(IDirect3DViewport3 *iface,
* DDERR_INVALIDPARAMS if no clipping flag is specified * DDERR_INVALIDPARAMS if no clipping flag is specified
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_TransformVertices(IDirect3DViewport3 *iface,
IDirect3DViewportImpl_TransformVertices(IDirect3DViewport3 *iface, DWORD dwVertexCount, D3DTRANSFORMDATA *lpData, DWORD dwFlags, DWORD *lpOffScreen)
DWORD dwVertexCount,
D3DTRANSFORMDATA *lpData,
DWORD dwFlags,
DWORD *lpOffScreen)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface);
D3DVIEWPORT vp = viewport->viewports.vp1;
D3DMATRIX view_mat, world_mat, mat; D3DMATRIX view_mat, world_mat, mat;
float *in; float *in;
float *out; float *out;
float x, y, z, w; float x, y, z, w;
unsigned int i; unsigned int i;
D3DVIEWPORT vp = This->viewports.vp1;
D3DHVERTEX *outH; D3DHVERTEX *outH;
TRACE("iface %p, vertex_count %u, vertex_data %p, flags %#x, clip_plane %p.\n", TRACE("iface %p, vertex_count %u, vertex_data %p, flags %#x, clip_plane %p.\n",
@ -416,7 +403,7 @@ IDirect3DViewportImpl_TransformVertices(IDirect3DViewport3 *iface,
/* Tests on windows show that Windows crashes when this occurs, /* Tests on windows show that Windows crashes when this occurs,
* so don't return the (intuitive) return value * so don't return the (intuitive) return value
if(!This->active_device) if (!viewport->active_device)
{ {
WARN("No device active, returning D3DERR_VIEWPORTHASNODEVICE\n"); WARN("No device active, returning D3DERR_VIEWPORTHASNODEVICE\n");
return D3DERR_VIEWPORTHASNODEVICE; return D3DERR_VIEWPORTHASNODEVICE;
@ -431,12 +418,12 @@ IDirect3DViewportImpl_TransformVertices(IDirect3DViewport3 *iface,
wined3d_mutex_lock(); wined3d_mutex_lock();
wined3d_device_get_transform(This->active_device->wined3d_device, wined3d_device_get_transform(viewport->active_device->wined3d_device,
D3DTRANSFORMSTATE_VIEW, (struct wined3d_matrix *)&view_mat); D3DTRANSFORMSTATE_VIEW, (struct wined3d_matrix *)&view_mat);
wined3d_device_get_transform(This->active_device->wined3d_device, wined3d_device_get_transform(viewport->active_device->wined3d_device,
WINED3D_TS_WORLD_MATRIX(0), (struct wined3d_matrix *)&world_mat); WINED3D_TS_WORLD_MATRIX(0), (struct wined3d_matrix *)&world_mat);
multiply_matrix(&mat, &view_mat, &world_mat); multiply_matrix(&mat, &view_mat, &world_mat);
multiply_matrix(&mat, &This->active_device->legacy_projection, &mat); multiply_matrix(&mat, &viewport->active_device->legacy_projection, &mat);
in = lpData->lpIn; in = lpData->lpIn;
out = lpData->lpOut; out = lpData->lpOut;
@ -531,12 +518,10 @@ IDirect3DViewportImpl_TransformVertices(IDirect3DViewport3 *iface,
* DDERR_UNSUPPORTED * DDERR_UNSUPPORTED
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_LightElements(IDirect3DViewport3 *iface,
IDirect3DViewportImpl_LightElements(IDirect3DViewport3 *iface, DWORD element_count, D3DLIGHTDATA *data)
DWORD dwElementCount,
LPD3DLIGHTDATA lpData)
{ {
TRACE("iface %p, element_count %u, data %p.\n", iface, dwElementCount, lpData); TRACE("iface %p, element_count %u, data %p.\n", iface, element_count, data);
return DDERR_UNSUPPORTED; return DDERR_UNSUPPORTED;
} }
@ -553,11 +538,9 @@ IDirect3DViewportImpl_LightElements(IDirect3DViewport3 *iface,
* D3D_OK on success * D3D_OK on success
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_SetBackground(IDirect3DViewport3 *iface, D3DMATERIALHANDLE hMat)
IDirect3DViewportImpl_SetBackground(IDirect3DViewport3 *iface,
D3DMATERIALHANDLE hMat)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface);
IDirect3DMaterialImpl *m; IDirect3DMaterialImpl *m;
TRACE("iface %p, material %#x.\n", iface, hMat); TRACE("iface %p, material %#x.\n", iface, hMat);
@ -566,13 +549,13 @@ IDirect3DViewportImpl_SetBackground(IDirect3DViewport3 *iface,
if (!hMat) if (!hMat)
{ {
This->background = NULL; viewport->background = NULL;
TRACE("Setting background to NULL\n"); TRACE("Setting background to NULL\n");
wined3d_mutex_unlock(); wined3d_mutex_unlock();
return D3D_OK; return D3D_OK;
} }
m = ddraw_get_object(&This->ddraw->d3ddevice->handle_table, hMat - 1, DDRAW_HANDLE_MATERIAL); m = ddraw_get_object(&viewport->ddraw->d3ddevice->handle_table, hMat - 1, DDRAW_HANDLE_MATERIAL);
if (!m) if (!m)
{ {
WARN("Invalid material handle.\n"); WARN("Invalid material handle.\n");
@ -583,7 +566,7 @@ IDirect3DViewportImpl_SetBackground(IDirect3DViewport3 *iface,
TRACE("Setting background color : %.8e %.8e %.8e %.8e.\n", TRACE("Setting background color : %.8e %.8e %.8e %.8e.\n",
m->mat.u.diffuse.u1.r, m->mat.u.diffuse.u2.g, m->mat.u.diffuse.u1.r, m->mat.u.diffuse.u2.g,
m->mat.u.diffuse.u3.b, m->mat.u.diffuse.u4.a); m->mat.u.diffuse.u3.b, m->mat.u.diffuse.u4.a);
This->background = m; viewport->background = m;
wined3d_mutex_unlock(); wined3d_mutex_unlock();
@ -603,31 +586,18 @@ IDirect3DViewportImpl_SetBackground(IDirect3DViewport3 *iface,
* D3D_OK * D3D_OK
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_GetBackground(IDirect3DViewport3 *iface,
IDirect3DViewportImpl_GetBackground(IDirect3DViewport3 *iface, D3DMATERIALHANDLE *material, BOOL *valid)
D3DMATERIALHANDLE *lphMat,
BOOL *lpValid)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface);
TRACE("iface %p, material %p, valid %p.\n", iface, lphMat, lpValid); TRACE("iface %p, material %p, valid %p.\n", iface, material, valid);
wined3d_mutex_lock(); wined3d_mutex_lock();
if(lpValid) if (valid)
{ *valid = !!viewport->background;
*lpValid = This->background != NULL; if (material)
} *material = viewport->background ? viewport->background->Handle : 0;
if(lphMat)
{
if(This->background)
{
*lphMat = This->background->Handle;
}
else
{
*lphMat = 0;
}
}
wined3d_mutex_unlock(); wined3d_mutex_unlock();
return D3D_OK; return D3D_OK;
@ -645,11 +615,9 @@ IDirect3DViewportImpl_GetBackground(IDirect3DViewport3 *iface,
* Returns: D3D_OK, because it's a stub * Returns: D3D_OK, because it's a stub
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_SetBackgroundDepth(IDirect3DViewport3 *iface, IDirectDrawSurface *surface)
IDirect3DViewportImpl_SetBackgroundDepth(IDirect3DViewport3 *iface,
IDirectDrawSurface *lpDDSurface)
{ {
FIXME("iface %p, surface %p stub!\n", iface, lpDDSurface); FIXME("iface %p, surface %p stub!\n", iface, surface);
return D3D_OK; return D3D_OK;
} }
@ -668,12 +636,10 @@ IDirect3DViewportImpl_SetBackgroundDepth(IDirect3DViewport3 *iface,
* (DDERR_INVALIDPARAMS if DDSurface of Valid is NULL) * (DDERR_INVALIDPARAMS if DDSurface of Valid is NULL)
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_GetBackgroundDepth(IDirect3DViewport3 *iface,
IDirect3DViewportImpl_GetBackgroundDepth(IDirect3DViewport3 *iface, IDirectDrawSurface **surface, BOOL *valid)
IDirectDrawSurface **lplpDDSurface,
LPBOOL lpValid)
{ {
FIXME("iface %p, surface %p, valid %p stub!\n", iface, lplpDDSurface, lpValid); FIXME("iface %p, surface %p, valid %p stub!\n", iface, surface, valid);
return DD_OK; return DD_OK;
} }
@ -695,16 +661,16 @@ IDirect3DViewportImpl_GetBackgroundDepth(IDirect3DViewport3 *iface,
* The return value of IDirect3DDevice7::Clear * The return value of IDirect3DDevice7::Clear
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface, static HRESULT WINAPI d3d_viewport_Clear(IDirect3DViewport3 *iface,
DWORD dwCount, D3DRECT *lpRects, DWORD dwFlags) DWORD rect_count, D3DRECT *rects, DWORD flags)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *This = impl_from_IDirect3DViewport3(iface);
DWORD color = 0x00000000; DWORD color = 0x00000000;
HRESULT hr; HRESULT hr;
IDirect3DViewport3 *current_viewport; IDirect3DViewport3 *current_viewport;
IDirect3DDevice3 *d3d_device3; IDirect3DDevice3 *d3d_device3;
TRACE("iface %p, rect_count %u, rects %p, flags %#x.\n", iface, dwCount, lpRects, dwFlags); TRACE("iface %p, rect_count %u, rects %p, flags %#x.\n", iface, rect_count, rects, flags);
if (This->active_device == NULL) { if (This->active_device == NULL) {
ERR(" Trying to clear a viewport not attached to a device !\n"); ERR(" Trying to clear a viewport not attached to a device !\n");
@ -714,7 +680,8 @@ static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
wined3d_mutex_lock(); wined3d_mutex_lock();
if (dwFlags & D3DCLEAR_TARGET) { if (flags & D3DCLEAR_TARGET)
{
if (This->background == NULL) { if (This->background == NULL) {
ERR(" Trying to clear the color buffer without background material !\n"); ERR(" Trying to clear the color buffer without background material !\n");
} }
@ -731,12 +698,13 @@ static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
afterwards. */ afterwards. */
viewport_activate(This, TRUE); viewport_activate(This, TRUE);
hr = IDirect3DDevice7_Clear(&This->active_device->IDirect3DDevice7_iface, dwCount, lpRects, hr = IDirect3DDevice7_Clear(&This->active_device->IDirect3DDevice7_iface, rect_count, rects,
dwFlags & (D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET), color, 1.0, 0x00000000); flags & (D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET), color, 1.0, 0x00000000);
IDirect3DDevice3_GetCurrentViewport(d3d_device3, &current_viewport); IDirect3DDevice3_GetCurrentViewport(d3d_device3, &current_viewport);
if(current_viewport) { if (current_viewport)
IDirect3DViewportImpl *vp = impl_from_IDirect3DViewport3(current_viewport); {
struct d3d_viewport *vp = impl_from_IDirect3DViewport3(current_viewport);
viewport_activate(vp, TRUE); viewport_activate(vp, TRUE);
IDirect3DViewport3_Release(current_viewport); IDirect3DViewport3_Release(current_viewport);
} }
@ -760,10 +728,9 @@ static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
* DDERR_INVALIDPARAMS if there are 8 lights or more * DDERR_INVALIDPARAMS if there are 8 lights or more
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface, static HRESULT WINAPI d3d_viewport_AddLight(IDirect3DViewport3 *iface, IDirect3DLight *lpDirect3DLight)
IDirect3DLight *lpDirect3DLight)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *This = impl_from_IDirect3DViewport3(iface);
struct d3d_light *light_impl = unsafe_impl_from_IDirect3DLight(lpDirect3DLight); struct d3d_light *light_impl = unsafe_impl_from_IDirect3DLight(lpDirect3DLight);
DWORD i = 0; DWORD i = 0;
DWORD map = This->map_lights; DWORD map = This->map_lights;
@ -817,17 +784,16 @@ static HRESULT WINAPI IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface,
* DDERR_INVALIDPARAMS if the light wasn't found * DDERR_INVALIDPARAMS if the light wasn't found
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *iface, static HRESULT WINAPI d3d_viewport_DeleteLight(IDirect3DViewport3 *iface, IDirect3DLight *lpDirect3DLight)
IDirect3DLight *lpDirect3DLight)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface);
struct d3d_light *l = unsafe_impl_from_IDirect3DLight(lpDirect3DLight); struct d3d_light *l = unsafe_impl_from_IDirect3DLight(lpDirect3DLight);
TRACE("iface %p, light %p.\n", iface, lpDirect3DLight); TRACE("iface %p, light %p.\n", iface, lpDirect3DLight);
wined3d_mutex_lock(); wined3d_mutex_lock();
if (l->active_viewport != This) if (l->active_viewport != viewport)
{ {
WARN("Light %p active viewport is %p.\n", l, l->active_viewport); WARN("Light %p active viewport is %p.\n", l, l->active_viewport);
wined3d_mutex_unlock(); wined3d_mutex_unlock();
@ -838,8 +804,8 @@ static HRESULT WINAPI IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *ifac
list_remove(&l->entry); list_remove(&l->entry);
l->active_viewport = NULL; l->active_viewport = NULL;
IDirect3DLight_Release(lpDirect3DLight); IDirect3DLight_Release(lpDirect3DLight);
--This->num_lights; --viewport->num_lights;
This->map_lights &= ~(1 << l->dwLightIndex); viewport->map_lights &= ~(1 << l->dwLightIndex);
wined3d_mutex_unlock(); wined3d_mutex_unlock();
@ -859,46 +825,46 @@ static HRESULT WINAPI IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *ifac
* D3D_OK, because it's a stub * D3D_OK, because it's a stub
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI IDirect3DViewportImpl_NextLight(IDirect3DViewport3 *iface, static HRESULT WINAPI d3d_viewport_NextLight(IDirect3DViewport3 *iface,
IDirect3DLight *lpDirect3DLight, IDirect3DLight **lplpDirect3DLight, DWORD dwFlags) IDirect3DLight *lpDirect3DLight, IDirect3DLight **lplpDirect3DLight, DWORD flags)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface);
struct d3d_light *l = unsafe_impl_from_IDirect3DLight(lpDirect3DLight); struct d3d_light *l = unsafe_impl_from_IDirect3DLight(lpDirect3DLight);
struct list *entry; struct list *entry;
HRESULT hr; HRESULT hr;
TRACE("iface %p, light %p, next_light %p, flags %#x.\n", TRACE("iface %p, light %p, next_light %p, flags %#x.\n",
iface, lpDirect3DLight, lplpDirect3DLight, dwFlags); iface, lpDirect3DLight, lplpDirect3DLight, flags);
if (!lplpDirect3DLight) if (!lplpDirect3DLight)
return DDERR_INVALIDPARAMS; return DDERR_INVALIDPARAMS;
wined3d_mutex_lock(); wined3d_mutex_lock();
switch (dwFlags) switch (flags)
{ {
case D3DNEXT_NEXT: case D3DNEXT_NEXT:
if (!l || l->active_viewport != This) if (!l || l->active_viewport != viewport)
{ {
if (l) if (l)
WARN("Light %p active viewport is %p.\n", l, l->active_viewport); WARN("Light %p active viewport is %p.\n", l, l->active_viewport);
entry = NULL; entry = NULL;
} }
else else
entry = list_next(&This->light_list, &l->entry); entry = list_next(&viewport->light_list, &l->entry);
break; break;
case D3DNEXT_HEAD: case D3DNEXT_HEAD:
entry = list_head(&This->light_list); entry = list_head(&viewport->light_list);
break; break;
case D3DNEXT_TAIL: case D3DNEXT_TAIL:
entry = list_tail(&This->light_list); entry = list_tail(&viewport->light_list);
break; break;
default: default:
entry = NULL; entry = NULL;
WARN("Invalid flags %#x.\n", dwFlags); WARN("Invalid flags %#x.\n", flags);
break; break;
} }
@ -939,11 +905,9 @@ static HRESULT WINAPI IDirect3DViewportImpl_NextLight(IDirect3DViewport3 *iface,
* DDERR_INVALIDPARAMS if Data is NULL * DDERR_INVALIDPARAMS if Data is NULL
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_GetViewport2(IDirect3DViewport3 *iface, D3DVIEWPORT2 *lpData)
IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface,
D3DVIEWPORT2 *lpData)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *This = impl_from_IDirect3DViewport3(iface);
DWORD dwSize; DWORD dwSize;
TRACE("iface %p, data %p.\n", iface, lpData); TRACE("iface %p, data %p.\n", iface, lpData);
@ -992,11 +956,9 @@ IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface,
* D3D_OK on success * D3D_OK on success
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_SetViewport2(IDirect3DViewport3 *iface, D3DVIEWPORT2 *lpData)
IDirect3DViewportImpl_SetViewport2(IDirect3DViewport3 *iface,
D3DVIEWPORT2 *lpData)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *This = impl_from_IDirect3DViewport3(iface);
IDirect3DViewport3 *current_viewport; IDirect3DViewport3 *current_viewport;
TRACE("iface %p, data %p.\n", iface, lpData); TRACE("iface %p, data %p.\n", iface, lpData);
@ -1044,11 +1006,10 @@ IDirect3DViewportImpl_SetViewport2(IDirect3DViewport3 *iface,
* D3D_OK, because it's stub * D3D_OK, because it's stub
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_SetBackgroundDepth2(IDirect3DViewport3 *iface,
IDirect3DViewportImpl_SetBackgroundDepth2(IDirect3DViewport3 *iface, IDirectDrawSurface4 *surface)
IDirectDrawSurface4 *lpDDS)
{ {
FIXME("iface %p, surface %p stub!\n", iface, lpDDS); FIXME("iface %p, surface %p stub!\n", iface, surface);
return D3D_OK; return D3D_OK;
} }
@ -1066,12 +1027,10 @@ IDirect3DViewportImpl_SetBackgroundDepth2(IDirect3DViewport3 *iface,
* D3D_OK because it's a stub * D3D_OK because it's a stub
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_GetBackgroundDepth2(IDirect3DViewport3 *iface,
IDirect3DViewportImpl_GetBackgroundDepth2(IDirect3DViewport3 *iface, IDirectDrawSurface4 **surface, BOOL *valid)
IDirectDrawSurface4 **lplpDDS,
BOOL *lpValid)
{ {
FIXME("iface %p, surface %p, valid %p stub!\n", iface, lplpDDS, lpValid); FIXME("iface %p, surface %p, valid %p stub!\n", iface, surface, valid);
return D3D_OK; return D3D_OK;
} }
@ -1092,40 +1051,36 @@ IDirect3DViewportImpl_GetBackgroundDepth2(IDirect3DViewport3 *iface,
* Returns: * Returns:
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI d3d_viewport_Clear2(IDirect3DViewport3 *iface, DWORD rect_count,
IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface, D3DRECT *rects, DWORD flags, DWORD color, D3DVALUE depth, DWORD stencil)
DWORD dwCount,
LPD3DRECT lpRects,
DWORD dwFlags,
DWORD dwColor,
D3DVALUE dvZ,
DWORD dwStencil)
{ {
IDirect3DViewportImpl *This = impl_from_IDirect3DViewport3(iface); struct d3d_viewport *viewport = impl_from_IDirect3DViewport3(iface);
HRESULT hr; HRESULT hr;
IDirect3DViewport3 *current_viewport; IDirect3DViewport3 *current_viewport;
IDirect3DDevice3 *d3d_device3; IDirect3DDevice3 *d3d_device3;
TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, depth %.8e, stencil %u.\n", TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, depth %.8e, stencil %u.\n",
iface, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil); iface, rect_count, rects, flags, color, depth, stencil);
wined3d_mutex_lock(); wined3d_mutex_lock();
if (This->active_device == NULL) { if (!viewport->active_device)
ERR(" Trying to clear a viewport not attached to a device !\n"); {
WARN("Trying to clear a viewport not attached to a device.\n");
wined3d_mutex_unlock(); wined3d_mutex_unlock();
return D3DERR_VIEWPORTHASNODEVICE; return D3DERR_VIEWPORTHASNODEVICE;
} }
d3d_device3 = &This->active_device->IDirect3DDevice3_iface; d3d_device3 = &viewport->active_device->IDirect3DDevice3_iface;
/* Need to temporarily activate viewport to clear it. Previously active /* Need to temporarily activate viewport to clear it. Previously active
* one will be restored afterwards. */ * one will be restored afterwards. */
viewport_activate(This, TRUE); viewport_activate(viewport, TRUE);
hr = IDirect3DDevice7_Clear(&This->active_device->IDirect3DDevice7_iface, hr = IDirect3DDevice7_Clear(&viewport->active_device->IDirect3DDevice7_iface,
dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil); rect_count, rects, flags, color, depth, stencil);
IDirect3DDevice3_GetCurrentViewport(d3d_device3, &current_viewport); IDirect3DDevice3_GetCurrentViewport(d3d_device3, &current_viewport);
if(current_viewport) { if (current_viewport)
IDirect3DViewportImpl *vp = impl_from_IDirect3DViewport3(current_viewport); {
struct d3d_viewport *vp = impl_from_IDirect3DViewport3(current_viewport);
viewport_activate(vp, TRUE); viewport_activate(vp, TRUE);
IDirect3DViewport3_Release(current_viewport); IDirect3DViewport3_Release(current_viewport);
} }
@ -1142,56 +1097,56 @@ IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface,
static const struct IDirect3DViewport3Vtbl d3d_viewport_vtbl = static const struct IDirect3DViewport3Vtbl d3d_viewport_vtbl =
{ {
/*** IUnknown Methods ***/ /*** IUnknown Methods ***/
IDirect3DViewportImpl_QueryInterface, d3d_viewport_QueryInterface,
IDirect3DViewportImpl_AddRef, d3d_viewport_AddRef,
IDirect3DViewportImpl_Release, d3d_viewport_Release,
/*** IDirect3DViewport Methods */ /*** IDirect3DViewport Methods */
IDirect3DViewportImpl_Initialize, d3d_viewport_Initialize,
IDirect3DViewportImpl_GetViewport, d3d_viewport_GetViewport,
IDirect3DViewportImpl_SetViewport, d3d_viewport_SetViewport,
IDirect3DViewportImpl_TransformVertices, d3d_viewport_TransformVertices,
IDirect3DViewportImpl_LightElements, d3d_viewport_LightElements,
IDirect3DViewportImpl_SetBackground, d3d_viewport_SetBackground,
IDirect3DViewportImpl_GetBackground, d3d_viewport_GetBackground,
IDirect3DViewportImpl_SetBackgroundDepth, d3d_viewport_SetBackgroundDepth,
IDirect3DViewportImpl_GetBackgroundDepth, d3d_viewport_GetBackgroundDepth,
IDirect3DViewportImpl_Clear, d3d_viewport_Clear,
IDirect3DViewportImpl_AddLight, d3d_viewport_AddLight,
IDirect3DViewportImpl_DeleteLight, d3d_viewport_DeleteLight,
IDirect3DViewportImpl_NextLight, d3d_viewport_NextLight,
/*** IDirect3DViewport2 Methods ***/ /*** IDirect3DViewport2 Methods ***/
IDirect3DViewportImpl_GetViewport2, d3d_viewport_GetViewport2,
IDirect3DViewportImpl_SetViewport2, d3d_viewport_SetViewport2,
/*** IDirect3DViewport3 Methods ***/ /*** IDirect3DViewport3 Methods ***/
IDirect3DViewportImpl_SetBackgroundDepth2, d3d_viewport_SetBackgroundDepth2,
IDirect3DViewportImpl_GetBackgroundDepth2, d3d_viewport_GetBackgroundDepth2,
IDirect3DViewportImpl_Clear2, d3d_viewport_Clear2,
}; };
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface) struct d3d_viewport *unsafe_impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface)
{ {
if (!iface) return NULL; if (!iface) return NULL;
assert(iface->lpVtbl == &d3d_viewport_vtbl); assert(iface->lpVtbl == &d3d_viewport_vtbl);
return CONTAINING_RECORD(iface, IDirect3DViewportImpl, IDirect3DViewport3_iface); return CONTAINING_RECORD(iface, struct d3d_viewport, IDirect3DViewport3_iface);
} }
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport2(IDirect3DViewport2 *iface) struct d3d_viewport *unsafe_impl_from_IDirect3DViewport2(IDirect3DViewport2 *iface)
{ {
/* IDirect3DViewport and IDirect3DViewport3 use the same iface. */ /* IDirect3DViewport and IDirect3DViewport3 use the same iface. */
if (!iface) return NULL; if (!iface) return NULL;
assert(iface->lpVtbl == (IDirect3DViewport2Vtbl *)&d3d_viewport_vtbl); assert(iface->lpVtbl == (IDirect3DViewport2Vtbl *)&d3d_viewport_vtbl);
return CONTAINING_RECORD(iface, IDirect3DViewportImpl, IDirect3DViewport3_iface); return CONTAINING_RECORD(iface, struct d3d_viewport, IDirect3DViewport3_iface);
} }
IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport(IDirect3DViewport *iface) struct d3d_viewport *unsafe_impl_from_IDirect3DViewport(IDirect3DViewport *iface)
{ {
/* IDirect3DViewport and IDirect3DViewport3 use the same iface. */ /* IDirect3DViewport and IDirect3DViewport3 use the same iface. */
if (!iface) return NULL; if (!iface) return NULL;
assert(iface->lpVtbl == (IDirect3DViewportVtbl *)&d3d_viewport_vtbl); assert(iface->lpVtbl == (IDirect3DViewportVtbl *)&d3d_viewport_vtbl);
return CONTAINING_RECORD(iface, IDirect3DViewportImpl, IDirect3DViewport3_iface); return CONTAINING_RECORD(iface, struct d3d_viewport, IDirect3DViewport3_iface);
} }
void d3d_viewport_init(IDirect3DViewportImpl *viewport, struct ddraw *ddraw) void d3d_viewport_init(struct d3d_viewport *viewport, struct ddraw *ddraw)
{ {
viewport->IDirect3DViewport3_iface.lpVtbl = &d3d_viewport_vtbl; viewport->IDirect3DViewport3_iface.lpVtbl = &d3d_viewport_vtbl;
viewport->ref = 1; viewport->ref = 1;