2 * Copyright (c) 2002 Lionel ULMER
4 * This file contains the implementation of Direct3DVertexBuffer COM object
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "wine/debug.h"
29 #include "d3d_private.h"
30 #include "mesa_private.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(ddraw
);
35 Main_IDirect3DVertexBufferImpl_7_1T_QueryInterface(LPDIRECT3DVERTEXBUFFER7 iface
,
39 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer7
, iface
);
40 TRACE("(%p/%p)->(%s,%p)\n", This
, iface
, debugstr_guid(riid
), obp
);
42 /* By default, set the object pointer to NULL */
45 if ( IsEqualGUID( &IID_IUnknown
, riid
) ) {
46 IDirect3DVertexBuffer7_AddRef(ICOM_INTERFACE(This
,IDirect3DVertexBuffer7
));
48 TRACE(" Creating IUnknown interface at %p.\n", *obp
);
51 if ( IsEqualGUID( &IID_IDirect3DVertexBuffer
, riid
) ) {
52 IDirect3DVertexBuffer7_AddRef(ICOM_INTERFACE(This
,IDirect3DVertexBuffer7
));
53 *obp
= ICOM_INTERFACE(This
, IDirect3DVertexBuffer
);
54 TRACE(" Creating IDirect3DVertexBuffer interface %p\n", *obp
);
57 if ( IsEqualGUID( &IID_IDirect3DVertexBuffer7
, riid
) ) {
58 IDirect3DVertexBuffer7_AddRef(ICOM_INTERFACE(This
,IDirect3DVertexBuffer7
));
59 *obp
= ICOM_INTERFACE(This
, IDirect3DVertexBuffer7
);
60 TRACE(" Creating IDirect3DVertexBuffer7 interface %p\n", *obp
);
63 FIXME("(%p): interface for IID %s NOT found!\n", This
, debugstr_guid(riid
));
64 return OLE_E_ENUM_NOMORE
;
68 Main_IDirect3DVertexBufferImpl_7_1T_AddRef(LPDIRECT3DVERTEXBUFFER7 iface
)
70 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer7
, iface
);
71 TRACE("(%p/%p)->() incrementing from %lu.\n", This
, iface
, This
->ref
);
76 Main_IDirect3DVertexBufferImpl_7_1T_Release(LPDIRECT3DVERTEXBUFFER7 iface
)
78 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer7
, iface
);
79 TRACE("(%p/%p)->() decrementing from %lu.\n", This
, iface
, This
->ref
);
80 if (--(This
->ref
) == 0) {
81 HeapFree(GetProcessHeap(), 0, This
);
88 Main_IDirect3DVertexBufferImpl_7_1T_Lock(LPDIRECT3DVERTEXBUFFER7 iface
,
93 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer7
, iface
);
94 TRACE("(%p/%p)->(%08lx,%p,%p)\n", This
, iface
, dwFlags
, lplpData
, lpdwSize
);
96 if (TRACE_ON(ddraw
)) {
97 TRACE(" lock flags : ");
98 DDRAW_dump_lockflag(dwFlags
);
101 if (lpdwSize
!= NULL
) *lpdwSize
= This
->vertex_buffer_size
;
102 *lplpData
= This
->vertices
;
108 Main_IDirect3DVertexBufferImpl_7_1T_Unlock(LPDIRECT3DVERTEXBUFFER7 iface
)
110 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer7
, iface
);
111 FIXME("(%p/%p)->(): stub!\n", This
, iface
);
116 Main_IDirect3DVertexBufferImpl_7_ProcessVertices(LPDIRECT3DVERTEXBUFFER7 iface
,
120 LPDIRECT3DVERTEXBUFFER7 lpSrcBuffer
,
122 LPDIRECT3DDEVICE7 lpD3DDevice
,
125 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer7
, iface
);
126 FIXME("(%p/%p)->(%08lx,%08lx,%08lx,%p,%08lx,%p,%08lx): stub!\n", This
, iface
, dwVertexOp
, dwDestIndex
, dwCount
, lpSrcBuffer
, dwSrcIndex
, lpD3DDevice
, dwFlags
);
131 Main_IDirect3DVertexBufferImpl_7_1T_GetVertexBufferDesc(LPDIRECT3DVERTEXBUFFER7 iface
,
132 LPD3DVERTEXBUFFERDESC lpD3DVertexBufferDesc
)
134 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer7
, iface
);
135 FIXME("(%p/%p)->(%p): stub!\n", This
, iface
, lpD3DVertexBufferDesc
);
140 Main_IDirect3DVertexBufferImpl_7_Optimize(LPDIRECT3DVERTEXBUFFER7 iface
,
141 LPDIRECT3DDEVICE7 lpD3DDevice
,
144 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer7
, iface
);
145 FIXME("(%p/%p)->(%p,%08lx): stub!\n", This
, iface
, lpD3DDevice
, dwFlags
);
150 Main_IDirect3DVertexBufferImpl_7_ProcessVerticesStrided(LPDIRECT3DVERTEXBUFFER7 iface
,
154 LPD3DDRAWPRIMITIVESTRIDEDDATA lpStrideData
,
155 DWORD dwVertexTypeDesc
,
156 LPDIRECT3DDEVICE7 lpD3DDevice
,
159 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer7
, iface
);
160 FIXME("(%p/%p)->(%08lx,%08lx,%08lx,%p,%08lx,%p,%08lx): stub!\n", This
, iface
, dwVertexOp
, dwDestIndex
, dwCount
, lpStrideData
, dwVertexTypeDesc
, lpD3DDevice
, dwFlags
);
165 Main_IDirect3DVertexBufferImpl_1_ProcessVertices(LPDIRECT3DVERTEXBUFFER iface
,
169 LPDIRECT3DVERTEXBUFFER lpSrcBuffer
,
171 LPDIRECT3DDEVICE3 lpD3DDevice
,
174 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer
, iface
);
175 FIXME("(%p/%p)->(%08lx,%08lx,%08lx,%p,%08lx,%p,%08lx): stub!\n", This
, iface
, dwVertexOp
, dwDestIndex
, dwCount
, lpSrcBuffer
, dwSrcIndex
, lpD3DDevice
, dwFlags
);
180 Main_IDirect3DVertexBufferImpl_1_Optimize(LPDIRECT3DVERTEXBUFFER iface
,
181 LPDIRECT3DDEVICE3 lpD3DDevice
,
184 ICOM_THIS_FROM(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer
, iface
);
185 FIXME("(%p/%p)->(%p,%08lx): stub!\n", This
, iface
, lpD3DDevice
, dwFlags
);
190 Thunk_IDirect3DVertexBufferImpl_1_QueryInterface(LPDIRECT3DVERTEXBUFFER iface
,
194 TRACE("(%p)->(%s,%p) thunking to IDirect3DVertexBuffer7 interface.\n", iface
, debugstr_guid(riid
), obp
);
195 return IDirect3DVertexBuffer7_QueryInterface(COM_INTERFACE_CAST(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer
, IDirect3DVertexBuffer7
, iface
),
201 Thunk_IDirect3DVertexBufferImpl_1_AddRef(LPDIRECT3DVERTEXBUFFER iface
)
203 TRACE("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", iface
);
204 return IDirect3DVertexBuffer7_AddRef(COM_INTERFACE_CAST(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer
, IDirect3DVertexBuffer7
, iface
));
208 Thunk_IDirect3DVertexBufferImpl_1_Release(LPDIRECT3DVERTEXBUFFER iface
)
210 TRACE("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", iface
);
211 return IDirect3DVertexBuffer7_Release(COM_INTERFACE_CAST(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer
, IDirect3DVertexBuffer7
, iface
));
215 Thunk_IDirect3DVertexBufferImpl_1_Lock(LPDIRECT3DVERTEXBUFFER iface
,
220 TRACE("(%p)->(%08lx,%p,%p) thunking to IDirect3DVertexBuffer7 interface.\n", iface
, dwFlags
, lplpData
, lpdwSize
);
221 return IDirect3DVertexBuffer7_Lock(COM_INTERFACE_CAST(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer
, IDirect3DVertexBuffer7
, iface
),
228 Thunk_IDirect3DVertexBufferImpl_1_Unlock(LPDIRECT3DVERTEXBUFFER iface
)
230 TRACE("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", iface
);
231 return IDirect3DVertexBuffer7_Unlock(COM_INTERFACE_CAST(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer
, IDirect3DVertexBuffer7
, iface
));
235 Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc(LPDIRECT3DVERTEXBUFFER iface
,
236 LPD3DVERTEXBUFFERDESC lpD3DVertexBufferDesc
)
238 TRACE("(%p)->(%p) thunking to IDirect3DVertexBuffer7 interface.\n", iface
, lpD3DVertexBufferDesc
);
239 return IDirect3DVertexBuffer7_GetVertexBufferDesc(COM_INTERFACE_CAST(IDirect3DVertexBufferImpl
, IDirect3DVertexBuffer
, IDirect3DVertexBuffer7
, iface
),
240 lpD3DVertexBufferDesc
);
243 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
244 # define XCAST(fun) (typeof(VTABLE_IDirect3DVertexBuffer7.fun))
246 # define XCAST(fun) (void*)
249 ICOM_VTABLE(IDirect3DVertexBuffer7
) VTABLE_IDirect3DVertexBuffer7
=
251 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
252 XCAST(QueryInterface
) Main_IDirect3DVertexBufferImpl_7_1T_QueryInterface
,
253 XCAST(AddRef
) Main_IDirect3DVertexBufferImpl_7_1T_AddRef
,
254 XCAST(Release
) Main_IDirect3DVertexBufferImpl_7_1T_Release
,
255 XCAST(Lock
) Main_IDirect3DVertexBufferImpl_7_1T_Lock
,
256 XCAST(Unlock
) Main_IDirect3DVertexBufferImpl_7_1T_Unlock
,
257 XCAST(ProcessVertices
) Main_IDirect3DVertexBufferImpl_7_ProcessVertices
,
258 XCAST(GetVertexBufferDesc
) Main_IDirect3DVertexBufferImpl_7_1T_GetVertexBufferDesc
,
259 XCAST(Optimize
) Main_IDirect3DVertexBufferImpl_7_Optimize
,
260 XCAST(ProcessVerticesStrided
) Main_IDirect3DVertexBufferImpl_7_ProcessVerticesStrided
,
263 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
268 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
269 # define XCAST(fun) (typeof(VTABLE_IDirect3DVertexBuffer.fun))
271 # define XCAST(fun) (void*)
274 ICOM_VTABLE(IDirect3DVertexBuffer
) VTABLE_IDirect3DVertexBuffer
=
276 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
277 XCAST(QueryInterface
) Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc
,
278 XCAST(AddRef
) Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc
,
279 XCAST(Release
) Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc
,
280 XCAST(Lock
) Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc
,
281 XCAST(Unlock
) Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc
,
282 XCAST(ProcessVertices
) Main_IDirect3DVertexBufferImpl_1_ProcessVertices
,
283 XCAST(GetVertexBufferDesc
) Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc
,
284 XCAST(Optimize
) Main_IDirect3DVertexBufferImpl_1_Optimize
,
287 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
291 HRESULT
d3dvertexbuffer_create(IDirect3DVertexBufferImpl
**obj
, IDirect3DImpl
*d3d
, LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc
, DWORD dwFlags
)
293 IDirect3DVertexBufferImpl
*object
;
294 static const flag_info flags
[] = {
295 FE(D3DVBCAPS_OPTIMIZED
),
296 FE(D3DVBCAPS_SYSTEMMEMORY
),
297 FE(D3DVBCAPS_WRITEONLY
)
300 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirect3DVertexBufferImpl
));
301 if (object
== NULL
) return DDERR_OUTOFMEMORY
;
305 object
->desc
= *lpD3DVertBufDesc
;
306 object
->vertex_buffer_size
= get_flexible_vertex_size(lpD3DVertBufDesc
->dwFVF
) * lpD3DVertBufDesc
->dwNumVertices
;
307 object
->vertices
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, object
->vertex_buffer_size
);
309 ICOM_INIT_INTERFACE(object
, IDirect3DVertexBuffer
, VTABLE_IDirect3DVertexBuffer
);
310 ICOM_INIT_INTERFACE(object
, IDirect3DVertexBuffer7
, VTABLE_IDirect3DVertexBuffer7
);
314 if (TRACE_ON(ddraw
)) {
315 TRACE(" creating implementation at %p with description : \n", *obj
);
316 TRACE(" - "); DDRAW_dump_flags_(lpD3DVertBufDesc
->dwCaps
, flags
, sizeof(flags
)/sizeof(flags
[0]), TRUE
);
317 TRACE(" - "); dump_flexible_vertex(lpD3DVertBufDesc
->dwFVF
);
318 TRACE(" - %ld\n", lpD3DVertBufDesc
->dwNumVertices
);