Stefan Dösinger napsal(a):
Am Dienstag 20 Februar 2007 15:03 schrieb Mirek:
Hi, this patch caused regression in many Direct3D games. TES IV:
Oblivion can't start game (menu works), Flatout II is completly broken,
Alpine Sky Racing 2007 can't run, HalfLife 2 EO can't run. I tried
rewrite GLint vbo; to GLuint vbo; but it doesn't help.
Argh, sounds kinda bad :-( .

Do the games crash, or display incorrect graphics?

HL 2 EO can't even start to menu, it just hangs
TES IV: Oblivion can start, but it hangs while loading game
Flatout II can start, but graphic in menu is completly broken and it crash after start of game



Can you try to add the following line in IWineD3DIndexBufferImpl_Unlock(dlls/wined3d/indexbuffer.c),somewhere in the locks == 0 && This->vbo if statement:

IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_INDEXBUFFER);

The bound index buffer is changed there, and it needs to be restored for the next draw. I forgot to add that because originally I planned to make the vbo and state table things 2 patches, but that didn't work out right.

I tried it three times in different places, it helped in some games:

Flatout II - graphic in menu was without any problems, but game crashed (still regression).
HalfLife 2 EO - works, I was in game only about 2 minuts and it look fixed
Alpine Sky Racing 2007 - works
TES IV: Oblivion - still crashing while loading (it just hang while loading, picture is frozen, and I have to manualy kill it)

So it fixed something, but not all regressions.


1.
    /* For now load in unlock */
    if(locks == 0 && This->vbo) {
        ENTER_GL();
IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_INDEXBUFFER); GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, This->vbo));
        checkGLcall("glBindBufferARB");
        GL_EXTCALL(glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,
This->dirtystart, This->dirtyend - This->dirtystart, This->resource.allocatedMemory + This->dirtystart));
        checkGLcall("glBufferSubDataARB");
        LEAVE_GL();
        This->dirtystart = 0;
        This->dirtyend = 0;
    }
    return WINED3D_OK;

2.
    /* For now load in unlock */
    if(locks == 0 && This->vbo) {
IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_INDEXBUFFER);
        ENTER_GL();
GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, This->vbo));
        checkGLcall("glBindBufferARB");
        GL_EXTCALL(glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,
This->dirtystart, This->dirtyend - This->dirtystart, This->resource.allocatedMemory + This->dirtystart));
        checkGLcall("glBufferSubDataARB");
        LEAVE_GL();
        This->dirtystart = 0;
        This->dirtyend = 0;
IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_INDEXBUFFER);
    }
    return WINED3D_OK;

3.
    /* For now load in unlock */
    if(locks == 0 && This->vbo) {
        ENTER_GL();
GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, This->vbo));
        checkGLcall("glBindBufferARB");
        GL_EXTCALL(glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,
This->dirtystart, This->dirtyend - This->dirtystart, This->resource.allocatedMemory + This->dirtystart));
        checkGLcall("glBufferSubDataARB");
        LEAVE_GL();
        This->dirtystart = 0;
        This->dirtyend = 0;
    }
    return WINED3D_OK;

Mirek


Reply via email to