=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Fix initial data for non-GPU buffers.

Alexandre Julliard julliard at winehq.org
Fri Sep 7 16:49:26 CDT 2018


Module: wine
Branch: master
Commit: 3cd28caf17284af48a57538e06effbce26cefe0c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3cd28caf17284af48a57538e06effbce26cefe0c

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Thu Sep  6 22:01:58 2018 +0200

wined3d: Fix initial data for non-GPU buffers.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=44655
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/buffer.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index a824d94..639a145 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1230,6 +1230,28 @@ void wined3d_buffer_upload_data(struct wined3d_buffer *buffer, struct wined3d_co
     wined3d_buffer_upload_ranges(buffer, context, data, range.offset, 1, &range);
 }
 
+static void wined3d_buffer_init_data(struct wined3d_buffer *buffer,
+        struct wined3d_device *device, const struct wined3d_sub_resource_data *data)
+{
+    struct wined3d_resource *resource = &buffer->resource;
+    struct wined3d_bo_address bo;
+    struct wined3d_box box;
+
+    if (buffer->flags & WINED3D_BUFFER_USE_BO)
+    {
+        wined3d_box_set(&box, 0, 0, resource->size, 1, 0, 1);
+        wined3d_cs_emit_update_sub_resource(device->cs, resource,
+                0, &box, data->data, data->row_pitch, data->slice_pitch);
+    }
+    else
+    {
+        wined3d_buffer_get_memory(buffer, &bo, WINED3D_LOCATION_SYSMEM);
+        memcpy(bo.addr, data->data, resource->size);
+        wined3d_buffer_validate_location(buffer, WINED3D_LOCATION_SYSMEM);
+        wined3d_buffer_invalidate_location(buffer, ~WINED3D_LOCATION_SYSMEM);
+    }
+}
+
 static ULONG buffer_resource_incref(struct wined3d_resource *resource)
 {
     return wined3d_buffer_incref(buffer_from_resource(resource));
@@ -1326,7 +1348,6 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device
     const struct wined3d_format *format = wined3d_get_format(device->adapter, format_id, usage);
     const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
     struct wined3d_resource *resource = &buffer->resource;
-    struct wined3d_box box;
     BOOL dynamic_buffer_ok;
     HRESULT hr;
 
@@ -1408,11 +1429,7 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device
     buffer->maps_size = 1;
 
     if (data)
-    {
-        wined3d_box_set(&box, 0, 0, resource->size, 1, 0, 1);
-        wined3d_cs_emit_update_sub_resource(device->cs, resource,
-                0, &box, data->data, data->row_pitch, data->slice_pitch);
-    }
+        wined3d_buffer_init_data(buffer, device, data);
 
     return WINED3D_OK;
 }




More information about the wine-cvs mailing list