Module: wine Branch: master Commit: 7186d8bef519d5da101161370b849a1c4d84f984 URL: https://source.winehq.org/git/wine.git/?a=commit;h=7186d8bef519d5da101161370...
Author: Zebediah Figura z.figura12@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@gmail.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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;