Zebediah Figura : wined3d: Implement NOOVERWRITE maps in wined3d_deferred_context_prepare_upload_bo().

Alexandre Julliard julliard at winehq.org
Thu Jul 1 15:53:51 CDT 2021


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Wed Jun 30 17:38:34 2021 -0500

wined3d: Implement NOOVERWRITE maps in wined3d_deferred_context_prepare_upload_bo().

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3d11/tests/d3d11.c | 42 ++++++++++++++++++------------------------
 dlls/wined3d/cs.c        | 17 ++++++++++++++++-
 2 files changed, 34 insertions(+), 25 deletions(-)

diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 0cc3401d0bb..5f2b12ee694 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -33121,38 +33121,32 @@ static void test_deferred_context_map(void)
     ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
 
     hr = ID3D11DeviceContext_Map(deferred, (ID3D11Resource *)buffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &map_desc);
-    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
 
-    if (hr == S_OK)
+    map_data = map_desc.pData;
+    for (i = 0; i < ARRAY_SIZE(data); ++i)
     {
-        map_data = map_desc.pData;
-        for (i = 0; i < ARRAY_SIZE(data); ++i)
-        {
-            ok(map_data[i] == 2 * i, "Got unexpected value %.8e at %u.\n", map_data[i], i);
-            if (i % 2)
-                map_data[i] = 3 * i;
-        }
-        memcpy(data, map_data, sizeof(data));
-
-        ID3D11DeviceContext_Unmap(deferred, (ID3D11Resource *)buffer, 0);
+        ok(map_data[i] == 2 * i, "Got unexpected value %.8e at %u.\n", map_data[i], i);
+        if (i % 2)
+            map_data[i] = 3 * i;
     }
+    memcpy(data, map_data, sizeof(data));
+
+    ID3D11DeviceContext_Unmap(deferred, (ID3D11Resource *)buffer, 0);
 
     hr = ID3D11DeviceContext_Map(deferred, (ID3D11Resource *)buffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &map_desc);
-    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
 
-    if (hr == S_OK)
+    map_data = map_desc.pData;
+    for (i = 0; i < ARRAY_SIZE(data); ++i)
     {
-        map_data = map_desc.pData;
-        for (i = 0; i < ARRAY_SIZE(data); ++i)
-        {
-            ok(map_data[i] == data[i], "Got unexpected value %.8e at %u.\n", map_data[i], i);
-            if (i % 3)
-                map_data[i] = 4 * i;
-        }
-        memcpy(data, map_data, sizeof(data));
-
-        ID3D11DeviceContext_Unmap(deferred, (ID3D11Resource *)buffer, 0);
+        ok(map_data[i] == data[i], "Got unexpected value %.8e at %u.\n", map_data[i], i);
+        if (i % 3)
+            map_data[i] = 4 * i;
     }
+    memcpy(data, map_data, sizeof(data));
+
+    ID3D11DeviceContext_Unmap(deferred, (ID3D11Resource *)buffer, 0);
 
     hr = ID3D11DeviceContext_FinishCommandList(deferred, FALSE, &list);
     ok(hr == S_OK, "Failed to create command list, hr %#x.\n", hr);
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 36b398741b3..d099d3bc9da 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -3505,12 +3505,27 @@ static void *wined3d_deferred_context_prepare_upload_bo(struct wined3d_device_co
         return NULL;
     }
 
-    if (flags & ~(WINED3D_MAP_WRITE | WINED3D_MAP_DISCARD))
+    if (flags & ~(WINED3D_MAP_WRITE | WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE))
     {
         FIXME("Unhandled flags %#x.\n", flags);
         return NULL;
     }
 
+    if (flags & WINED3D_MAP_NOOVERWRITE)
+    {
+        const struct wined3d_deferred_upload *upload;
+
+        if ((upload = deferred_context_get_upload(deferred, resource, sub_resource_idx)))
+        {
+            map_ptr = (uint8_t *)align((size_t)upload->sysmem, RESOURCE_ALIGNMENT);
+            address->buffer_object = 0;
+            address->addr = map_ptr;
+            return map_ptr;
+        }
+
+        return NULL;
+    }
+
     if (!wined3d_array_reserve((void **)&deferred->uploads, &deferred->uploads_capacity,
             deferred->upload_count + 1, sizeof(*deferred->uploads)))
         return NULL;




More information about the wine-cvs mailing list