From 4ccbc948a16eb84180381bd9e2359484e91e2c7a Mon Sep 17 00:00:00 2001 From: Henri Verbeet <hverbeet@codeweavers.com> Date: Tue, 31 Mar 2009 09:38:14 +0200 Subject: [PATCH] d3d10core: Set the initial buffer data, when present. --- dlls/d3d10core/device.c | 2 +- dlls/wined3d/device.c | 27 +++++++++++++++++++++++++-- include/wine/wined3d.idl | 1 + 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/dlls/d3d10core/device.c b/dlls/d3d10core/device.c index bd82316a9af..b0eae7f0728 100644 --- a/dlls/d3d10core/device.c +++ b/dlls/d3d10core/device.c @@ -620,7 +620,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateBuffer(ID3D10Device *iface, wined3d_desc.misc_flags = desc->MiscFlags; hr = IWineD3DDevice_CreateBuffer(This->wined3d_device, &wined3d_desc, - (IUnknown *)object, &object->wined3d_buffer); + data ? data->pSysMem : NULL, (IUnknown *)object, &object->wined3d_buffer); if (FAILED(hr)) { ERR("CreateBuffer failed, returning %#x\n", hr); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 0f6885ff297..aebcfaf9a8f 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -435,13 +435,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetParent(IWineD3DDevice *iface, IUnkno } static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface, - struct wined3d_buffer_desc *desc, IUnknown *parent, IWineD3DBuffer **buffer) + struct wined3d_buffer_desc *desc, const void *data, IUnknown *parent, IWineD3DBuffer **buffer) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; struct wined3d_buffer *object; HRESULT hr; - TRACE("iface %p, desc %p, parent %p, buffer %p\n", iface, desc, parent, buffer); + TRACE("iface %p, desc %p, data %p, parent %p, buffer %p\n", iface, desc, data, parent, buffer); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) @@ -471,6 +471,29 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface, TRACE("size %#x, usage=%#x, format %s, memory @ %p, iface @ %p\n", object->resource.size, object->resource.usage, debug_d3dformat(object->resource.format_desc->format), object->resource.allocatedMemory, object); + if (data) + { + BYTE *ptr; + + hr = IWineD3DBuffer_Map((IWineD3DBuffer *)object, 0, desc->byte_width, &ptr, 0); + if (FAILED(hr)) + { + ERR("Failed to map buffer, hr %#x\n", hr); + IWineD3DBuffer_Release((IWineD3DBuffer *)object); + return hr; + } + + memcpy(ptr, data, desc->byte_width); + + hr = IWineD3DBuffer_Unmap((IWineD3DBuffer *)object); + if (FAILED(hr)) + { + ERR("Failed to unmap buffer, hr %#x\n", hr); + IWineD3DBuffer_Release((IWineD3DBuffer *)object); + return hr; + } + } + *buffer = (IWineD3DBuffer *)object; return WINED3D_OK; diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl index ad6197f5d03..604781b9397 100644 --- a/include/wine/wined3d.idl +++ b/include/wine/wined3d.idl @@ -2909,6 +2909,7 @@ interface IWineD3DDevice : IWineD3DBase { HRESULT CreateBuffer( [in] struct wined3d_buffer_desc *desc, + [in] const void *data, [in] IUnknown *parent, [out] IWineD3DBuffer **buffer ); -- GitLab