[PATCH 2/2] dxgi/tests: Run the tests in parallel.
Henri Verbeet
hverbeet at codeweavers.com
Tue Aug 21 07:34:25 CDT 2018
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/dxgi/tests/Makefile.in | 2 +-
dlls/dxgi/tests/{device.c => dxgi.c} | 108 +++++++++++++++++++++++++++++------
2 files changed, 90 insertions(+), 20 deletions(-)
rename dlls/dxgi/tests/{device.c => dxgi.c} (98%)
diff --git a/dlls/dxgi/tests/Makefile.in b/dlls/dxgi/tests/Makefile.in
index 2676bc98d39..1c99d70957d 100644
--- a/dlls/dxgi/tests/Makefile.in
+++ b/dlls/dxgi/tests/Makefile.in
@@ -2,4 +2,4 @@ TESTDLL = dxgi.dll
IMPORTS = d3d10_1 dxgi user32
C_SRCS = \
- device.c
+ dxgi.c
diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/dxgi.c
similarity index 98%
rename from dlls/dxgi/tests/device.c
rename to dlls/dxgi/tests/dxgi.c
index 81b231a4d36..8ee7091b19d 100644
--- a/dlls/dxgi/tests/device.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -39,6 +39,73 @@ static HRESULT (WINAPI *pCreateDXGIFactory2)(UINT flags, REFIID iid, void **fact
static PFN_D3D12_CREATE_DEVICE pD3D12CreateDevice;
static PFN_D3D12_GET_DEBUG_INTERFACE pD3D12GetDebugInterface;
+static unsigned int use_adapter_idx;
+static BOOL use_warp_adapter;
+static BOOL use_mt = TRUE;
+
+static struct test_entry
+{
+ void (*test)(void);
+} *mt_tests;
+size_t mt_tests_size, mt_test_count;
+
+static void queue_test(void (*test)(void))
+{
+ if (mt_test_count >= mt_tests_size)
+ {
+ mt_tests_size = max(16, mt_tests_size * 2);
+ mt_tests = heap_realloc(mt_tests, mt_tests_size * sizeof(*mt_tests));
+ }
+ mt_tests[mt_test_count++].test = test;
+}
+
+static DWORD WINAPI thread_func(void *ctx)
+{
+ LONG *i = ctx, j;
+
+ while (*i < mt_test_count)
+ {
+ j = *i;
+ if (InterlockedCompareExchange(i, j + 1, j) == j)
+ mt_tests[j].test();
+ }
+
+ return 0;
+}
+
+static void run_queued_tests(void)
+{
+ unsigned int thread_count, i;
+ HANDLE *threads;
+ SYSTEM_INFO si;
+ LONG test_idx;
+
+ if (!use_mt)
+ {
+ for (i = 0; i < mt_test_count; ++i)
+ {
+ mt_tests[i].test();
+ }
+
+ return;
+ }
+
+ GetSystemInfo(&si);
+ thread_count = si.dwNumberOfProcessors;
+ threads = heap_calloc(thread_count, sizeof(*threads));
+ for (i = 0, test_idx = 0; i < thread_count; ++i)
+ {
+ threads[i] = CreateThread(NULL, 0, thread_func, &test_idx, 0, NULL);
+ ok(!!threads[i], "Failed to create thread %u.\n", i);
+ }
+ WaitForMultipleObjects(thread_count, threads, TRUE, INFINITE);
+ for (i = 0; i < thread_count; ++i)
+ {
+ CloseHandle(threads[i]);
+ }
+ heap_free(threads);
+}
+
static ULONG get_refcount(IUnknown *iface)
{
IUnknown_AddRef(iface);
@@ -394,9 +461,6 @@ static void compute_expected_swapchain_fullscreen_state_after_fullscreen_change_
}
}
-static BOOL use_warp_adapter;
-static unsigned int use_adapter_idx;
-
static IDXGIAdapter *create_adapter(void)
{
IDXGIFactory4 *factory4;
@@ -4040,7 +4104,7 @@ static void run_on_d3d12(void (*test_func)(IUnknown *device, BOOL is_d3d12))
ok(!refcount, "Device has %u references left.\n", refcount);
}
-START_TEST(device)
+START_TEST(dxgi)
{
HMODULE dxgi_module, d3d12_module;
BOOL enable_debug_layer = FALSE;
@@ -4064,30 +4128,36 @@ START_TEST(device)
use_warp_adapter = TRUE;
else if (!strcmp(argv[i], "--adapter") && i + 1 < argc)
use_adapter_idx = atoi(argv[++i]);
+ else if (!strcmp(argv[i], "--single"))
+ use_mt = FALSE;
}
- test_adapter_desc();
- test_adapter_luid();
- test_check_interface_support();
- test_create_surface();
- test_parents();
- test_output();
- test_find_closest_matching_mode();
+ queue_test(test_adapter_desc);
+ queue_test(test_adapter_luid);
+ queue_test(test_check_interface_support);
+ queue_test(test_create_surface);
+ queue_test(test_parents);
+ queue_test(test_output);
+ queue_test(test_find_closest_matching_mode);
+ queue_test(test_get_containing_output);
+ queue_test(test_create_factory);
+ queue_test(test_private_data);
+ queue_test(test_swapchain_resize);
+ queue_test(test_swapchain_present);
+ queue_test(test_maximum_frame_latency);
+ queue_test(test_output_desc);
+ queue_test(test_object_wrapping);
+
+ run_queued_tests();
+
+ /* These tests use full-screen swapchains, so shouldn't run in parallel. */
test_create_swapchain();
- test_get_containing_output();
test_set_fullscreen();
test_default_fullscreen_target_output();
test_resize_target();
test_inexact_modes();
- test_create_factory();
- test_private_data();
- test_swapchain_resize();
test_swapchain_parameters();
- test_swapchain_present();
run_on_d3d10(test_swapchain_backbuffer_index);
- test_maximum_frame_latency();
- test_output_desc();
- test_object_wrapping();
if (!(d3d12_module = LoadLibraryA("d3d12.dll")))
{
--
2.11.0
More information about the wine-devel
mailing list