d3d9: Get rid of IDirect3DVertexDeclaration9Impl.
This commit is contained in:
parent
79d62ca1fb
commit
bdd42942c0
|
@ -256,32 +256,20 @@ struct d3d9_stateblock
|
|||
HRESULT stateblock_init(struct d3d9_stateblock *stateblock, struct d3d9_device *device,
|
||||
D3DSTATEBLOCKTYPE type, struct wined3d_stateblock *wined3d_stateblock) DECLSPEC_HIDDEN;
|
||||
|
||||
/* --------------------------- */
|
||||
/* IDirect3DVertexDeclaration9 */
|
||||
/* --------------------------- */
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirect3DVertexDeclaration implementation structure
|
||||
*/
|
||||
typedef struct IDirect3DVertexDeclaration9Impl {
|
||||
/* IUnknown fields */
|
||||
IDirect3DVertexDeclaration9 IDirect3DVertexDeclaration9_iface;
|
||||
LONG ref;
|
||||
|
||||
D3DVERTEXELEMENT9 *elements;
|
||||
UINT element_count;
|
||||
|
||||
/* IDirect3DVertexDeclaration9 fields */
|
||||
struct wined3d_vertex_declaration *wineD3DVertexDeclaration;
|
||||
DWORD convFVF;
|
||||
|
||||
/* Parent reference */
|
||||
LPDIRECT3DDEVICE9EX parentDevice;
|
||||
} IDirect3DVertexDeclaration9Impl;
|
||||
struct d3d9_vertex_declaration
|
||||
{
|
||||
IDirect3DVertexDeclaration9 IDirect3DVertexDeclaration9_iface;
|
||||
LONG refcount;
|
||||
D3DVERTEXELEMENT9 *elements;
|
||||
UINT element_count;
|
||||
struct wined3d_vertex_declaration *wined3d_declaration;
|
||||
DWORD fvf;
|
||||
IDirect3DDevice9Ex *parent_device;
|
||||
};
|
||||
|
||||
HRESULT d3d9_vertex_declaration_create(struct d3d9_device *device,
|
||||
const D3DVERTEXELEMENT9 *elements, IDirect3DVertexDeclaration9Impl **declaration) DECLSPEC_HIDDEN;
|
||||
IDirect3DVertexDeclaration9Impl *unsafe_impl_from_IDirect3DVertexDeclaration9(
|
||||
const D3DVERTEXELEMENT9 *elements, struct d3d9_vertex_declaration **declaration) DECLSPEC_HIDDEN;
|
||||
struct d3d9_vertex_declaration *unsafe_impl_from_IDirect3DVertexDeclaration9(
|
||||
IDirect3DVertexDeclaration9 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
/* ---------------------- */
|
||||
|
|
|
@ -2019,7 +2019,7 @@ static HRESULT WINAPI d3d9_device_ProcessVertices(IDirect3DDevice9Ex *iface,
|
|||
{
|
||||
struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
|
||||
struct d3d9_vertexbuffer *dst_impl = unsafe_impl_from_IDirect3DVertexBuffer9(dst_buffer);
|
||||
IDirect3DVertexDeclaration9Impl *decl_impl = unsafe_impl_from_IDirect3DVertexDeclaration9(declaration);
|
||||
struct d3d9_vertex_declaration *decl_impl = unsafe_impl_from_IDirect3DVertexDeclaration9(declaration);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, src_start_idx %u, dst_idx %u, vertex_count %u, dst_buffer %p, declaration %p, flags %#x.\n",
|
||||
|
@ -2027,7 +2027,7 @@ static HRESULT WINAPI d3d9_device_ProcessVertices(IDirect3DDevice9Ex *iface,
|
|||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_device_process_vertices(device->wined3d_device, src_start_idx, dst_idx, vertex_count,
|
||||
dst_impl->wined3d_buffer, decl_impl ? decl_impl->wineD3DVertexDeclaration : NULL,
|
||||
dst_impl->wined3d_buffer, decl_impl ? decl_impl->wined3d_declaration : NULL,
|
||||
flags, dst_impl->fvf);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
|
@ -2038,7 +2038,7 @@ static HRESULT WINAPI d3d9_device_CreateVertexDeclaration(IDirect3DDevice9Ex *if
|
|||
const D3DVERTEXELEMENT9 *elements, IDirect3DVertexDeclaration9 **declaration)
|
||||
{
|
||||
struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
|
||||
IDirect3DVertexDeclaration9Impl *object;
|
||||
struct d3d9_vertex_declaration *object;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, elements %p, declaration %p.\n", iface, elements, declaration);
|
||||
|
@ -2059,14 +2059,14 @@ static HRESULT WINAPI d3d9_device_SetVertexDeclaration(IDirect3DDevice9Ex *iface
|
|||
IDirect3DVertexDeclaration9 *declaration)
|
||||
{
|
||||
struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
|
||||
IDirect3DVertexDeclaration9Impl *decl_impl = unsafe_impl_from_IDirect3DVertexDeclaration9(declaration);
|
||||
struct d3d9_vertex_declaration *decl_impl = unsafe_impl_from_IDirect3DVertexDeclaration9(declaration);
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, declaration %p.\n", iface, declaration);
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_device_set_vertex_declaration(device->wined3d_device,
|
||||
decl_impl ? decl_impl->wineD3DVertexDeclaration : NULL);
|
||||
decl_impl ? decl_impl->wined3d_declaration : NULL);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
return hr;
|
||||
|
@ -2077,7 +2077,7 @@ static HRESULT WINAPI d3d9_device_GetVertexDeclaration(IDirect3DDevice9Ex *iface
|
|||
{
|
||||
struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
|
||||
struct wined3d_vertex_declaration *wined3d_declaration = NULL;
|
||||
IDirect3DVertexDeclaration9Impl *declaration_impl;
|
||||
struct d3d9_vertex_declaration *declaration_impl;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, declaration %p.\n", iface, declaration);
|
||||
|
@ -2107,7 +2107,7 @@ static struct wined3d_vertex_declaration *device_get_fvf_declaration(struct d3d9
|
|||
{
|
||||
struct wined3d_vertex_declaration *wined3d_declaration;
|
||||
struct fvf_declaration *fvf_decls = device->fvf_decls;
|
||||
IDirect3DVertexDeclaration9Impl *d3d9_declaration;
|
||||
struct d3d9_vertex_declaration *d3d9_declaration;
|
||||
D3DVERTEXELEMENT9 *elements;
|
||||
int p, low, high; /* deliberately signed */
|
||||
HRESULT hr;
|
||||
|
@ -2156,8 +2156,8 @@ static struct wined3d_vertex_declaration *device_get_fvf_declaration(struct d3d9
|
|||
device->fvf_decl_size += grow;
|
||||
}
|
||||
|
||||
d3d9_declaration->convFVF = fvf;
|
||||
wined3d_declaration = d3d9_declaration->wineD3DVertexDeclaration;
|
||||
d3d9_declaration->fvf = fvf;
|
||||
wined3d_declaration = d3d9_declaration->wined3d_declaration;
|
||||
wined3d_vertex_declaration_incref(wined3d_declaration);
|
||||
IDirect3DVertexDeclaration9_Release(&d3d9_declaration->IDirect3DVertexDeclaration9_iface);
|
||||
|
||||
|
@ -2205,7 +2205,7 @@ static HRESULT WINAPI d3d9_device_GetFVF(IDirect3DDevice9Ex *iface, DWORD *fvf)
|
|||
{
|
||||
struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
|
||||
struct wined3d_vertex_declaration *wined3d_declaration;
|
||||
IDirect3DVertexDeclaration9Impl *d3d9_declaration;
|
||||
struct d3d9_vertex_declaration *d3d9_declaration;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, fvf %p.\n", iface, fvf);
|
||||
|
@ -2222,7 +2222,7 @@ static HRESULT WINAPI d3d9_device_GetFVF(IDirect3DDevice9Ex *iface, DWORD *fvf)
|
|||
if (wined3d_declaration)
|
||||
{
|
||||
d3d9_declaration = wined3d_vertex_declaration_get_parent(wined3d_declaration);
|
||||
*fvf = d3d9_declaration->convFVF;
|
||||
*fvf = d3d9_declaration->fvf;
|
||||
wined3d_vertex_declaration_decref(wined3d_declaration);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -51,9 +51,9 @@ d3d_dtype_lookup[] =
|
|||
/* D3DDECLTYPE_FLOAT16_4 */ {WINED3DFMT_R16G16B16A16_FLOAT, 4, sizeof(short int)}
|
||||
};
|
||||
|
||||
static inline IDirect3DVertexDeclaration9Impl *impl_from_IDirect3DVertexDeclaration9(IDirect3DVertexDeclaration9 *iface)
|
||||
static inline struct d3d9_vertex_declaration *impl_from_IDirect3DVertexDeclaration9(IDirect3DVertexDeclaration9 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirect3DVertexDeclaration9Impl, IDirect3DVertexDeclaration9_iface);
|
||||
return CONTAINING_RECORD(iface, struct d3d9_vertex_declaration, IDirect3DVertexDeclaration9_iface);
|
||||
}
|
||||
|
||||
HRESULT vdecl_convert_fvf(
|
||||
|
@ -197,8 +197,7 @@ HRESULT vdecl_convert_fvf(
|
|||
return D3D_OK;
|
||||
}
|
||||
|
||||
/* IDirect3DVertexDeclaration9 IUnknown parts follow: */
|
||||
static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_QueryInterface(IDirect3DVertexDeclaration9 *iface,
|
||||
static HRESULT WINAPI d3d9_vertex_declaration_QueryInterface(IDirect3DVertexDeclaration9 *iface,
|
||||
REFIID riid, void **out)
|
||||
{
|
||||
TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
|
||||
|
@ -217,53 +216,52 @@ static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_QueryInterface(IDirect3DVe
|
|||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DVertexDeclaration9Impl_AddRef(IDirect3DVertexDeclaration9 *iface)
|
||||
static ULONG WINAPI d3d9_vertex_declaration_AddRef(IDirect3DVertexDeclaration9 *iface)
|
||||
{
|
||||
IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
|
||||
ULONG ref = InterlockedIncrement(&declaration->ref);
|
||||
struct d3d9_vertex_declaration *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
|
||||
ULONG refcount = InterlockedIncrement(&declaration->refcount);
|
||||
|
||||
TRACE("%p increasing refcount to %u.\n", iface, ref);
|
||||
TRACE("%p increasing refcount to %u.\n", iface, refcount);
|
||||
|
||||
if (ref == 1)
|
||||
if (refcount == 1)
|
||||
{
|
||||
IDirect3DDevice9Ex_AddRef(declaration->parentDevice);
|
||||
IDirect3DDevice9Ex_AddRef(declaration->parent_device);
|
||||
wined3d_mutex_lock();
|
||||
wined3d_vertex_declaration_incref(declaration->wineD3DVertexDeclaration);
|
||||
wined3d_vertex_declaration_incref(declaration->wined3d_declaration);
|
||||
wined3d_mutex_unlock();
|
||||
}
|
||||
|
||||
return ref;
|
||||
return refcount;
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(IDirect3DVertexDeclaration9 *iface)
|
||||
static ULONG WINAPI d3d9_vertex_declaration_Release(IDirect3DVertexDeclaration9 *iface)
|
||||
{
|
||||
IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
|
||||
ULONG ref = InterlockedDecrement(&declaration->ref);
|
||||
struct d3d9_vertex_declaration *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
|
||||
ULONG refcount = InterlockedDecrement(&declaration->refcount);
|
||||
|
||||
TRACE("%p decreasing refcount to %u.\n", iface, ref);
|
||||
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
|
||||
|
||||
if (!ref)
|
||||
if (!refcount)
|
||||
{
|
||||
IDirect3DDevice9Ex *parentDevice = declaration->parentDevice;
|
||||
IDirect3DDevice9Ex *parent_device = declaration->parent_device;
|
||||
wined3d_mutex_lock();
|
||||
wined3d_vertex_declaration_decref(declaration->wineD3DVertexDeclaration);
|
||||
wined3d_vertex_declaration_decref(declaration->wined3d_declaration);
|
||||
wined3d_mutex_unlock();
|
||||
|
||||
/* Release the device last, as it may cause the device to be destroyed. */
|
||||
IDirect3DDevice9Ex_Release(parentDevice);
|
||||
IDirect3DDevice9Ex_Release(parent_device);
|
||||
}
|
||||
return ref;
|
||||
|
||||
return refcount;
|
||||
}
|
||||
|
||||
/* IDirect3DVertexDeclaration9 Interface follow: */
|
||||
static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDevice(IDirect3DVertexDeclaration9 *iface,
|
||||
IDirect3DDevice9 **device)
|
||||
static HRESULT WINAPI d3d9_vertex_declaration_GetDevice(IDirect3DVertexDeclaration9 *iface, IDirect3DDevice9 **device)
|
||||
{
|
||||
IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
|
||||
struct d3d9_vertex_declaration *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
|
||||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
*device = (IDirect3DDevice9 *)declaration->parentDevice;
|
||||
*device = (IDirect3DDevice9 *)declaration->parent_device;
|
||||
IDirect3DDevice9_AddRef(*device);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
|
@ -271,10 +269,10 @@ static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDevice(IDirect3DVertexD
|
|||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDeclaration(IDirect3DVertexDeclaration9 *iface,
|
||||
static HRESULT WINAPI d3d9_vertex_declaration_GetDeclaration(IDirect3DVertexDeclaration9 *iface,
|
||||
D3DVERTEXELEMENT9 *elements, UINT *element_count)
|
||||
{
|
||||
IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
|
||||
struct d3d9_vertex_declaration *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
|
||||
|
||||
TRACE("iface %p, elements %p, element_count %p.\n", iface, elements, element_count);
|
||||
|
||||
|
@ -290,28 +288,28 @@ static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDeclaration(IDirect3DVe
|
|||
return D3D_OK;
|
||||
}
|
||||
|
||||
static const IDirect3DVertexDeclaration9Vtbl Direct3DVertexDeclaration9_Vtbl =
|
||||
static const struct IDirect3DVertexDeclaration9Vtbl d3d9_vertex_declaration_vtbl =
|
||||
{
|
||||
/* IUnknown */
|
||||
IDirect3DVertexDeclaration9Impl_QueryInterface,
|
||||
IDirect3DVertexDeclaration9Impl_AddRef,
|
||||
IDirect3DVertexDeclaration9Impl_Release,
|
||||
d3d9_vertex_declaration_QueryInterface,
|
||||
d3d9_vertex_declaration_AddRef,
|
||||
d3d9_vertex_declaration_Release,
|
||||
/* IDirect3DVertexDeclaration9 */
|
||||
IDirect3DVertexDeclaration9Impl_GetDevice,
|
||||
IDirect3DVertexDeclaration9Impl_GetDeclaration
|
||||
d3d9_vertex_declaration_GetDevice,
|
||||
d3d9_vertex_declaration_GetDeclaration,
|
||||
};
|
||||
|
||||
IDirect3DVertexDeclaration9Impl *unsafe_impl_from_IDirect3DVertexDeclaration9(IDirect3DVertexDeclaration9 *iface)
|
||||
struct d3d9_vertex_declaration *unsafe_impl_from_IDirect3DVertexDeclaration9(IDirect3DVertexDeclaration9 *iface)
|
||||
{
|
||||
if (!iface)
|
||||
return NULL;
|
||||
assert(iface->lpVtbl == &Direct3DVertexDeclaration9_Vtbl);
|
||||
return CONTAINING_RECORD(iface, IDirect3DVertexDeclaration9Impl, IDirect3DVertexDeclaration9_iface);
|
||||
assert(iface->lpVtbl == &d3d9_vertex_declaration_vtbl);
|
||||
return CONTAINING_RECORD(iface, struct d3d9_vertex_declaration, IDirect3DVertexDeclaration9_iface);
|
||||
}
|
||||
|
||||
static void STDMETHODCALLTYPE d3d9_vertexdeclaration_wined3d_object_destroyed(void *parent)
|
||||
{
|
||||
IDirect3DVertexDeclaration9Impl *declaration = parent;
|
||||
struct d3d9_vertex_declaration *declaration = parent;
|
||||
HeapFree(GetProcessHeap(), 0, declaration->elements);
|
||||
HeapFree(GetProcessHeap(), 0, declaration);
|
||||
}
|
||||
|
@ -366,7 +364,7 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9 *d3d9_elem
|
|||
return D3D_OK;
|
||||
}
|
||||
|
||||
static HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declaration,
|
||||
static HRESULT vertexdeclaration_init(struct d3d9_vertex_declaration *declaration,
|
||||
struct d3d9_device *device, const D3DVERTEXELEMENT9 *elements)
|
||||
{
|
||||
struct wined3d_vertex_element *wined3d_elements;
|
||||
|
@ -381,8 +379,8 @@ static HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declarati
|
|||
return hr;
|
||||
}
|
||||
|
||||
declaration->IDirect3DVertexDeclaration9_iface.lpVtbl = &Direct3DVertexDeclaration9_Vtbl;
|
||||
declaration->ref = 1;
|
||||
declaration->IDirect3DVertexDeclaration9_iface.lpVtbl = &d3d9_vertex_declaration_vtbl;
|
||||
declaration->refcount = 1;
|
||||
|
||||
element_count = wined3d_element_count + 1;
|
||||
declaration->elements = HeapAlloc(GetProcessHeap(), 0, element_count * sizeof(*declaration->elements));
|
||||
|
@ -397,7 +395,7 @@ static HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declarati
|
|||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_vertex_declaration_create(device->wined3d_device, wined3d_elements, wined3d_element_count,
|
||||
declaration, &d3d9_vertexdeclaration_wined3d_parent_ops, &declaration->wineD3DVertexDeclaration);
|
||||
declaration, &d3d9_vertexdeclaration_wined3d_parent_ops, &declaration->wined3d_declaration);
|
||||
wined3d_mutex_unlock();
|
||||
HeapFree(GetProcessHeap(), 0, wined3d_elements);
|
||||
if (FAILED(hr))
|
||||
|
@ -407,16 +405,16 @@ static HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declarati
|
|||
return hr;
|
||||
}
|
||||
|
||||
declaration->parentDevice = &device->IDirect3DDevice9Ex_iface;
|
||||
IDirect3DDevice9Ex_AddRef(declaration->parentDevice);
|
||||
declaration->parent_device = &device->IDirect3DDevice9Ex_iface;
|
||||
IDirect3DDevice9Ex_AddRef(declaration->parent_device);
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
HRESULT d3d9_vertex_declaration_create(struct d3d9_device *device,
|
||||
const D3DVERTEXELEMENT9 *elements, IDirect3DVertexDeclaration9Impl **declaration)
|
||||
const D3DVERTEXELEMENT9 *elements, struct d3d9_vertex_declaration **declaration)
|
||||
{
|
||||
IDirect3DVertexDeclaration9Impl *object;
|
||||
struct d3d9_vertex_declaration *object;
|
||||
HRESULT hr;
|
||||
|
||||
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
|
||||
|
|
Loading…
Reference in New Issue