d3d10core: Set the initial buffer data, when present.

Henri Verbeet hverbeet at codeweavers.com
Tue Mar 31 02:38:14 CDT 2009


---
 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 bd82316..b0eae7f 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 5d3f400..e47fc02 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 ad6197f..604781b 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
     );
-- 
1.6.0.6



--------------050405090301040404010600--



More information about the wine-patches mailing list