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(); }