diff --git a/dlls/ddraw/d3d_private.h b/dlls/ddraw/d3d_private.h index d4b103cca22..340c92515ac 100644 --- a/dlls/ddraw/d3d_private.h +++ b/dlls/ddraw/d3d_private.h @@ -194,6 +194,9 @@ struct IDirect3DVertexBufferImpl ICOM_VFIELD_MULTI(IDirect3DVertexBuffer); DWORD ref; IDirect3DImpl *d3d; + D3DVERTEXBUFFERDESC desc; + LPVOID *vertices; + DWORD vertex_buffer_size; }; /* Various dump functions */ diff --git a/dlls/ddraw/d3ddevice/mesa.c b/dlls/ddraw/d3ddevice/mesa.c index 23bf49c7497..0d5b95c334e 100644 --- a/dlls/ddraw/d3ddevice/mesa.c +++ b/dlls/ddraw/d3ddevice/mesa.c @@ -241,7 +241,7 @@ static void fill_opengl_caps_7(D3DDEVICEDESC7 *d) 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 @@ GL_IDirect3DDeviceImpl_1_CreateExecuteBuffer(LPDIRECT3DDEVICE iface, 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), diff --git a/dlls/ddraw/d3dvertexbuffer.c b/dlls/ddraw/d3dvertexbuffer.c index 18ec3f706b2..c64b0d97aab 100644 --- a/dlls/ddraw/d3dvertexbuffer.c +++ b/dlls/ddraw/d3dvertexbuffer.c @@ -91,7 +91,16 @@ Main_IDirect3DVertexBufferImpl_7_1T_Lock(LPDIRECT3DVERTEXBUFFER7 iface, 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 @@ ICOM_VTABLE(IDirect3DVertexBuffer) VTABLE_IDirect3DVertexBuffer = #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; } diff --git a/dlls/ddraw/direct3d/mesa.c b/dlls/ddraw/direct3d/mesa.c index 2e4ff3c1698..0ce10556447 100644 --- a/dlls/ddraw/direct3d/mesa.c +++ b/dlls/ddraw/direct3d/mesa.c @@ -320,6 +320,25 @@ GL_IDirect3DImpl_7_CreateDevice(LPDIRECT3D7 iface, 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 @@ ICOM_VTABLE(IDirect3D7) VTABLE_IDirect3D7 = 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, }; diff --git a/dlls/ddraw/helper.c b/dlls/ddraw/helper.c index 3f305fd35c1..53953a2f90b 100644 --- a/dlls/ddraw/helper.c +++ b/dlls/ddraw/helper.c @@ -315,7 +315,9 @@ void DDRAW_dump_lockflag(DWORD lockflag) 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])); diff --git a/dlls/ddraw/mesa_private.h b/dlls/ddraw/mesa_private.h index 884f602b58c..5fde8d397b1 100644 --- a/dlls/ddraw/mesa_private.h +++ b/dlls/ddraw/mesa_private.h @@ -119,7 +119,7 @@ extern HRESULT d3dlight_create(IDirect3DLightImpl **obj, IDirect3DImpl *d3d, GLe 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 */ @@ -127,6 +127,10 @@ extern HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, 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) \ { \ diff --git a/include/ddraw.h b/include/ddraw.h index 845ea49be13..8fdd0a922d2 100644 --- a/include/ddraw.h +++ b/include/ddraw.h @@ -1319,6 +1319,8 @@ ICOM_DEFINE(IDirectDraw,IUnknown) #define DDLOCK_READONLY 0x00000010 #define DDLOCK_WRITEONLY 0x00000020 #define DDLOCK_NOSYSLOCK 0x00000800 +#define DDLOCK_NOOVERWRITE 0x00001000 +#define DDLOCK_DISCARDCONTENTS 0x00002000 /*****************************************************************************