[PATCH vkd3d 5/5] tests: Add tests for NULL event handles in SetEventOnCompletion().
Conor McCarthy
cmccarthy at codeweavers.com
Mon Jan 10 08:01:36 CST 2022
Testing this before NULL event handling is patched results in a crash.
Based on a vkd3d-proton patch by Hans-Kristian Arntzen.
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
tests/d3d12.c | 12 ++++++++++--
tests/d3d12_crosstest.h | 26 ++++++++++++++++++++++++++
tests/d3d12_test_utils.h | 2 ++
3 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index b973ad9c..9c5f84ef 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -4412,11 +4412,14 @@ static void test_fence_values(void)
value = ID3D12Fence_GetCompletedValue(fence);
ok(value == next_value, "Got value %#"PRIx64", expected %#"PRIx64".\n", value, next_value);
- for (i = 0; i < 100; ++i)
+ for (i = 0; i < 200; ++i)
{
++next_value;
queue_signal(queue, fence, next_value);
- wait_queue_idle(device, queue);
+ if ((i * 11) & 8)
+ wait_queue_idle_no_event(device, queue);
+ else
+ wait_queue_idle(device, queue);
value = ID3D12Fence_GetCompletedValue(fence);
ok(value == next_value, "Got value %#"PRIx64", expected %#"PRIx64".\n", value, next_value);
}
@@ -4453,6 +4456,11 @@ static void test_fence_values(void)
wait_queue_idle(device, queue);
value = ID3D12Fence_GetCompletedValue(fence);
ok(value == next_value, "Got value %#"PRIx64", expected %#"PRIx64".\n", value, next_value);
+ next_value <<= 1;
+ queue_signal(queue, fence, next_value);
+ wait_queue_idle_no_event(device, queue);
+ value = ID3D12Fence_GetCompletedValue(fence);
+ ok(value == next_value, "Got value %#"PRIx64", expected %#"PRIx64".\n", value, next_value);
next_value = 0;
queue_signal(queue, fence, next_value);
wait_queue_idle(device, queue);
diff --git a/tests/d3d12_crosstest.h b/tests/d3d12_crosstest.h
index 0b77bdee..557d0430 100644
--- a/tests/d3d12_crosstest.h
+++ b/tests/d3d12_crosstest.h
@@ -226,6 +226,15 @@ static HRESULT wait_for_fence(ID3D12Fence *fence, uint64_t value)
return ret == WAIT_OBJECT_0 ? S_OK : E_FAIL;
}
+static HRESULT wait_for_fence_no_event(ID3D12Fence *fence, uint64_t value)
+{
+ if (ID3D12Fence_GetCompletedValue(fence) >= value)
+ return S_OK;
+
+ /* This is defined to block on the value with infinite timeout. */
+ return ID3D12Fence_SetEventOnCompletion(fence, value, NULL);
+}
+
static void wait_queue_idle_(unsigned int line, ID3D12Device *device, ID3D12CommandQueue *queue)
{
ID3D12Fence *fence;
@@ -243,6 +252,23 @@ static void wait_queue_idle_(unsigned int line, ID3D12Device *device, ID3D12Comm
ID3D12Fence_Release(fence);
}
+static void wait_queue_idle_no_event_(unsigned int line, ID3D12Device *device, ID3D12CommandQueue *queue)
+{
+ ID3D12Fence *fence;
+ HRESULT hr;
+
+ hr = ID3D12Device_CreateFence(device, 0, D3D12_FENCE_FLAG_NONE,
+ &IID_ID3D12Fence, (void **)&fence);
+ assert_that_(line)(hr == S_OK, "Failed to create fence, hr %#x.\n", hr);
+
+ hr = ID3D12CommandQueue_Signal(queue, fence, 1);
+ assert_that_(line)(hr == S_OK, "Failed to signal fence, hr %#x.\n", hr);
+ hr = wait_for_fence_no_event(fence, 1);
+ assert_that_(line)(hr == S_OK, "Failed to wait for fence, hr %#x.\n", hr);
+
+ ID3D12Fence_Release(fence);
+}
+
static bool use_warp_device;
static unsigned int use_adapter_idx;
diff --git a/tests/d3d12_test_utils.h b/tests/d3d12_test_utils.h
index c8287cf3..48156b81 100644
--- a/tests/d3d12_test_utils.h
+++ b/tests/d3d12_test_utils.h
@@ -26,6 +26,8 @@ struct vec4
#define wait_queue_idle(a, b) wait_queue_idle_(__LINE__, a, b)
static void wait_queue_idle_(unsigned int line, ID3D12Device *device, ID3D12CommandQueue *queue);
+#define wait_queue_idle_no_event(a, b) wait_queue_idle_no_event_(__LINE__, a, b)
+static void wait_queue_idle_no_event_(unsigned int line, ID3D12Device *device, ID3D12CommandQueue *queue);
static ID3D12Device *create_device(void);
static void set_rect(RECT *rect, int left, int top, int right, int bottom)
--
2.34.1
More information about the wine-devel
mailing list