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