Commit 949f7b45 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

d3d9: COM cleanup for the IDirect3DVertexDeclaration9 interface.

parent 81ed6e0c
......@@ -19,7 +19,6 @@
*/
#include "config.h"
#include <assert.h>
#include "d3d9_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
......
......@@ -23,6 +23,7 @@
#ifndef __WINE_D3D9_PRIVATE_H
#define __WINE_D3D9_PRIVATE_H
#include <assert.h>
#include <stdarg.h>
#define NONAMELESSUNION
......@@ -386,7 +387,7 @@ HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Im
*/
typedef struct IDirect3DVertexDeclaration9Impl {
/* IUnknown fields */
const IDirect3DVertexDeclaration9Vtbl *lpVtbl;
IDirect3DVertexDeclaration9 IDirect3DVertexDeclaration9_iface;
LONG ref;
D3DVERTEXELEMENT9 *elements;
......@@ -402,6 +403,8 @@ typedef struct IDirect3DVertexDeclaration9Impl {
HRESULT d3d9_vertex_declaration_create(IDirect3DDevice9Impl *device,
const D3DVERTEXELEMENT9 *elements, IDirect3DVertexDeclaration9Impl **declaration) DECLSPEC_HIDDEN;
IDirect3DVertexDeclaration9Impl *unsafe_impl_from_IDirect3DVertexDeclaration9(
IDirect3DVertexDeclaration9 *iface) DECLSPEC_HIDDEN;
/* ---------------------- */
/* IDirect3DVertexShader9 */
......
......@@ -2058,7 +2058,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ProcessVertices(IDirect3DDevice9Ex *i
{
IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface);
IDirect3DVertexBuffer9Impl *dest = unsafe_impl_from_IDirect3DVertexBuffer9(pDestBuffer);
IDirect3DVertexDeclaration9Impl *Decl = (IDirect3DVertexDeclaration9Impl *) pVertexDecl;
IDirect3DVertexDeclaration9Impl *Decl = unsafe_impl_from_IDirect3DVertexDeclaration9(pVertexDecl);
HRESULT hr;
TRACE("iface %p, src_start_idx %u, dst_idx %u, vertex_count %u, dst_buffer %p, declaration %p, flags %#x.\n",
......@@ -2088,7 +2088,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(IDirect3DDevi
}
if (SUCCEEDED(hr = d3d9_vertex_declaration_create(device, elements, &object)))
*declaration = (IDirect3DVertexDeclaration9 *)object;
*declaration = &object->IDirect3DVertexDeclaration9_iface;
return hr;
}
......@@ -2097,13 +2097,14 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(IDirect3DDevice9
IDirect3DVertexDeclaration9 *declaration)
{
IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface);
IDirect3DVertexDeclaration9Impl *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(This->wined3d_device,
declaration ? ((IDirect3DVertexDeclaration9Impl *)declaration)->wineD3DVertexDeclaration : NULL);
decl_impl ? decl_impl->wineD3DVertexDeclaration : NULL);
wined3d_mutex_unlock();
return hr;
......@@ -2184,7 +2185,7 @@ static struct wined3d_vertex_declaration *device_get_fvf_declaration(IDirect3DDe
fvf_decls = HeapReAlloc(GetProcessHeap(), 0, fvf_decls, sizeof(*fvf_decls) * (device->fvf_decl_size + grow));
if (!fvf_decls)
{
IDirect3DVertexDeclaration9_Release((IDirect3DVertexDeclaration9 *)d3d9_declaration);
IDirect3DVertexDeclaration9_Release(&d3d9_declaration->IDirect3DVertexDeclaration9_iface);
return NULL;
}
device->fvf_decls = fvf_decls;
......@@ -2194,7 +2195,7 @@ static struct wined3d_vertex_declaration *device_get_fvf_declaration(IDirect3DDe
d3d9_declaration->convFVF = fvf;
wined3d_declaration = d3d9_declaration->wineD3DVertexDeclaration;
wined3d_vertex_declaration_incref(wined3d_declaration);
IDirect3DVertexDeclaration9_Release((IDirect3DVertexDeclaration9 *)d3d9_declaration);
IDirect3DVertexDeclaration9_Release(&d3d9_declaration->IDirect3DVertexDeclaration9_iface);
memmove(fvf_decls + low + 1, fvf_decls + low, sizeof(*fvf_decls) * (device->fvf_decl_count - low));
fvf_decls[low].decl = wined3d_declaration;
......
......@@ -18,7 +18,6 @@
*/
#include "config.h"
#include <assert.h>
#include "d3d9_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
......
......@@ -20,7 +20,6 @@
*/
#include "config.h"
#include <assert.h>
#include "d3d9_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
......
......@@ -53,6 +53,11 @@ static D3DDECLTYPE_INFO const d3d_dtype_lookup[D3DDECLTYPE_UNUSED] = {
#define D3D_DECL_SIZE(type) d3d_dtype_lookup[type].size
#define D3D_DECL_TYPESIZE(type) d3d_dtype_lookup[type].typesize
static inline IDirect3DVertexDeclaration9Impl *impl_from_IDirect3DVertexDeclaration9(IDirect3DVertexDeclaration9 *iface)
{
return CONTAINING_RECORD(iface, IDirect3DVertexDeclaration9Impl, IDirect3DVertexDeclaration9_iface);
}
HRESULT vdecl_convert_fvf(
DWORD fvf,
D3DVERTEXELEMENT9** ppVertexElements) {
......@@ -213,34 +218,36 @@ static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_QueryInterface(IDirect3DVe
return E_NOINTERFACE;
}
static ULONG WINAPI IDirect3DVertexDeclaration9Impl_AddRef(LPDIRECT3DVERTEXDECLARATION9 iface) {
IDirect3DVertexDeclaration9Impl *This = (IDirect3DVertexDeclaration9Impl *)iface;
ULONG ref = InterlockedIncrement(&This->ref);
static ULONG WINAPI IDirect3DVertexDeclaration9Impl_AddRef(IDirect3DVertexDeclaration9 *iface)
{
IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
ULONG ref = InterlockedIncrement(&declaration->ref);
TRACE("%p increasing refcount to %u.\n", iface, ref);
if (ref == 1)
{
IDirect3DDevice9Ex_AddRef(This->parentDevice);
IDirect3DDevice9Ex_AddRef(declaration->parentDevice);
wined3d_mutex_lock();
wined3d_vertex_declaration_incref(This->wineD3DVertexDeclaration);
wined3d_vertex_declaration_incref(declaration->wineD3DVertexDeclaration);
wined3d_mutex_unlock();
}
return ref;
}
static ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(LPDIRECT3DVERTEXDECLARATION9 iface) {
IDirect3DVertexDeclaration9Impl *This = (IDirect3DVertexDeclaration9Impl *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
static ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(IDirect3DVertexDeclaration9 *iface)
{
IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
ULONG ref = InterlockedDecrement(&declaration->ref);
TRACE("%p decreasing refcount to %u.\n", iface, ref);
if (!ref)
{
IDirect3DDevice9Ex *parentDevice = This->parentDevice;
IDirect3DDevice9Ex *parentDevice = declaration->parentDevice;
wined3d_mutex_lock();
wined3d_vertex_declaration_decref(This->wineD3DVertexDeclaration);
wined3d_vertex_declaration_decref(declaration->wineD3DVertexDeclaration);
wined3d_mutex_unlock();
/* Release the device last, as it may cause the device to be destroyed. */
......@@ -253,11 +260,11 @@ static ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(LPDIRECT3DVERTEXDECL
static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDevice(IDirect3DVertexDeclaration9 *iface,
IDirect3DDevice9 **device)
{
IDirect3DVertexDeclaration9Impl *This = (IDirect3DVertexDeclaration9Impl *)iface;
IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
TRACE("iface %p, device %p.\n", iface, device);
*device = (IDirect3DDevice9 *)This->parentDevice;
*device = (IDirect3DDevice9 *)declaration->parentDevice;
IDirect3DDevice9_AddRef(*device);
TRACE("Returning device %p.\n", *device);
......@@ -265,21 +272,21 @@ static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDevice(IDirect3DVertexD
return D3D_OK;
}
static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDeclaration(LPDIRECT3DVERTEXDECLARATION9 iface, D3DVERTEXELEMENT9* pDecl, UINT* pNumElements) {
IDirect3DVertexDeclaration9Impl *This = (IDirect3DVertexDeclaration9Impl *)iface;
static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDeclaration(IDirect3DVertexDeclaration9 *iface,
D3DVERTEXELEMENT9 *elements, UINT *element_count)
{
IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
TRACE("iface %p, elements %p, element_count %p.\n", iface, pDecl, pNumElements);
TRACE("iface %p, elements %p, element_count %p.\n", iface, elements, element_count);
*pNumElements = This->element_count;
*element_count = declaration->element_count;
/* Passing a NULL pDecl is used to just retrieve the number of elements */
if (!pDecl) {
TRACE("NULL pDecl passed. Returning D3D_OK.\n");
/* Passing a NULL elements is used to just retrieve the number of elements */
if (!elements)
return D3D_OK;
}
TRACE("Copying %p to %p\n", This->elements, pDecl);
CopyMemory(pDecl, This->elements, This->element_count * sizeof(D3DVERTEXELEMENT9));
TRACE("Copying %p to %p.\n", declaration->elements, elements);
memcpy(elements, declaration->elements, sizeof(*declaration->elements) * declaration->element_count);
return D3D_OK;
}
......@@ -295,6 +302,14 @@ static const IDirect3DVertexDeclaration9Vtbl Direct3DVertexDeclaration9_Vtbl =
IDirect3DVertexDeclaration9Impl_GetDeclaration
};
IDirect3DVertexDeclaration9Impl *unsafe_impl_from_IDirect3DVertexDeclaration9(IDirect3DVertexDeclaration9 *iface)
{
if (!iface)
return NULL;
assert(iface->lpVtbl == &Direct3DVertexDeclaration9_Vtbl);
return CONTAINING_RECORD(iface, IDirect3DVertexDeclaration9Impl, IDirect3DVertexDeclaration9_iface);
}
static void STDMETHODCALLTYPE d3d9_vertexdeclaration_wined3d_object_destroyed(void *parent)
{
IDirect3DVertexDeclaration9Impl *declaration = parent;
......@@ -367,7 +382,7 @@ static HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declarati
return hr;
}
declaration->lpVtbl = &Direct3DVertexDeclaration9_Vtbl;
declaration->IDirect3DVertexDeclaration9_iface.lpVtbl = &Direct3DVertexDeclaration9_Vtbl;
declaration->ref = 1;
element_count = wined3d_element_count + 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment