[6/13]D3D: Index buffer fixes
Mirek
thunder.m at czela.net
Tue Feb 20 17:22:13 CST 2007
Some games are still broken with latest 13 patches from your tree.
Oblivion still hangs while loading game and Flatout 2 crashed after 2
seconds with this output:
athlon64:/usr/games/flatout2# ./flatout2
fixme:d3d:IWineD3DDeviceImpl_CreateAdditionalSwapChain The app requests
more than one back buffer, this can't be supported properly. Please
configure the application to use double buffering(=1 back buffer) if
possible
fixme:d3d:IWineD3DDeviceImpl_GetAvailableTextureMem (0x17fe20) : stub,
simulating 256MB for now, returning 256MB left
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
fixme:d3d:IWineD3DDeviceImpl_ValidateDevice (0x17fe20) : stub
err:ole:CoInitializeEx Attempt to change threading model of this
apartment from multi-threaded to apartment threaded
fixme:wave:DBSB_MMAPLoop Can't access sound driver's buffer directly.
err:ole:CoInitializeEx Attempt to change threading model of this
apartment from multi-threaded to apartment threaded
fixme:win:WIN_CreateWindowEx Parent is HWND_MESSAGE
wine: Unhandled page fault on read access to 0x7c3a4270 at address
0x7c3a4270 (thread 0011), starting debugger...
Unhandled exception: page fault on read access to 0x7c3a4270 in 32-bit
code (0x7c3a4270).
fixme:d3d:IWineD3DDeviceImpl_EvictManagedResources (0x17fe20) : stub
Register dump:
CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:003b
EIP:7c3a4270 ESP:7b8cea60 EBP:7b8ceab8 EFLAGS:00210246( - 00
-RIZP1)
EAX:00000000 EBX:7c3be764 ECX:00000000 EDX:7b8cea90
ESI:7b8cea90 EDI:00010028
Stack dump:
0x7b8cea60: 00000000 00000000 00000000 00000000
0x7b8cea70: fffffffd 00000000 00000000 00000000
0x7b8cea80: 00000001 7ffd2000 00000018 7ef935ef
0x7b8cea90: 00000000 00000012 00000000 00000000
0x7b8ceaa0: 00002357 00000000 00000000 7efe5368
0x7b8ceab0: 0173fc34 7c3a41b0 7b8ceb58 7efc81bb
Backtrace:
=>1 0x7c3a4270 (0x7b8ceab8)
2 0x7efc81bb call_thread_func+0x3b(rtl_func=<register EDI not in
topmost frame>, arg=<register ESI not in topmost frame>)
[/root/.WineCVS/sources/cvswine/wine/dlls/ntdll/thread.c:371] in ntdll
(0x7b8ceb58)
3 0x7efc8461 in ntdll (+0x48461) (0x7b8cf458)
err:dbghelp:elf_load_debug_info_from_map Bad CRC for module (got
aa34a405 while expecting ef5281d2)
4 0xb7df10bd start_thread+0x6d() in libpthread.so.0 (0x7b8cf4c8)
err:dbghelp:elf_load_debug_info_from_map Bad CRC for module (got
61a1649a while expecting f01d3064)
5 0xb7d859ee __clone+0x5e() in libc.so.6 (0x00000000)
0x7c3a4270: -- no code accessible --
Modules:
Module Address Debug info Name (83 modules)
PE 400000-152e000 Deferred flatout2
PE 1740000-19a0000 Deferred d3dx9_30
ELF 7bf00000-7bf03000 Deferred <wine-loader>
ELF 7c663000-7c6ac000 Deferred dsound<elf>
\-PE 7c670000-7c6ac000 \ dsound
ELF 7c781000-7c7b3000 Deferred uxtheme<elf>
\-PE 7c790000-7c7b3000 \ uxtheme
ELF 7c7b3000-7c874000 Deferred libasound.so.2
ELF 7c87e000-7c893000 Deferred midimap<elf>
\-PE 7c880000-7c893000 \ midimap
ELF 7c893000-7c8be000 Deferred winealsa<elf>
\-PE 7c8a0000-7c8be000 \ winealsa
ELF 7cb5a000-7cb5f000 Deferred libxfixes.so.3
ELF 7cb5f000-7cb68000 Deferred libxcursor.so.1
PE 7cb70000-7cb85000 --none-- msacm32
ELF 7cb87000-7cb8a000 Deferred libxrandr.so.2
ELF 7cb8a000-7cb92000 Deferred libxrender.so.1
ELF 7cb92000-7cb95000 Deferred libxinerama.so.1
ELF 7cb98000-7cbb4000 Deferred imm32<elf>
\-PE 7cba0000-7cbb4000 \ imm32
ELF 7d55e000-7d5ec000 Deferred winex11<elf>
\-PE 7d570000-7d5ec000 \ winex11
ELF 7d650000-7d670000 Deferred libexpat.so.1
ELF 7d670000-7d69b000 Deferred libfontconfig.so.1
ELF 7d6ba000-7d724000 Deferred libfreetype.so.6
ELF 7d743000-7d769000 Deferred msacm32<elf>
ELF 7d769000-7d7cd000 Deferred msvcrt<elf>
\-PE 7d780000-7d7cd000 \ msvcrt
ELF 7d835000-7d840000 Deferred libgcc_s.so.1
ELF 7d925000-7d927000 Deferred libnvidia-tls.so.1
ELF 7d927000-7e298000 Deferred libglcore.so.1
ELF 7e298000-7e29d000 Deferred libxdmcp.so.6
ELF 7e29d000-7e32d000 Deferred libglu.so.1
ELF 7e32d000-7e3c1000 Deferred libgl.so.1
ELF 7e3c1000-7e4ad000 Deferred libx11.so.6
ELF 7e4ad000-7e4bb000 Deferred libxext.so.6
ELF 7e4bb000-7e4d3000 Deferred libice.so.6
ELF 7e4d3000-7e4dc000 Deferred libsm.so.6
ELF 7e4dc000-7e596000 Deferred wined3d<elf>
\-PE 7e4f0000-7e596000 \ wined3d
ELF 7e596000-7e5c1000 Deferred d3d9<elf>
\-PE 7e5a0000-7e5c1000 \ d3d9
ELF 7e5c1000-7e5ed000 Deferred ws2_32<elf>
\-PE 7e5d0000-7e5ed000 \ ws2_32
ELF 7e5ed000-7e6aa000 Deferred comctl32<elf>
\-PE 7e600000-7e6aa000 \ comctl32
ELF 7e6aa000-7e6bd000 Deferred libresolv.so.2
ELF 7e6c6000-7e6da000 Deferred libz.so.1
ELF 7e6dc000-7e6fa000 Deferred iphlpapi<elf>
\-PE 7e6e0000-7e6fa000 \ iphlpapi
ELF 7e6fa000-7e74f000 Deferred rpcrt4<elf>
\-PE 7e710000-7e74f000 \ rpcrt4
ELF 7e74f000-7e7e8000 Deferred ole32<elf>
\-PE 7e760000-7e7e8000 \ ole32
ELF 7e7e8000-7e840000 Deferred shlwapi<elf>
\-PE 7e800000-7e840000 \ shlwapi
ELF 7e840000-7e935000 Deferred shell32<elf>
\-PE 7e850000-7e935000 \ shell32
ELF 7e935000-7e97b000 Deferred advapi32<elf>
\-PE 7e940000-7e97b000 \ advapi32
ELF 7e97b000-7ea0e000 Deferred gdi32<elf>
\-PE 7e990000-7ea0e000 \ gdi32
ELF 7ea0e000-7eb48000 Deferred user32<elf>
\-PE 7ea30000-7eb48000 \ user32
ELF 7eb48000-7ebd6000 Deferred winmm<elf>
\-PE 7eb50000-7ebd6000 \ winmm
ELF 7edd6000-7eefc000 Deferred kernel32<elf>
\-PE 7edf0000-7eefc000 \ kernel32
ELF 7eefc000-7ef07000 Deferred libnss_files.so.2
ELF 7ef07000-7ef11000 Deferred libnss_nis.so.2
ELF 7ef11000-7ef27000 Deferred libnsl.so.1
ELF 7ef27000-7ef4c000 Deferred libm.so.6
ELF 7ef4c000-7ef4f000 Deferred libxau.so.6
ELF 7ef6b000-7f000000 Dwarf ntdll<elf>
\-PE 7ef80000-7f000000 \ ntdll
ELF b7cb0000-b7cb5000 Deferred libxxf86vm.so.1
ELF b7cb6000-b7cba000 Deferred libdl.so.2
ELF b7cba000-b7dec000 Export libc.so.6
ELF b7dec000-b7dfe000 Export libpthread.so.0
ELF b7e11000-b7e15000 Deferred iso8859-2.so
ELF b7e15000-b7e1e000 Deferred libnss_compat.so.2
ELF b7e1e000-b7f2f000 Deferred libwine.so.1
ELF b7f31000-b7f48000 Deferred ld-linux.so.2
Threads:
process tid prio (all id:s are in hex)
0000000a
0000000c 0
0000000b 0
00000008 (D) G:\usr\games\flatout2\FlatOut2.exe
00000012 15
00000011 0 <==
00000010 0
0000000f 2
0000000e 15
0000000d 15
00000009 0
Stefan Dösinger napsal(a):
> The ddraw index buffer handling needs a proper fix somewhen, either by an VB +
> up Indices drawing method(but there are already too many of them) or my a
> SetMem method in index buffers
>
> This patch should(hopefully) fix the regressions introduced with my former
> index buffer patch
>
>
> ------------------------------------------------------------------------
>
> From fadece932e1ff556a4434545d7bf6753aaabdaf1 Mon Sep 17 00:00:00 2001
> From: Stefan Doesinger <stefan at codeweavers.com>
> Date: Tue, 20 Feb 2007 16:15:04 +0100
> Subject: [PATCH] D3D: Index buffer fixes
>
> Some things that missed in my former patch. Do not unset the index buffer in _Release, that
> is not needed. Dirtify the index buffer state in unlock because the bound buffer is changed.
> GL vbos are GLuints. The index buffer used by ddraw should have dynamic usage, and preferably
> be locked only on the size that has to be locked
> ---
> dlls/ddraw/device.c | 2 +-
> dlls/ddraw/direct3d.c | 2 +-
> dlls/wined3d/device.c | 2 +-
> dlls/wined3d/indexbuffer.c | 9 +++++++--
> 4 files changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
> index c201df7..0814921 100644
> --- a/dlls/ddraw/device.c
> +++ b/dlls/ddraw/device.c
> @@ -3691,7 +3691,7 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface,
> */
> hr = IWineD3DIndexBuffer_Lock(This->indexbuffer,
> 0 /* OffSetToLock */,
> - 0 /* SizeToLock - doesn't matter */,
> + IndexCount * sizeof(WORD),
> (BYTE **) &LockedIndices,
> 0 /* Flags */);
> assert(IndexCount < 0x100000);
> diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c
> index 4896ba7..b716a60 100644
> --- a/dlls/ddraw/direct3d.c
> +++ b/dlls/ddraw/direct3d.c
> @@ -804,7 +804,7 @@ IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface,
> */
> hr = IWineD3DDevice_CreateIndexBuffer(This->wineD3DDevice,
> 0x40000, /* Length. Don't know how long it should be */
> - 0, /* Usage */
> + WINED3DUSAGE_DYNAMIC, /* Usage */
> WINED3DFMT_INDEX16, /* Format. D3D7 uses WORDS */
> WINED3DPOOL_DEFAULT,
> &object->indexbuffer,
> diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
> index c039798..2ac8797 100644
> --- a/dlls/wined3d/device.c
> +++ b/dlls/wined3d/device.c
> @@ -4294,7 +4294,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice *
> UINT idxStride = 2;
> IWineD3DIndexBuffer *pIB;
> WINED3DINDEXBUFFER_DESC IdxBufDsc;
> - GLint vbo;
> + GLuint vbo;
>
> pIB = This->stateBlock->pIndexData;
> This->stateBlock->streamIsUP = FALSE;
> diff --git a/dlls/wined3d/indexbuffer.c b/dlls/wined3d/indexbuffer.c
> index b16ddd0..ae2294a 100644
> --- a/dlls/wined3d/indexbuffer.c
> +++ b/dlls/wined3d/indexbuffer.c
> @@ -60,8 +60,11 @@ static ULONG WINAPI IWineD3DIndexBufferImpl_Release(IWineD3DIndexBuffer *iface)
> if (ref == 0) {
> if(This->vbo) {
> ENTER_GL();
> - GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0));
> - checkGLcall("glBindBufferARB");
> + /* No need to manually unset the buffer. glDeleteBuffers unsets it for the current context,
> + * but not for other contexts. However, because the d3d buffer is destroyed the app has to
> + * unset it before doing the next draw, thus dirtifying the index buffer state and forcing
> + * binding a new buffer
> + */
> GL_EXTCALL(glDeleteBuffersARB(1, &This->vbo));
> checkGLcall("glDeleteBuffersARB");
> LEAVE_GL();
> @@ -159,6 +162,8 @@ static HRESULT WINAPI IWineD3DIndexBufferImpl_Unlock(IWineD3DIndexBuffer *iface)
> LEAVE_GL();
> This->dirtystart = 0;
> This->dirtyend = 0;
> + /* TODO: Move loading into preload when the buffer is used, that avoids dirtifying the state */
> + IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_INDEXBUFFER);
> }
> return WINED3D_OK;
> }
>
>
> ------------------------------------------------------------------------
>
>
More information about the wine-devel
mailing list