ddraw: Create a dynamic buffer if DDLOCK_DISCARDCONTENTS is used.

This commit is contained in:
Stefan Dösinger 2012-12-04 09:36:16 +01:00 committed by Alexandre Julliard
parent 0432f6f86e
commit 67230fc013
2 changed files with 45 additions and 8 deletions

View File

@ -527,6 +527,8 @@ struct d3d_vertex_buffer
/*** Storage for D3D7 specific things ***/ /*** Storage for D3D7 specific things ***/
DWORD Caps; DWORD Caps;
DWORD fvf; DWORD fvf;
DWORD size;
BOOL dynamic;
}; };
HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **buffer, struct ddraw *ddraw, HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **buffer, struct ddraw *ddraw,

View File

@ -185,6 +185,27 @@ static ULONG WINAPI d3d_vertex_buffer1_Release(IDirect3DVertexBuffer *iface)
* IDirect3DVertexBuffer Methods * IDirect3DVertexBuffer Methods
*****************************************************************************/ *****************************************************************************/
static HRESULT d3d_vertex_buffer_create_wined3d_buffer(struct d3d_vertex_buffer *buffer, BOOL dynamic,
struct wined3d_buffer **wined3d_buffer)
{
DWORD usage = WINED3DUSAGE_STATICDECL;
enum wined3d_pool pool;
if (buffer->Caps & D3DVBCAPS_SYSTEMMEMORY)
pool = WINED3D_POOL_SYSTEM_MEM;
else
pool = WINED3D_POOL_DEFAULT;
if (buffer->Caps & D3DVBCAPS_WRITEONLY)
usage |= WINED3DUSAGE_WRITEONLY;
if (dynamic)
usage |= WINED3DUSAGE_DYNAMIC;
return wined3d_buffer_create_vb(buffer->ddraw->wined3d_device,
buffer->size, usage, pool, buffer, &ddraw_null_wined3d_parent_ops,
wined3d_buffer);
}
/***************************************************************************** /*****************************************************************************
* IDirect3DVertexBuffer7::Lock * IDirect3DVertexBuffer7::Lock
* *
@ -225,8 +246,28 @@ static HRESULT WINAPI d3d_vertex_buffer7_Lock(IDirect3DVertexBuffer7 *iface,
if (flags & DDLOCK_NOOVERWRITE) if (flags & DDLOCK_NOOVERWRITE)
wined3d_flags |= WINED3D_MAP_NOOVERWRITE; wined3d_flags |= WINED3D_MAP_NOOVERWRITE;
if (flags & DDLOCK_DISCARDCONTENTS) if (flags & DDLOCK_DISCARDCONTENTS)
{
wined3d_flags |= WINED3D_MAP_DISCARD; wined3d_flags |= WINED3D_MAP_DISCARD;
if (!buffer->dynamic)
{
struct wined3d_buffer *new_buffer;
wined3d_mutex_lock();
hr = d3d_vertex_buffer_create_wined3d_buffer(buffer, TRUE, &new_buffer);
if (SUCCEEDED(hr))
{
buffer->dynamic = TRUE;
wined3d_buffer_decref(buffer->wineD3DVertexBuffer);
buffer->wineD3DVertexBuffer = new_buffer;
}
else
{
WARN("Failed to create a dynamic buffer\n");
}
wined3d_mutex_unlock();
}
}
wined3d_mutex_lock(); wined3d_mutex_lock();
if (data_size) if (data_size)
{ {
@ -534,7 +575,6 @@ HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **vertex_buf,
struct ddraw *ddraw, D3DVERTEXBUFFERDESC *desc) struct ddraw *ddraw, D3DVERTEXBUFFERDESC *desc)
{ {
struct d3d_vertex_buffer *buffer; struct d3d_vertex_buffer *buffer;
DWORD usage;
HRESULT hr = D3D_OK; HRESULT hr = D3D_OK;
TRACE("Vertex buffer description:\n"); TRACE("Vertex buffer description:\n");
@ -554,16 +594,11 @@ HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **vertex_buf,
buffer->ddraw = ddraw; buffer->ddraw = ddraw;
buffer->Caps = desc->dwCaps; buffer->Caps = desc->dwCaps;
buffer->fvf = desc->dwFVF; buffer->fvf = desc->dwFVF;
buffer->size = get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices;
usage = desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0;
usage |= WINED3DUSAGE_STATICDECL;
wined3d_mutex_lock(); wined3d_mutex_lock();
hr = wined3d_buffer_create_vb(ddraw->wined3d_device, hr = d3d_vertex_buffer_create_wined3d_buffer(buffer, FALSE, &buffer->wineD3DVertexBuffer);
get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices,
usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3D_POOL_SYSTEM_MEM : WINED3D_POOL_DEFAULT,
buffer, &ddraw_null_wined3d_parent_ops, &buffer->wineD3DVertexBuffer);
if (FAILED(hr)) if (FAILED(hr))
{ {
WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr); WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr);