ddraw: Keep a ddraw object reference in d3d7 vertex buffers.
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
c3521cd673
commit
2568fd2e00
|
@ -81,25 +81,27 @@ static ULONG WINAPI d3d_vertex_buffer7_Release(IDirect3DVertexBuffer7 *iface)
|
||||||
|
|
||||||
TRACE("%p decreasing refcount to %u.\n", buffer, ref);
|
TRACE("%p decreasing refcount to %u.\n", buffer, ref);
|
||||||
|
|
||||||
if (ref == 0)
|
if (!ref)
|
||||||
{
|
{
|
||||||
struct wined3d_buffer *curVB = NULL;
|
struct wined3d_buffer *vb = NULL;
|
||||||
UINT offset, stride;
|
UINT offset, stride;
|
||||||
|
|
||||||
/* D3D7 Vertex buffers don't stay bound in the device, they are passed
|
/* D3D7 vertex buffers don't stay bound in the device, they are passed
|
||||||
* as a parameter to drawPrimitiveVB. DrawPrimitiveVB sets them as the
|
* as a parameter to DrawPrimitiveVB. DrawPrimitiveVB sets them as the
|
||||||
* stream source in wined3d, and they should get unset there before
|
* stream source in wined3d and they should get unset there before
|
||||||
* they are destroyed. */
|
* they are destroyed. */
|
||||||
wined3d_mutex_lock();
|
wined3d_mutex_lock();
|
||||||
wined3d_device_get_stream_source(buffer->ddraw->wined3d_device,
|
wined3d_device_get_stream_source(buffer->ddraw->wined3d_device, 0, &vb, &offset, &stride);
|
||||||
0, &curVB, &offset, &stride);
|
if (vb == buffer->wined3d_buffer)
|
||||||
if (curVB == buffer->wined3d_buffer)
|
|
||||||
wined3d_device_set_stream_source(buffer->ddraw->wined3d_device, 0, NULL, 0, 0);
|
wined3d_device_set_stream_source(buffer->ddraw->wined3d_device, 0, NULL, 0, 0);
|
||||||
|
|
||||||
wined3d_vertex_declaration_decref(buffer->wined3d_declaration);
|
wined3d_vertex_declaration_decref(buffer->wined3d_declaration);
|
||||||
wined3d_buffer_decref(buffer->wined3d_buffer);
|
wined3d_buffer_decref(buffer->wined3d_buffer);
|
||||||
wined3d_mutex_unlock();
|
wined3d_mutex_unlock();
|
||||||
|
|
||||||
|
if (buffer->version == 7)
|
||||||
|
IDirectDraw7_Release(&buffer->ddraw->IDirectDraw7_iface);
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, buffer);
|
HeapFree(GetProcessHeap(), 0, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,7 +453,8 @@ HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **vertex_buf,
|
||||||
buffer->IDirect3DVertexBuffer7_iface.lpVtbl = &d3d_vertex_buffer7_vtbl;
|
buffer->IDirect3DVertexBuffer7_iface.lpVtbl = &d3d_vertex_buffer7_vtbl;
|
||||||
buffer->ref = 1;
|
buffer->ref = 1;
|
||||||
buffer->version = ddraw->d3dversion;
|
buffer->version = ddraw->d3dversion;
|
||||||
|
if (buffer->version == 7)
|
||||||
|
IDirectDraw7_AddRef(&ddraw->IDirectDraw7_iface);
|
||||||
buffer->ddraw = ddraw;
|
buffer->ddraw = ddraw;
|
||||||
buffer->Caps = desc->dwCaps;
|
buffer->Caps = desc->dwCaps;
|
||||||
buffer->fvf = desc->dwFVF;
|
buffer->fvf = desc->dwFVF;
|
||||||
|
|
Loading…
Reference in New Issue