[D3D 14] Beginning of VertexBuffer stubbing
Lionel Ulmer
lionel.ulmer at free.fr
Sat Nov 30 10:35:16 CST 2002
Fill out the needed functions for the VertexBuffer stubs to prevent the
application using them to crash.
Changelog:
- actually use the VertexBuffer stubs
- implement Lock function to prevent crash when the stubs are used
Lionel
--
Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- ../wine_work_base/dlls/ddraw/d3d_private.h Wed Nov 27 23:01:56 2002
+++ dlls/ddraw/d3d_private.h Sat Nov 30 17:15:22 2002
@@ -194,6 +194,9 @@
ICOM_VFIELD_MULTI(IDirect3DVertexBuffer);
DWORD ref;
IDirect3DImpl *d3d;
+ D3DVERTEXBUFFERDESC desc;
+ LPVOID *vertices;
+ DWORD vertex_buffer_size;
};
/* Various dump functions */
--- ../wine_work_base/dlls/ddraw/d3dvertexbuffer.c Thu Nov 21 22:04:16 2002
+++ dlls/ddraw/d3dvertexbuffer.c Sat Nov 30 17:18:34 2002
@@ -91,7 +91,16 @@
LPDWORD lpdwSize)
{
ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
- FIXME("(%p/%p)->(%08lx,%p,%p): stub!\n", This, iface, dwFlags, lplpData, lpdwSize);
+ TRACE("(%p/%p)->(%08lx,%p,%p)\n", This, iface, dwFlags, lplpData, lpdwSize);
+
+ if (TRACE_ON(ddraw)) {
+ TRACE(" lock flags : ");
+ DDRAW_dump_lockflag(dwFlags);
+ }
+
+ if (lpdwSize != NULL) *lpdwSize = This->vertex_buffer_size;
+ *lplpData = This->vertices;
+
return DD_OK;
}
@@ -279,22 +288,36 @@
#undef XCAST
#endif
-HRESULT d3dvertexbuffer_create(IDirect3DVertexBufferImpl **obj, IDirect3DImpl *d3d, LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc)
+HRESULT d3dvertexbuffer_create(IDirect3DVertexBufferImpl **obj, IDirect3DImpl *d3d, LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc, DWORD dwFlags)
{
IDirect3DVertexBufferImpl *object;
+ static const flag_info flags[] = {
+ FE(D3DVBCAPS_OPTIMIZED),
+ FE(D3DVBCAPS_SYSTEMMEMORY),
+ FE(D3DVBCAPS_WRITEONLY)
+ };
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVertexBufferImpl));
if (object == NULL) return DDERR_OUTOFMEMORY;
object->ref = 1;
object->d3d = d3d;
+ object->desc = *lpD3DVertBufDesc;
+ object->vertex_buffer_size = get_flexible_vertex_size(lpD3DVertBufDesc->dwFVF) * lpD3DVertBufDesc->dwNumVertices;
+ object->vertices = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->vertex_buffer_size);
ICOM_INIT_INTERFACE(object, IDirect3DVertexBuffer, VTABLE_IDirect3DVertexBuffer);
ICOM_INIT_INTERFACE(object, IDirect3DVertexBuffer7, VTABLE_IDirect3DVertexBuffer7);
*obj = object;
- TRACE(" creating implementation at %p.\n", *obj);
+ if (TRACE_ON(ddraw)) {
+ TRACE(" creating implementation at %p with description : \n", *obj);
+ TRACE(" - "); DDRAW_dump_flags_(lpD3DVertBufDesc->dwCaps, flags, sizeof(flags)/sizeof(flags[0]), TRUE);
+ TRACE(" - "); dump_flexible_vertex(lpD3DVertBufDesc->dwFVF);
+ TRACE(" - %ld\n", lpD3DVertBufDesc->dwNumVertices);
+ }
+
return D3D_OK;
}
--- ../wine_work_base/dlls/ddraw/helper.c Fri Nov 29 23:20:10 2002
+++ dlls/ddraw/helper.c Sat Nov 30 17:16:58 2002
@@ -315,7 +315,9 @@
FE(DDLOCK_EVENT),
FE(DDLOCK_READONLY),
FE(DDLOCK_WRITEONLY),
- FE(DDLOCK_NOSYSLOCK)
+ FE(DDLOCK_NOSYSLOCK),
+ FE(DDLOCK_DISCARDCONTENTS),
+ FE(DDLOCK_NOOVERWRITE)
};
DDRAW_dump_flags(lockflag, flags, sizeof(flags)/sizeof(flags[0]));
--- ../wine_work_base/dlls/ddraw/mesa_private.h Sat Nov 30 16:35:06 2002
+++ dlls/ddraw/mesa_private.h Sat Nov 30 17:08:38 2002
@@ -119,13 +119,17 @@
extern HRESULT d3dexecutebuffer_create(IDirect3DExecuteBufferImpl **obj, IDirect3DImpl *d3d, IDirect3DDeviceImpl *d3ddev, LPD3DEXECUTEBUFFERDESC lpDesc);
extern HRESULT d3dmaterial_create(IDirect3DMaterialImpl **obj, IDirect3DImpl *d3d);
extern HRESULT d3dviewport_create(IDirect3DViewportImpl **obj, IDirect3DImpl *d3d);
-extern HRESULT d3dvertexbuffer_create(IDirect3DVertexBufferImpl **obj, IDirect3DImpl *d3d, LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc);
+extern HRESULT d3dvertexbuffer_create(IDirect3DVertexBufferImpl **obj, IDirect3DImpl *d3d, LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc, DWORD dwFlags);
extern HRESULT d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surface);
/* Used for Direct3D to request the device to enumerate itself */
extern HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD interface_version) ;
extern HRESULT d3ddevice_enumerate7(LPD3DENUMDEVICESCALLBACK7 cb, LPVOID context) ;
extern HRESULT d3ddevice_find(IDirect3DImpl *d3d, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lplpD3DDevice, DWORD interface_version);
+
+/* Some helper functions.. Would need to put them in a better place */
+extern void dump_flexible_vertex(DWORD d3dvtVertexType);
+extern DWORD get_flexible_vertex_size(DWORD d3dvtVertexType);
/* Matrix copy WITH transposition */
#define conv_mat2(mat,gl_mat) \
--- ../wine_work_base/dlls/ddraw/d3ddevice/mesa.c Sat Nov 30 16:35:06 2002
+++ dlls/ddraw/d3ddevice/mesa.c Sat Nov 30 17:14:21 2002
@@ -241,7 +241,7 @@
d->dvMaxVertexW = 100000000.0; /* No idea exactly what to put here... */
d->deviceGUID = IID_IDirect3DTnLHalDevice;
d->wMaxUserClipPlanes = 1;
- d->wMaxVertexBlendMatrices = 1;
+ d->wMaxVertexBlendMatrices = 0;
d->dwVertexProcessingCaps = D3DVTXPCAPS_TEXGEN | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_VERTEXFOG | D3DVTXPCAPS_DIRECTIONALLIGHTS |
D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_LOCALVIEWER;
d->dwReserved1 = 0;
@@ -883,7 +883,24 @@
return ret_value;
}
-static void dump_flexible_vertex(DWORD d3dvtVertexType)
+DWORD get_flexible_vertex_size(DWORD d3dvtVertexType)
+{
+ DWORD size = 0;
+
+ if (d3dvtVertexType & D3DFVF_NORMAL) size += 3 * sizeof(D3DVALUE);
+ if (d3dvtVertexType & D3DFVF_DIFFUSE) size += sizeof(DWORD);
+ if (d3dvtVertexType & D3DFVF_SPECULAR) size += sizeof(DWORD);
+ switch (d3dvtVertexType & D3DFVF_POSITION_MASK) {
+ case D3DFVF_XYZ: size += 3 * sizeof(D3DVALUE); break;
+ case D3DFVF_XYZRHW: size += 4 * sizeof(D3DVALUE); break;
+ default: TRACE(" matrix weighting not handled yet...\n");
+ }
+ size += 2 * sizeof(D3DVALUE) * ((d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT);
+
+ return size;
+}
+
+void dump_flexible_vertex(DWORD d3dvtVertexType)
{
static const flag_info flags[] = {
FE(D3DFVF_NORMAL),
--- ../wine_work_base/dlls/ddraw/direct3d/mesa.c Sat Nov 30 16:35:06 2002
+++ dlls/ddraw/direct3d/mesa.c Sat Nov 30 16:55:01 2002
@@ -320,6 +320,25 @@
return create_device_helper(This, rclsid, ddsurfaceimpl, (void **) lplpD3DDevice, 7);
}
+HRESULT WINAPI
+GL_IDirect3DImpl_7_3T_CreateVertexBuffer(LPDIRECT3D7 iface,
+ LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
+ LPDIRECT3DVERTEXBUFFER7* lplpD3DVertBuf,
+ DWORD dwFlags)
+{
+ ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
+ IDirect3DVertexBufferImpl *vbimpl;
+ HRESULT res;
+
+ TRACE("(%p/%p)->(%p,%p,%08lx)\n", This, iface, lpD3DVertBufDesc, lplpD3DVertBuf, dwFlags);
+
+ res = d3dvertexbuffer_create(&vbimpl, This, lpD3DVertBufDesc, dwFlags);
+
+ *lplpD3DVertBuf = ICOM_INTERFACE(vbimpl, IDirect3DVertexBuffer7);
+
+ return res;
+}
+
static void light_released(IDirect3DImpl *This, GLenum light_num)
{
IDirect3DGLImpl *glThis = (IDirect3DGLImpl *) This;
@@ -340,7 +359,7 @@
XCAST(Release) Main_IDirect3DImpl_7_3T_2T_1T_Release,
XCAST(EnumDevices) GL_IDirect3DImpl_7_EnumDevices,
XCAST(CreateDevice) GL_IDirect3DImpl_7_CreateDevice,
- XCAST(CreateVertexBuffer) Main_IDirect3DImpl_7_3T_CreateVertexBuffer,
+ XCAST(CreateVertexBuffer) GL_IDirect3DImpl_7_3T_CreateVertexBuffer,
XCAST(EnumZBufferFormats) GL_IDirect3DImpl_7_3T_EnumZBufferFormats,
XCAST(EvictManagedTextures) Main_IDirect3DImpl_7_3T_EvictManagedTextures,
};
--- ../wine_work_base/include/ddraw.h Wed Nov 27 23:01:58 2002
+++ include/ddraw.h Sat Nov 30 17:20:31 2002
@@ -1319,6 +1315,8 @@
#define DDLOCK_READONLY 0x00000010
#define DDLOCK_WRITEONLY 0x00000020
#define DDLOCK_NOSYSLOCK 0x00000800
+#define DDLOCK_NOOVERWRITE 0x00001000
+#define DDLOCK_DISCARDCONTENTS 0x00002000
/*****************************************************************************
More information about the wine-patches
mailing list