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)
{
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);

View File

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

View File

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

View File

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

View File

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