[PATCH 1/2] d3d10core/tests: Run the tests in parallel.

Henri Verbeet hverbeet at codeweavers.com
Tue Aug 21 07:34:24 CDT 2018


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/d3d10core/tests/Makefile.in               |   2 +-
 dlls/d3d10core/tests/{device.c => d3d10core.c} | 259 ++++++++++++++++---------
 2 files changed, 166 insertions(+), 95 deletions(-)
 rename dlls/d3d10core/tests/{device.c => d3d10core.c} (99%)

diff --git a/dlls/d3d10core/tests/Makefile.in b/dlls/d3d10core/tests/Makefile.in
index 6401cc8473a..313a042b246 100644
--- a/dlls/d3d10core/tests/Makefile.in
+++ b/dlls/d3d10core/tests/Makefile.in
@@ -2,4 +2,4 @@ TESTDLL   = d3d10core.dll
 IMPORTS   = d3d10 dxgi user32
 
 C_SRCS = \
-	device.c
+	d3d10core.c
diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/d3d10core.c
similarity index 99%
rename from dlls/d3d10core/tests/device.c
rename to dlls/d3d10core/tests/d3d10core.c
index 569c8eed51a..e675c12a39e 100644
--- a/dlls/d3d10core/tests/device.c
+++ b/dlls/d3d10core/tests/d3d10core.c
@@ -33,6 +33,16 @@
 #define BITS_N1_0 0xbf800000
 #define BITS_1_0  0x3f800000
 
+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;
+
 struct format_support
 {
     DXGI_FORMAT format;
@@ -70,6 +80,63 @@ struct uvec4
     unsigned int x, y, z, w;
 };
 
+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 void set_box(D3D10_BOX *box, UINT left, UINT top, UINT front, UINT right, UINT bottom, UINT back)
 {
     box->left = left;
@@ -946,9 +1013,6 @@ static void check_texture_uvec4_(unsigned int line, ID3D10Texture2D *texture,
         check_texture_sub_resource_uvec4_(line, texture, sub_resource_idx, NULL, expected_value);
 }
 
-static BOOL use_warp_adapter;
-static unsigned int use_adapter_idx;
-
 static IDXGIAdapter *create_adapter(void)
 {
     IDXGIFactory4 *factory4;
@@ -17143,7 +17207,7 @@ static void test_depth_clip(void)
     release_test_context(&test_context);
 }
 
-START_TEST(device)
+START_TEST(d3d10core)
 {
     unsigned int argc, i;
     char **argv;
@@ -17155,99 +17219,106 @@ 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;
     }
 
     print_adapter_info();
 
-    test_feature_level();
-    test_device_interfaces();
-    test_create_texture1d();
-    test_texture1d_interfaces();
-    test_create_texture2d();
-    test_texture2d_interfaces();
-    test_create_texture3d();
-    test_create_buffer();
-    test_create_depthstencil_view();
-    test_depthstencil_view_interfaces();
-    test_create_rendertarget_view();
-    test_render_target_views();
-    test_layered_rendering();
-    test_create_shader_resource_view();
-    test_create_shader();
-    test_create_sampler_state();
-    test_create_blend_state();
-    test_create_depthstencil_state();
-    test_create_rasterizer_state();
-    test_create_query();
-    test_occlusion_query();
-    test_pipeline_statistics_query();
-    test_timestamp_query();
-    test_device_removed_reason();
-    test_scissor();
-    test_clear_state();
-    test_blend();
-    test_texture1d();
-    test_texture();
-    test_cube_maps();
-    test_depth_stencil_sampling();
-    test_multiple_render_targets();
-    test_private_data();
-    test_state_refcounting();
-    test_il_append_aligned();
-    test_instance_id();
-    test_fragment_coords();
-    test_update_subresource();
-    test_copy_subresource_region();
-    test_copy_subresource_region_1d();
-    test_resource_access();
-    test_check_multisample_quality_levels();
-    test_cb_relative_addressing();
-    test_vs_input_relative_addressing();
-    test_swapchain_formats();
-    test_swapchain_views();
-    test_swapchain_flip();
-    test_clear_render_target_view_1d();
-    test_clear_render_target_view_2d();
-    test_clear_depth_stencil_view();
-    test_initial_depth_stencil_state();
-    test_draw_depth_only();
-    test_shader_stage_input_output_matching();
-    test_shader_interstage_interface();
-    test_sm4_if_instruction();
-    test_sm4_breakc_instruction();
-    test_sm4_continuec_instruction();
-    test_sm4_discard_instruction();
-    test_create_input_layout();
-    test_input_assembler();
-    test_null_sampler();
-    test_immediate_constant_buffer();
-    test_fp_specials();
-    test_uint_shader_instructions();
-    test_index_buffer_offset();
-    test_face_culling();
-    test_line_antialiasing_blending();
-    test_required_format_support();
-    test_ddy();
-    test_shader_input_registers_limits();
-    test_unbind_shader_resource_view();
-    test_stencil_separate();
-    test_sm4_ret_instruction();
-    test_primitive_restart();
-    test_resinfo_instruction();
-    test_render_target_device_mismatch();
-    test_buffer_srv();
-    test_geometry_shader();
-    test_stream_output();
-    test_stream_output_resume();
+    queue_test(test_feature_level);
+    queue_test(test_device_interfaces);
+    queue_test(test_create_texture1d);
+    queue_test(test_texture1d_interfaces);
+    queue_test(test_create_texture2d);
+    queue_test(test_texture2d_interfaces);
+    queue_test(test_create_texture3d);
+    queue_test(test_create_buffer);
+    queue_test(test_create_depthstencil_view);
+    queue_test(test_depthstencil_view_interfaces);
+    queue_test(test_create_rendertarget_view);
+    queue_test(test_render_target_views);
+    queue_test(test_layered_rendering);
+    queue_test(test_create_shader_resource_view);
+    queue_test(test_create_shader);
+    queue_test(test_create_sampler_state);
+    queue_test(test_create_blend_state);
+    queue_test(test_create_depthstencil_state);
+    queue_test(test_create_rasterizer_state);
+    queue_test(test_create_query);
+    queue_test(test_occlusion_query);
+    queue_test(test_pipeline_statistics_query);
+    queue_test(test_timestamp_query);
+    queue_test(test_device_removed_reason);
+    queue_test(test_scissor);
+    queue_test(test_clear_state);
+    queue_test(test_blend);
+    queue_test(test_texture1d);
+    queue_test(test_texture);
+    queue_test(test_cube_maps);
+    queue_test(test_depth_stencil_sampling);
+    queue_test(test_multiple_render_targets);
+    queue_test(test_private_data);
+    queue_test(test_state_refcounting);
+    queue_test(test_il_append_aligned);
+    queue_test(test_instance_id);
+    queue_test(test_fragment_coords);
+    queue_test(test_update_subresource);
+    queue_test(test_copy_subresource_region);
+    queue_test(test_copy_subresource_region_1d);
+    queue_test(test_resource_access);
+    queue_test(test_check_multisample_quality_levels);
+    queue_test(test_cb_relative_addressing);
+    queue_test(test_vs_input_relative_addressing);
+    queue_test(test_swapchain_formats);
+    queue_test(test_swapchain_views);
+    queue_test(test_swapchain_flip);
+    queue_test(test_clear_render_target_view_1d);
+    queue_test(test_clear_render_target_view_2d);
+    queue_test(test_clear_depth_stencil_view);
+    queue_test(test_initial_depth_stencil_state);
+    queue_test(test_draw_depth_only);
+    queue_test(test_shader_stage_input_output_matching);
+    queue_test(test_shader_interstage_interface);
+    queue_test(test_sm4_if_instruction);
+    queue_test(test_sm4_breakc_instruction);
+    queue_test(test_sm4_continuec_instruction);
+    queue_test(test_sm4_discard_instruction);
+    queue_test(test_create_input_layout);
+    queue_test(test_input_assembler);
+    queue_test(test_null_sampler);
+    queue_test(test_immediate_constant_buffer);
+    queue_test(test_fp_specials);
+    queue_test(test_uint_shader_instructions);
+    queue_test(test_index_buffer_offset);
+    queue_test(test_face_culling);
+    queue_test(test_line_antialiasing_blending);
+    queue_test(test_required_format_support);
+    queue_test(test_ddy);
+    queue_test(test_shader_input_registers_limits);
+    queue_test(test_unbind_shader_resource_view);
+    queue_test(test_stencil_separate);
+    queue_test(test_sm4_ret_instruction);
+    queue_test(test_primitive_restart);
+    queue_test(test_resinfo_instruction);
+    queue_test(test_render_target_device_mismatch);
+    queue_test(test_buffer_srv);
+    queue_test(test_geometry_shader);
+    queue_test(test_stream_output);
+    queue_test(test_stream_output_resume);
+    queue_test(test_depth_bias);
+    queue_test(test_format_compatibility);
+    queue_test(test_clip_distance);
+    queue_test(test_combined_clip_and_cull_distances);
+    queue_test(test_generate_mips);
+    queue_test(test_alpha_to_coverage);
+    queue_test(test_unbound_multisample_texture);
+    queue_test(test_multiple_viewports);
+    queue_test(test_multisample_resolve);
+    queue_test(test_depth_clip);
+
+    run_queued_tests();
+
+    /* There should be no reason this test can't be run in parallel with the
+     * others, yet it fails when doing so. (AMD Radeon HD 6310, Windows 7) */
     test_stream_output_vs();
-    test_depth_bias();
-    test_format_compatibility();
-    test_clip_distance();
-    test_combined_clip_and_cull_distances();
-    test_generate_mips();
-    test_alpha_to_coverage();
-    test_unbound_multisample_texture();
-    test_multiple_viewports();
-    test_multisample_resolve();
-    test_depth_clip();
 }
-- 
2.11.0




More information about the wine-devel mailing list