From 8089f3109a656e8913caec01f5e0c6e86a6c205d Mon Sep 17 00:00:00 2001 From: Christian Legnitto Date: Sat, 22 Mar 2025 09:44:51 -0400 Subject: [PATCH] Add differential testing harness This runs wgsl shaders and rust shaders and compares the output. If the output differs, the test fails. Differential testing is better than snapshot testing or golden file testing as there are no reference files to get outdated. --- .cargo/config.toml | 1 + .github/workflows/ci.yaml | 17 +- Cargo.lock | 417 ++-- Cargo.toml | 6 +- deny.toml | 2 + docs/src/testing.md | 12 +- tests/{ => compiletests}/Cargo.toml | 0 tests/{ => compiletests}/README.md | 0 .../{ => compiletests}/deps-helper/Cargo.toml | 0 .../{ => compiletests}/deps-helper/src/lib.rs | 0 tests/{ => compiletests}/src/main.rs | 2 +- tests/{ => compiletests}/ui/arch/all.rs | 0 tests/{ => compiletests}/ui/arch/all.stderr | 0 .../ui/arch/all_memory_barrier.rs | 0 .../ui/arch/all_memory_barrier.stderr | 0 .../all_memory_barrier_with_group_sync.rs | 0 .../all_memory_barrier_with_group_sync.stderr | 0 tests/{ => compiletests}/ui/arch/any.rs | 0 tests/{ => compiletests}/ui/arch/any.stderr | 0 .../ui/arch/atomic_i_increment.rs | 0 .../ui/arch/control_barrier.rs | 0 ...convert_u_to_acceleration_structure_khr.rs | 0 .../ui/arch/debug_printf.rs | 0 .../ui/arch/debug_printf_type_checking.rs | 0 .../ui/arch/debug_printf_type_checking.stderr | 0 .../ui/arch/demote_to_helper_invocation.rs | 0 .../ui/arch/device_memory_barrier.rs | 0 .../ui/arch/device_memory_barrier.stderr | 0 .../device_memory_barrier_with_group_sync.rs | 0 ...vice_memory_barrier_with_group_sync.stderr | 0 .../ui/arch/emit_stream_vertex.rs | 0 .../{ => compiletests}/ui/arch/emit_vertex.rs | 0 .../ui/arch/end_primitive.rs | 0 .../ui/arch/end_stream_primitive.rs | 0 .../ui/arch/execute_callable.rs | 0 .../ui/arch/ignore_intersection_khr.rs | 0 .../ui/arch/index_unchecked.rs | 0 .../ui/arch/integer_min_and_max.rs | 0 tests/{ => compiletests}/ui/arch/kill.rs | 0 .../ui/arch/memory_barrier.rs | 0 .../ui/arch/mesh_shader_output_lines.rs | 0 .../ui/arch/mesh_shader_output_points.rs | 0 .../ui/arch/mesh_shader_output_triangles.rs | 0 .../ui/arch/mesh_shader_payload.rs | 0 .../ui/arch/mesh_shader_per_primitive.rs | 0 .../ray_query_confirm_intersection_khr.rs | 0 ...query_get_intersection_barycentrics_khr.rs | 0 ..._intersection_candidate_aabb_opaque_khr.rs | 0 ...y_query_get_intersection_front_face_khr.rs | 0 ...ery_get_intersection_geometry_index_khr.rs | 0 ..._intersection_instance_custom_index_khr.rs | 0 ..._query_get_intersection_instance_id_khr.rs | 0 ...t_intersection_object_ray_direction_khr.rs | 0 ..._get_intersection_object_ray_origin_khr.rs | 0 ...ry_get_intersection_object_to_world_khr.rs | 0 ...ry_get_intersection_primitive_index_khr.rs | 0 ..._shader_binding_table_record_offset_khr.rs | 0 .../arch/ray_query_get_intersection_t_khr.rs | 0 .../ray_query_get_intersection_type_khr.rs | 0 .../ui/arch/ray_query_get_ray_flags_khr.rs | 0 .../ui/arch/ray_query_get_ray_t_min_khr.rs | 0 .../ray_query_get_world_ray_direction_khr.rs | 0 .../ray_query_get_world_ray_origin_khr.rs | 0 .../ui/arch/ray_query_initialize_khr.rs | 0 .../ui/arch/ray_query_terminate_khr.rs | 0 .../ui/arch/read_clock_khr.rs | 0 .../ui/arch/report_intersection_khr.rs | 0 .../ui/arch/subgroup/subgroup_ballot.rs | 0 .../ui/arch/subgroup/subgroup_ballot.stderr | 0 .../subgroup/subgroup_ballot_bit_count.rs | 0 .../subgroup/subgroup_ballot_bit_count.stderr | 0 .../arch/subgroup/subgroup_broadcast_first.rs | 0 .../subgroup/subgroup_broadcast_first.stderr | 0 .../ui/arch/subgroup/subgroup_builtins.rs | 0 .../ui/arch/subgroup/subgroup_elect.rs | 0 .../ui/arch/subgroup/subgroup_elect.stderr | 0 .../arch/subgroup/subgroup_i_add_clustered.rs | 0 .../subgroup/subgroup_i_add_clustered.stderr | 0 .../subgroup/subgroup_i_add_exclusive_scan.rs | 0 .../subgroup_i_add_exclusive_scan.stderr | 0 .../subgroup/subgroup_i_add_inclusive_scan.rs | 0 .../subgroup_i_add_inclusive_scan.stderr | 0 .../ui/arch/subgroup/subgroup_i_add_reduce.rs | 0 .../subgroup/subgroup_i_add_reduce.stderr | 0 .../{ => compiletests}/ui/arch/task_shader.rs | 0 .../ui/arch/task_shader_mispile.rs | 0 .../ui/arch/task_shader_payload.rs | 0 .../ui/arch/terminate_ray_khr.rs | 0 .../ui/arch/trace_ray_khr.rs | 0 .../ui/arch/vector_extract_dynamic.rs | 0 .../ui/arch/vector_insert_dynamic.rs | 0 .../ui/arch/workgroup_memory_barrier.rs | 0 .../ui/arch/workgroup_memory_barrier.stderr | 0 ...orkgroup_memory_barrier_with_group_sync.rs | 0 ...roup_memory_barrier_with_group_sync.stderr | 0 .../ui/byte_addressable_buffer/arr.rs | 0 .../ui/byte_addressable_buffer/big_struct.rs | 0 .../ui/byte_addressable_buffer/complex.rs | 0 .../byte_addressable_buffer/empty_struct.rs | 0 .../ui/byte_addressable_buffer/f32.rs | 0 .../byte_addressable_buffer/small_struct.rs | 0 .../ui/byte_addressable_buffer/u32.rs | 0 .../ui/byte_addressable_buffer/vec.rs | 0 .../{ => compiletests}/ui/dis/add_two_ints.rs | 0 .../ui/dis/add_two_ints.stderr | 0 tests/{ => compiletests}/ui/dis/asm.rs | 0 tests/{ => compiletests}/ui/dis/asm.stderr | 0 .../ui/dis/asm_add_two_ints.rs | 0 .../ui/dis/asm_add_two_ints.stderr | 0 .../ui/dis/asm_op_decorate.rs | 0 .../ui/dis/asm_op_decorate.stderr | 0 .../ui/dis/complex_image_sample_inst.rs | 0 .../ui/dis/complex_image_sample_inst.stderr | 0 .../ui/dis/custom_entry_point.rs | 0 .../ui/dis/custom_entry_point.stderr | 0 .../ui/dis/entry-pass-mode-cast-array.rs | 0 .../ui/dis/entry-pass-mode-cast-array.stderr | 0 .../ui/dis/generic-fn-op-name.rs | 0 .../ui/dis/generic-fn-op-name.stderr | 0 .../ui/dis/index_user_dst.rs | 0 .../ui/dis/index_user_dst.stderr | 0 tests/{ => compiletests}/ui/dis/issue-1062.rs | 0 .../ui/dis/issue-1062.stderr | 0 tests/{ => compiletests}/ui/dis/issue-373.rs | 0 .../ui/dis/issue-373.stderr | 0 .../ui/dis/issue-723-output.rs | 0 .../ui/dis/issue-723-output.stderr | 0 tests/{ => compiletests}/ui/dis/issue-731.rs | 0 .../ui/dis/issue-731.stderr | 0 .../ui/dis/non-writable-storage_buffer.rs | 0 .../ui/dis/non-writable-storage_buffer.stderr | 0 .../ui/dis/panic_builtin_bounds_check.rs | 0 .../ui/dis/panic_builtin_bounds_check.stderr | 0 .../ui/dis/panic_sequential_many.rs | 0 .../ui/dis/panic_sequential_many.stderr | 0 .../ui/dis/pass-mode-cast-struct.rs | 0 .../ui/dis/pass-mode-cast-struct.stderr | 0 .../ui/dis/ptr_copy.normal.stderr | 0 tests/{ => compiletests}/ui/dis/ptr_copy.rs | 0 .../ui/dis/ptr_copy.via_intrinsic.stderr | 0 tests/{ => compiletests}/ui/dis/ptr_read.rs | 0 .../{ => compiletests}/ui/dis/ptr_read.stderr | 0 .../ui/dis/ptr_read_method.rs | 0 .../ui/dis/ptr_read_method.stderr | 0 tests/{ => compiletests}/ui/dis/ptr_write.rs | 0 .../ui/dis/ptr_write.stderr | 0 .../ui/dis/ptr_write_method.rs | 0 .../ui/dis/ptr_write_method.stderr | 0 .../ui/dis/spec_constant-attr.rs | 0 .../ui/dis/spec_constant-attr.stderr | 0 .../ui/dis/target_features.stderr | 0 .../ui/glam/mat3_vec3_multiply.rs | 0 tests/{ => compiletests}/ui/hello_world.rs | 0 .../{ => compiletests}/ui/image/components.rs | 0 tests/{ => compiletests}/ui/image/fetch.rs | 0 tests/{ => compiletests}/ui/image/format.rs | 0 tests/{ => compiletests}/ui/image/gather.rs | 0 .../{ => compiletests}/ui/image/gather_err.rs | 0 .../ui/image/gather_err.stderr | 0 .../{ => compiletests}/ui/image/image_with.rs | 0 .../ui/image/implicit_not_in_fragment.rs | 0 .../ui/image/implicit_not_in_fragment.stderr | 0 .../{ => compiletests}/ui/image/issue-330.rs | 0 .../{ => compiletests}/ui/image/issue_527.rs | 0 .../ui/image/query/query_levels.rs | 0 .../ui/image/query/query_levels_err.rs | 0 .../ui/image/query/query_levels_err.stderr | 0 .../ui/image/query/query_lod.rs | 0 .../ui/image/query/query_lod_err.rs | 0 .../ui/image/query/query_lod_err.stderr | 0 .../ui/image/query/query_samples.rs | 0 .../ui/image/query/query_size.rs | 0 .../ui/image/query/query_size_err.rs | 0 .../ui/image/query/query_size_err.stderr | 0 .../ui/image/query/query_size_lod.rs | 0 .../ui/image/query/query_size_lod_err.rs | 0 .../ui/image/query/query_size_lod_err.stderr | 0 tests/{ => compiletests}/ui/image/read.rs | 0 .../ui/image/read_subpass.rs | 0 tests/{ => compiletests}/ui/image/sample.rs | 0 .../ui/image/sample_bias.rs | 0 .../ui/image/sample_depth_reference/sample.rs | 0 .../sample_depth_reference/sample_gradient.rs | 0 .../sample_depth_reference/sample_lod.rs | 0 .../sample.rs | 0 .../sample_gradient.rs | 0 .../sample_lod.rs | 0 .../ui/image/sample_gradient.rs | 0 .../{ => compiletests}/ui/image/sample_lod.rs | 0 .../sample_with_project_coordinate/sample.rs | 0 .../sample_gradient.rs | 0 .../sample_lod.rs | 0 tests/{ => compiletests}/ui/image/write.rs | 0 .../ui/lang/asm/block_tracking_fail.rs | 0 .../ui/lang/asm/block_tracking_fail.stderr | 0 .../ui/lang/asm/block_tracking_pass.rs | 0 .../ui/lang/asm/const_args.rs | 0 .../ui/lang/asm/infer-access-chain-array.rs | 0 .../ui/lang/asm/infer-access-chain-slice.rs | 0 .../ui/lang/asm/issue-1002.rs | 0 .../ui/lang/asm/issue-1002.stderr | 0 .../ui/lang/consts/issue-1024.rs | 0 .../ui/lang/consts/issue-329.rs | 0 .../ui/lang/consts/issue-834.rs | 0 .../ui/lang/consts/nested-ref-in-composite.rs | 0 .../consts/nested-ref-in-composite.stderr | 0 .../ui/lang/consts/nested-ref.rs | 0 .../ui/lang/consts/nested-ref.stderr | 0 .../ui/lang/consts/shallow-ref.rs | 0 .../ui/lang/control_flow/closure_multi.rs | 0 .../ui/lang/control_flow/defer.rs | 0 .../ui/lang/control_flow/for_range.rs | 0 .../ui/lang/control_flow/for_range_signed.rs | 0 .../for_with_custom_range_iter.rs | 0 .../ui/lang/control_flow/if.rs | 0 .../ui/lang/control_flow/if_else.rs | 0 .../ui/lang/control_flow/if_else_if_else.rs | 0 .../ui/lang/control_flow/if_if.rs | 0 .../ui/lang/control_flow/if_return_else.rs | 0 .../control_flow/if_return_else_return.rs | 0 .../ui/lang/control_flow/if_while.rs | 0 .../ui/lang/control_flow/ifx2.rs | 0 .../ui/lang/control_flow/issue_283.rs | 0 .../ui/lang/control_flow/issue_764.rs | 0 .../ui/lang/control_flow/issue_764.stderr | 0 .../ui/lang/control_flow/loop.rs | 0 .../ui/lang/control_flow/while.rs | 0 .../ui/lang/control_flow/while_break.rs | 0 .../ui/lang/control_flow/while_continue.rs | 0 .../ui/lang/control_flow/while_if_break.rs | 0 .../control_flow/while_if_break_else_break.rs | 0 .../control_flow/while_if_break_if_break.rs | 0 .../ui/lang/control_flow/while_if_continue.rs | 0 .../while_if_continue_else_continue.rs | 0 .../ui/lang/control_flow/while_return.rs | 0 .../ui/lang/control_flow/while_while.rs | 0 .../ui/lang/control_flow/while_while_break.rs | 0 .../lang/control_flow/while_while_continue.rs | 0 .../lang/control_flow/while_while_if_break.rs | 0 .../control_flow/while_while_if_continue.rs | 0 .../ui/lang/core/intrinsics/bswap.rs | 0 .../ui/lang/core/intrinsics/log10.rs | 0 .../core/mem/create_unitialized_memory.rs | 0 .../ui/lang/core/ops/logical_and.rs | 0 .../ui/lang/core/ops/range-contains.rs | 0 .../ui/lang/core/ptr/allocate_const_scalar.rs | 0 .../core/ptr/allocate_const_scalar.stderr | 0 .../ui/lang/core/ptr/allocate_null.rs | 0 .../ui/lang/core/ptr/allocate_vec_like.rs | 0 .../ui/lang/core/ptr/allocate_vec_like.stderr | 0 .../ui/lang/core/ref/member_ref_arg-broken.rs | 0 .../core/ref/member_ref_arg-broken.stderr | 0 .../ui/lang/core/ref/member_ref_arg.rs | 0 .../ui/lang/core/ref/member_ref_arg.stderr | 0 .../core/ref/zst_member_ref_arg-broken.rs | 0 .../core/ref/zst_member_ref_arg-broken.stderr | 0 .../ui/lang/core/ref/zst_member_ref_arg.rs | 0 .../ui/lang/core/unwrap_or.rs | 0 .../ui/lang/core/unwrap_or.stderr | 0 .../{ => compiletests}/ui/lang/f32/packing.rs | 0 .../{ => compiletests}/ui/lang/f32/signum.rs | 0 tests/{ => compiletests}/ui/lang/issue-415.rs | 0 tests/{ => compiletests}/ui/lang/issue-46.rs | 0 tests/{ => compiletests}/ui/lang/issue-836.rs | 0 .../ui/lang/panic/builtin.rs | 0 .../ui/lang/panic/builtin_bounds_check.rs | 0 .../ui/lang/panic/simple.rs | 0 .../ui/lang/panic/track_caller.rs | 0 .../ui/lang/panic/track_caller.stderr | 0 .../ui/spirv-attr/all-builtins.rs | 0 .../ui/spirv-attr/bad-deduce-storage-class.rs | 0 .../bad-deduce-storage-class.stderr | 0 .../ui/spirv-attr/bool-inputs-err.rs | 0 .../ui/spirv-attr/bool-inputs-err.stderr | 0 .../ui/spirv-attr/bool-inputs.rs | 0 .../ui/spirv-attr/int-without-flat.rs | 0 .../ui/spirv-attr/int-without-flat.stderr | 0 .../spirv-attr/invalid-matrix-type-empty.rs | 0 .../invalid-matrix-type-empty.stderr | 0 .../ui/spirv-attr/invalid-matrix-type.rs | 0 .../ui/spirv-attr/invalid-matrix-type.stderr | 0 .../ui/spirv-attr/invalid-storage-class.rs | 0 .../spirv-attr/invalid-storage-class.stderr | 0 .../ui/spirv-attr/invalid-target.rs | 0 .../ui/spirv-attr/invalid-target.stderr | 0 .../ui/spirv-attr/invariant-invalid.rs | 0 .../ui/spirv-attr/invariant-invalid.stderr | 0 .../ui/spirv-attr/invariant.rs | 0 .../ui/spirv-attr/matrix-type.rs | 0 .../ui/spirv-attr/multiple.rs | 0 .../ui/spirv-attr/multiple.stderr | 0 .../ui/storage_class/mutability-errors.rs | 0 .../ui/storage_class/mutability-errors.stderr | 0 .../ui/storage_class/push_constant.rs | 0 .../storage_class/runtime_descriptor_array.rs | 0 .../runtime_descriptor_array_error.rs | 0 .../runtime_descriptor_array_error.stderr | 0 .../ui/storage_class/storage_buffer-dst.rs | 0 .../ui/storage_class/typed_buffer.rs | 0 .../typed_buffer_descriptor_array.rs | 0 .../typed_buffer_descriptor_array_slice.rs | 0 .../ui/storage_class/typed_buffer_slice.rs | 0 .../ui/target_features_err.rs | 0 .../ui/target_features_err.stderr | 0 tests/difftests/README.md | 150 ++ tests/difftests/bin/Cargo.toml | 38 + tests/difftests/bin/src/main.rs | 96 + tests/difftests/bin/src/runner.rs | 456 ++++ tests/difftests/lib/Cargo.toml | 31 + tests/difftests/lib/src/config.rs | 24 + tests/difftests/lib/src/lib.rs | 18 + .../difftests/lib/src/scaffold/compute/mod.rs | 2 + .../lib/src/scaffold/compute/wgpu.rs | 361 +++ tests/difftests/lib/src/scaffold/mod.rs | 1 + tests/difftests/tests/Cargo.lock | 1977 +++++++++++++++++ tests/difftests/tests/Cargo.toml | 53 + .../simple-compute-rust/Cargo.toml | 20 + .../simple-compute-rust/src/lib.rs | 9 + .../simple-compute-rust/src/main.rs | 14 + .../simple-compute-wgsl/Cargo.toml | 9 + .../simple-compute-wgsl/shader.wgsl | 7 + .../simple-compute-wgsl/src/main.rs | 14 + tests/ui/arch/derivative.rs | 16 - tests/ui/arch/derivative.stderr | 11 - tests/ui/arch/derivative_control.rs | 21 - tests/ui/arch/derivative_control.stderr | 17 - 326 files changed, 3571 insertions(+), 231 deletions(-) rename tests/{ => compiletests}/Cargo.toml (100%) rename tests/{ => compiletests}/README.md (100%) rename tests/{ => compiletests}/deps-helper/Cargo.toml (100%) rename tests/{ => compiletests}/deps-helper/src/lib.rs (100%) rename tests/{ => compiletests}/src/main.rs (99%) rename tests/{ => compiletests}/ui/arch/all.rs (100%) rename tests/{ => compiletests}/ui/arch/all.stderr (100%) rename tests/{ => compiletests}/ui/arch/all_memory_barrier.rs (100%) rename tests/{ => compiletests}/ui/arch/all_memory_barrier.stderr (100%) rename tests/{ => compiletests}/ui/arch/all_memory_barrier_with_group_sync.rs (100%) rename tests/{ => compiletests}/ui/arch/all_memory_barrier_with_group_sync.stderr (100%) rename tests/{ => compiletests}/ui/arch/any.rs (100%) rename tests/{ => compiletests}/ui/arch/any.stderr (100%) rename tests/{ => compiletests}/ui/arch/atomic_i_increment.rs (100%) rename tests/{ => compiletests}/ui/arch/control_barrier.rs (100%) rename tests/{ => compiletests}/ui/arch/convert_u_to_acceleration_structure_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/debug_printf.rs (100%) rename tests/{ => compiletests}/ui/arch/debug_printf_type_checking.rs (100%) rename tests/{ => compiletests}/ui/arch/debug_printf_type_checking.stderr (100%) rename tests/{ => compiletests}/ui/arch/demote_to_helper_invocation.rs (100%) rename tests/{ => compiletests}/ui/arch/device_memory_barrier.rs (100%) rename tests/{ => compiletests}/ui/arch/device_memory_barrier.stderr (100%) rename tests/{ => compiletests}/ui/arch/device_memory_barrier_with_group_sync.rs (100%) rename tests/{ => compiletests}/ui/arch/device_memory_barrier_with_group_sync.stderr (100%) rename tests/{ => compiletests}/ui/arch/emit_stream_vertex.rs (100%) rename tests/{ => compiletests}/ui/arch/emit_vertex.rs (100%) rename tests/{ => compiletests}/ui/arch/end_primitive.rs (100%) rename tests/{ => compiletests}/ui/arch/end_stream_primitive.rs (100%) rename tests/{ => compiletests}/ui/arch/execute_callable.rs (100%) rename tests/{ => compiletests}/ui/arch/ignore_intersection_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/index_unchecked.rs (100%) rename tests/{ => compiletests}/ui/arch/integer_min_and_max.rs (100%) rename tests/{ => compiletests}/ui/arch/kill.rs (100%) rename tests/{ => compiletests}/ui/arch/memory_barrier.rs (100%) rename tests/{ => compiletests}/ui/arch/mesh_shader_output_lines.rs (100%) rename tests/{ => compiletests}/ui/arch/mesh_shader_output_points.rs (100%) rename tests/{ => compiletests}/ui/arch/mesh_shader_output_triangles.rs (100%) rename tests/{ => compiletests}/ui/arch/mesh_shader_payload.rs (100%) rename tests/{ => compiletests}/ui/arch/mesh_shader_per_primitive.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_confirm_intersection_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_barycentrics_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_candidate_aabb_opaque_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_front_face_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_geometry_index_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_instance_custom_index_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_instance_id_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_object_ray_direction_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_object_ray_origin_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_object_to_world_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_primitive_index_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_shader_binding_table_record_offset_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_t_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_intersection_type_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_ray_flags_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_ray_t_min_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_world_ray_direction_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_get_world_ray_origin_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_initialize_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/ray_query_terminate_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/read_clock_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/report_intersection_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_ballot.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_ballot.stderr (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_ballot_bit_count.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_ballot_bit_count.stderr (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_broadcast_first.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_broadcast_first.stderr (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_builtins.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_elect.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_elect.stderr (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_i_add_clustered.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_i_add_clustered.stderr (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_i_add_exclusive_scan.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_i_add_exclusive_scan.stderr (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_i_add_inclusive_scan.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_i_add_inclusive_scan.stderr (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_i_add_reduce.rs (100%) rename tests/{ => compiletests}/ui/arch/subgroup/subgroup_i_add_reduce.stderr (100%) rename tests/{ => compiletests}/ui/arch/task_shader.rs (100%) rename tests/{ => compiletests}/ui/arch/task_shader_mispile.rs (100%) rename tests/{ => compiletests}/ui/arch/task_shader_payload.rs (100%) rename tests/{ => compiletests}/ui/arch/terminate_ray_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/trace_ray_khr.rs (100%) rename tests/{ => compiletests}/ui/arch/vector_extract_dynamic.rs (100%) rename tests/{ => compiletests}/ui/arch/vector_insert_dynamic.rs (100%) rename tests/{ => compiletests}/ui/arch/workgroup_memory_barrier.rs (100%) rename tests/{ => compiletests}/ui/arch/workgroup_memory_barrier.stderr (100%) rename tests/{ => compiletests}/ui/arch/workgroup_memory_barrier_with_group_sync.rs (100%) rename tests/{ => compiletests}/ui/arch/workgroup_memory_barrier_with_group_sync.stderr (100%) rename tests/{ => compiletests}/ui/byte_addressable_buffer/arr.rs (100%) rename tests/{ => compiletests}/ui/byte_addressable_buffer/big_struct.rs (100%) rename tests/{ => compiletests}/ui/byte_addressable_buffer/complex.rs (100%) rename tests/{ => compiletests}/ui/byte_addressable_buffer/empty_struct.rs (100%) rename tests/{ => compiletests}/ui/byte_addressable_buffer/f32.rs (100%) rename tests/{ => compiletests}/ui/byte_addressable_buffer/small_struct.rs (100%) rename tests/{ => compiletests}/ui/byte_addressable_buffer/u32.rs (100%) rename tests/{ => compiletests}/ui/byte_addressable_buffer/vec.rs (100%) rename tests/{ => compiletests}/ui/dis/add_two_ints.rs (100%) rename tests/{ => compiletests}/ui/dis/add_two_ints.stderr (100%) rename tests/{ => compiletests}/ui/dis/asm.rs (100%) rename tests/{ => compiletests}/ui/dis/asm.stderr (100%) rename tests/{ => compiletests}/ui/dis/asm_add_two_ints.rs (100%) rename tests/{ => compiletests}/ui/dis/asm_add_two_ints.stderr (100%) rename tests/{ => compiletests}/ui/dis/asm_op_decorate.rs (100%) rename tests/{ => compiletests}/ui/dis/asm_op_decorate.stderr (100%) rename tests/{ => compiletests}/ui/dis/complex_image_sample_inst.rs (100%) rename tests/{ => compiletests}/ui/dis/complex_image_sample_inst.stderr (100%) rename tests/{ => compiletests}/ui/dis/custom_entry_point.rs (100%) rename tests/{ => compiletests}/ui/dis/custom_entry_point.stderr (100%) rename tests/{ => compiletests}/ui/dis/entry-pass-mode-cast-array.rs (100%) rename tests/{ => compiletests}/ui/dis/entry-pass-mode-cast-array.stderr (100%) rename tests/{ => compiletests}/ui/dis/generic-fn-op-name.rs (100%) rename tests/{ => compiletests}/ui/dis/generic-fn-op-name.stderr (100%) rename tests/{ => compiletests}/ui/dis/index_user_dst.rs (100%) rename tests/{ => compiletests}/ui/dis/index_user_dst.stderr (100%) rename tests/{ => compiletests}/ui/dis/issue-1062.rs (100%) rename tests/{ => compiletests}/ui/dis/issue-1062.stderr (100%) rename tests/{ => compiletests}/ui/dis/issue-373.rs (100%) rename tests/{ => compiletests}/ui/dis/issue-373.stderr (100%) rename tests/{ => compiletests}/ui/dis/issue-723-output.rs (100%) rename tests/{ => compiletests}/ui/dis/issue-723-output.stderr (100%) rename tests/{ => compiletests}/ui/dis/issue-731.rs (100%) rename tests/{ => compiletests}/ui/dis/issue-731.stderr (100%) rename tests/{ => compiletests}/ui/dis/non-writable-storage_buffer.rs (100%) rename tests/{ => compiletests}/ui/dis/non-writable-storage_buffer.stderr (100%) rename tests/{ => compiletests}/ui/dis/panic_builtin_bounds_check.rs (100%) rename tests/{ => compiletests}/ui/dis/panic_builtin_bounds_check.stderr (100%) rename tests/{ => compiletests}/ui/dis/panic_sequential_many.rs (100%) rename tests/{ => compiletests}/ui/dis/panic_sequential_many.stderr (100%) rename tests/{ => compiletests}/ui/dis/pass-mode-cast-struct.rs (100%) rename tests/{ => compiletests}/ui/dis/pass-mode-cast-struct.stderr (100%) rename tests/{ => compiletests}/ui/dis/ptr_copy.normal.stderr (100%) rename tests/{ => compiletests}/ui/dis/ptr_copy.rs (100%) rename tests/{ => compiletests}/ui/dis/ptr_copy.via_intrinsic.stderr (100%) rename tests/{ => compiletests}/ui/dis/ptr_read.rs (100%) rename tests/{ => compiletests}/ui/dis/ptr_read.stderr (100%) rename tests/{ => compiletests}/ui/dis/ptr_read_method.rs (100%) rename tests/{ => compiletests}/ui/dis/ptr_read_method.stderr (100%) rename tests/{ => compiletests}/ui/dis/ptr_write.rs (100%) rename tests/{ => compiletests}/ui/dis/ptr_write.stderr (100%) rename tests/{ => compiletests}/ui/dis/ptr_write_method.rs (100%) rename tests/{ => compiletests}/ui/dis/ptr_write_method.stderr (100%) rename tests/{ => compiletests}/ui/dis/spec_constant-attr.rs (100%) rename tests/{ => compiletests}/ui/dis/spec_constant-attr.stderr (100%) rename tests/{ => compiletests}/ui/dis/target_features.stderr (100%) rename tests/{ => compiletests}/ui/glam/mat3_vec3_multiply.rs (100%) rename tests/{ => compiletests}/ui/hello_world.rs (100%) rename tests/{ => compiletests}/ui/image/components.rs (100%) rename tests/{ => compiletests}/ui/image/fetch.rs (100%) rename tests/{ => compiletests}/ui/image/format.rs (100%) rename tests/{ => compiletests}/ui/image/gather.rs (100%) rename tests/{ => compiletests}/ui/image/gather_err.rs (100%) rename tests/{ => compiletests}/ui/image/gather_err.stderr (100%) rename tests/{ => compiletests}/ui/image/image_with.rs (100%) rename tests/{ => compiletests}/ui/image/implicit_not_in_fragment.rs (100%) rename tests/{ => compiletests}/ui/image/implicit_not_in_fragment.stderr (100%) rename tests/{ => compiletests}/ui/image/issue-330.rs (100%) rename tests/{ => compiletests}/ui/image/issue_527.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_levels.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_levels_err.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_levels_err.stderr (100%) rename tests/{ => compiletests}/ui/image/query/query_lod.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_lod_err.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_lod_err.stderr (100%) rename tests/{ => compiletests}/ui/image/query/query_samples.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_size.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_size_err.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_size_err.stderr (100%) rename tests/{ => compiletests}/ui/image/query/query_size_lod.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_size_lod_err.rs (100%) rename tests/{ => compiletests}/ui/image/query/query_size_lod_err.stderr (100%) rename tests/{ => compiletests}/ui/image/read.rs (100%) rename tests/{ => compiletests}/ui/image/read_subpass.rs (100%) rename tests/{ => compiletests}/ui/image/sample.rs (100%) rename tests/{ => compiletests}/ui/image/sample_bias.rs (100%) rename tests/{ => compiletests}/ui/image/sample_depth_reference/sample.rs (100%) rename tests/{ => compiletests}/ui/image/sample_depth_reference/sample_gradient.rs (100%) rename tests/{ => compiletests}/ui/image/sample_depth_reference/sample_lod.rs (100%) rename tests/{ => compiletests}/ui/image/sample_depth_reference_with_project_coordinate/sample.rs (100%) rename tests/{ => compiletests}/ui/image/sample_depth_reference_with_project_coordinate/sample_gradient.rs (100%) rename tests/{ => compiletests}/ui/image/sample_depth_reference_with_project_coordinate/sample_lod.rs (100%) rename tests/{ => compiletests}/ui/image/sample_gradient.rs (100%) rename tests/{ => compiletests}/ui/image/sample_lod.rs (100%) rename tests/{ => compiletests}/ui/image/sample_with_project_coordinate/sample.rs (100%) rename tests/{ => compiletests}/ui/image/sample_with_project_coordinate/sample_gradient.rs (100%) rename tests/{ => compiletests}/ui/image/sample_with_project_coordinate/sample_lod.rs (100%) rename tests/{ => compiletests}/ui/image/write.rs (100%) rename tests/{ => compiletests}/ui/lang/asm/block_tracking_fail.rs (100%) rename tests/{ => compiletests}/ui/lang/asm/block_tracking_fail.stderr (100%) rename tests/{ => compiletests}/ui/lang/asm/block_tracking_pass.rs (100%) rename tests/{ => compiletests}/ui/lang/asm/const_args.rs (100%) rename tests/{ => compiletests}/ui/lang/asm/infer-access-chain-array.rs (100%) rename tests/{ => compiletests}/ui/lang/asm/infer-access-chain-slice.rs (100%) rename tests/{ => compiletests}/ui/lang/asm/issue-1002.rs (100%) rename tests/{ => compiletests}/ui/lang/asm/issue-1002.stderr (100%) rename tests/{ => compiletests}/ui/lang/consts/issue-1024.rs (100%) rename tests/{ => compiletests}/ui/lang/consts/issue-329.rs (100%) rename tests/{ => compiletests}/ui/lang/consts/issue-834.rs (100%) rename tests/{ => compiletests}/ui/lang/consts/nested-ref-in-composite.rs (100%) rename tests/{ => compiletests}/ui/lang/consts/nested-ref-in-composite.stderr (100%) rename tests/{ => compiletests}/ui/lang/consts/nested-ref.rs (100%) rename tests/{ => compiletests}/ui/lang/consts/nested-ref.stderr (100%) rename tests/{ => compiletests}/ui/lang/consts/shallow-ref.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/closure_multi.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/defer.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/for_range.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/for_range_signed.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/for_with_custom_range_iter.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/if.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/if_else.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/if_else_if_else.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/if_if.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/if_return_else.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/if_return_else_return.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/if_while.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/ifx2.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/issue_283.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/issue_764.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/issue_764.stderr (100%) rename tests/{ => compiletests}/ui/lang/control_flow/loop.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_break.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_continue.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_if_break.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_if_break_else_break.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_if_break_if_break.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_if_continue.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_if_continue_else_continue.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_return.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_while.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_while_break.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_while_continue.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_while_if_break.rs (100%) rename tests/{ => compiletests}/ui/lang/control_flow/while_while_if_continue.rs (100%) rename tests/{ => compiletests}/ui/lang/core/intrinsics/bswap.rs (100%) rename tests/{ => compiletests}/ui/lang/core/intrinsics/log10.rs (100%) rename tests/{ => compiletests}/ui/lang/core/mem/create_unitialized_memory.rs (100%) rename tests/{ => compiletests}/ui/lang/core/ops/logical_and.rs (100%) rename tests/{ => compiletests}/ui/lang/core/ops/range-contains.rs (100%) rename tests/{ => compiletests}/ui/lang/core/ptr/allocate_const_scalar.rs (100%) rename tests/{ => compiletests}/ui/lang/core/ptr/allocate_const_scalar.stderr (100%) rename tests/{ => compiletests}/ui/lang/core/ptr/allocate_null.rs (100%) rename tests/{ => compiletests}/ui/lang/core/ptr/allocate_vec_like.rs (100%) rename tests/{ => compiletests}/ui/lang/core/ptr/allocate_vec_like.stderr (100%) rename tests/{ => compiletests}/ui/lang/core/ref/member_ref_arg-broken.rs (100%) rename tests/{ => compiletests}/ui/lang/core/ref/member_ref_arg-broken.stderr (100%) rename tests/{ => compiletests}/ui/lang/core/ref/member_ref_arg.rs (100%) rename tests/{ => compiletests}/ui/lang/core/ref/member_ref_arg.stderr (100%) rename tests/{ => compiletests}/ui/lang/core/ref/zst_member_ref_arg-broken.rs (100%) rename tests/{ => compiletests}/ui/lang/core/ref/zst_member_ref_arg-broken.stderr (100%) rename tests/{ => compiletests}/ui/lang/core/ref/zst_member_ref_arg.rs (100%) rename tests/{ => compiletests}/ui/lang/core/unwrap_or.rs (100%) rename tests/{ => compiletests}/ui/lang/core/unwrap_or.stderr (100%) rename tests/{ => compiletests}/ui/lang/f32/packing.rs (100%) rename tests/{ => compiletests}/ui/lang/f32/signum.rs (100%) rename tests/{ => compiletests}/ui/lang/issue-415.rs (100%) rename tests/{ => compiletests}/ui/lang/issue-46.rs (100%) rename tests/{ => compiletests}/ui/lang/issue-836.rs (100%) rename tests/{ => compiletests}/ui/lang/panic/builtin.rs (100%) rename tests/{ => compiletests}/ui/lang/panic/builtin_bounds_check.rs (100%) rename tests/{ => compiletests}/ui/lang/panic/simple.rs (100%) rename tests/{ => compiletests}/ui/lang/panic/track_caller.rs (100%) rename tests/{ => compiletests}/ui/lang/panic/track_caller.stderr (100%) rename tests/{ => compiletests}/ui/spirv-attr/all-builtins.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/bad-deduce-storage-class.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/bad-deduce-storage-class.stderr (100%) rename tests/{ => compiletests}/ui/spirv-attr/bool-inputs-err.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/bool-inputs-err.stderr (100%) rename tests/{ => compiletests}/ui/spirv-attr/bool-inputs.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/int-without-flat.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/int-without-flat.stderr (100%) rename tests/{ => compiletests}/ui/spirv-attr/invalid-matrix-type-empty.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/invalid-matrix-type-empty.stderr (100%) rename tests/{ => compiletests}/ui/spirv-attr/invalid-matrix-type.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/invalid-matrix-type.stderr (100%) rename tests/{ => compiletests}/ui/spirv-attr/invalid-storage-class.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/invalid-storage-class.stderr (100%) rename tests/{ => compiletests}/ui/spirv-attr/invalid-target.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/invalid-target.stderr (100%) rename tests/{ => compiletests}/ui/spirv-attr/invariant-invalid.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/invariant-invalid.stderr (100%) rename tests/{ => compiletests}/ui/spirv-attr/invariant.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/matrix-type.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/multiple.rs (100%) rename tests/{ => compiletests}/ui/spirv-attr/multiple.stderr (100%) rename tests/{ => compiletests}/ui/storage_class/mutability-errors.rs (100%) rename tests/{ => compiletests}/ui/storage_class/mutability-errors.stderr (100%) rename tests/{ => compiletests}/ui/storage_class/push_constant.rs (100%) rename tests/{ => compiletests}/ui/storage_class/runtime_descriptor_array.rs (100%) rename tests/{ => compiletests}/ui/storage_class/runtime_descriptor_array_error.rs (100%) rename tests/{ => compiletests}/ui/storage_class/runtime_descriptor_array_error.stderr (100%) rename tests/{ => compiletests}/ui/storage_class/storage_buffer-dst.rs (100%) rename tests/{ => compiletests}/ui/storage_class/typed_buffer.rs (100%) rename tests/{ => compiletests}/ui/storage_class/typed_buffer_descriptor_array.rs (100%) rename tests/{ => compiletests}/ui/storage_class/typed_buffer_descriptor_array_slice.rs (100%) rename tests/{ => compiletests}/ui/storage_class/typed_buffer_slice.rs (100%) rename tests/{ => compiletests}/ui/target_features_err.rs (100%) rename tests/{ => compiletests}/ui/target_features_err.stderr (100%) create mode 100644 tests/difftests/README.md create mode 100644 tests/difftests/bin/Cargo.toml create mode 100644 tests/difftests/bin/src/main.rs create mode 100644 tests/difftests/bin/src/runner.rs create mode 100644 tests/difftests/lib/Cargo.toml create mode 100644 tests/difftests/lib/src/config.rs create mode 100644 tests/difftests/lib/src/lib.rs create mode 100644 tests/difftests/lib/src/scaffold/compute/mod.rs create mode 100644 tests/difftests/lib/src/scaffold/compute/wgpu.rs create mode 100644 tests/difftests/lib/src/scaffold/mod.rs create mode 100644 tests/difftests/tests/Cargo.lock create mode 100644 tests/difftests/tests/Cargo.toml create mode 100644 tests/difftests/tests/simple-compute/simple-compute-rust/Cargo.toml create mode 100644 tests/difftests/tests/simple-compute/simple-compute-rust/src/lib.rs create mode 100644 tests/difftests/tests/simple-compute/simple-compute-rust/src/main.rs create mode 100644 tests/difftests/tests/simple-compute/simple-compute-wgsl/Cargo.toml create mode 100644 tests/difftests/tests/simple-compute/simple-compute-wgsl/shader.wgsl create mode 100644 tests/difftests/tests/simple-compute/simple-compute-wgsl/src/main.rs delete mode 100644 tests/ui/arch/derivative.rs delete mode 100644 tests/ui/arch/derivative.stderr delete mode 100644 tests/ui/arch/derivative_control.rs delete mode 100644 tests/ui/arch/derivative_control.stderr diff --git a/.cargo/config.toml b/.cargo/config.toml index 9c99fc9e3b..ead4944de9 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,5 +1,6 @@ [alias] compiletest = "run --release -p compiletests --" +difftest = "run --release -p difftests --" [target.'cfg(all())'] rustflags = [ diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e8cd7aa85c..0adc8aa451 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -42,6 +42,13 @@ jobs: - if: ${{ runner.os == 'Linux' }} name: Linux - Install native dependencies run: sudo apt install libwayland-cursor0 libxkbcommon-dev libwayland-dev + - if: ${{ runner.os == 'Linux' }} + name: Install xvfb, llvmpipe and lavapipe + run: | + sudo apt-get update -y -qq + sudo add-apt-repository ppa:kisak/turtle -y + sudo apt-get update + sudo apt install -y xvfb libgl1-mesa-dri libxcb-xfixes0-dev mesa-vulkan-drivers # cargo version is a random command that forces the installation of rust-toolchain - name: install rust-toolchain run: cargo version @@ -64,6 +71,10 @@ jobs: if: ${{ matrix.target != 'aarch64-linux-android' }} run: cargo run -p compiletests --release --no-default-features --features "use-installed-tools" -- --target-env vulkan1.1,vulkan1.2,spv1.3 + - name: difftest + if: ${{ matrix.target != 'aarch64-linux-android' }} + run: cargo run -p difftests --release --no-default-features --features "use-installed-tools" + - name: workspace test if: ${{ matrix.target != 'aarch64-linux-android' }} run: cargo test --release @@ -145,8 +156,10 @@ jobs: run: cargo fetch --locked - name: Rustfmt run: cargo fmt --all -- --check - - name: Rustfmt tests - run: rustfmt --check tests/ui/**/*.rs + - name: Rustfmt compiletests + run: shopt -s globstar && rustfmt --check tests/compiletests/ui/**/*.rs + - name: Rustfmt difftests + run: cargo fmt --check --all --manifest-path tests/difftests/tests/Cargo.toml - name: Check docs are valid run: RUSTDOCFLAGS=-Dwarnings cargo doc --no-deps - name: Check docs for `spirv-std` and `spirv-builder` on stable (for docs.rs) diff --git a/Cargo.lock b/Cargo.lock index 9f99823913..93430df0a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,7 +31,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -59,7 +59,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.6.0", + "bitflags 2.8.0", "cc", "cesu8", "jni", @@ -146,11 +146,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] @@ -257,9 +258,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "block" @@ -278,9 +279,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" @@ -304,9 +305,15 @@ dependencies = [ [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" + +[[package]] +name = "bytesize" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3c8f83209414aacf0eeae3cf730b18d6981697fba62f200fcfb92b9f082acba" [[package]] name = "calloop" @@ -314,7 +321,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "log", "polling", "rustix", @@ -331,14 +338,14 @@ dependencies = [ "calloop", "rustix", "wayland-backend", - "wayland-client 0.31.7", + "wayland-client 0.31.8", ] [[package]] name = "cc" -version = "1.2.6" +version = "1.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" +checksum = "e4730490333d58093109dc02c23174c3f4d490998c3fed3cc8e82d57afedb9cf" dependencies = [ "jobserver", "libc", @@ -371,9 +378,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "clap" -version = "4.5.23" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" dependencies = [ "clap_builder", "clap_derive", @@ -381,9 +388,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", @@ -393,9 +400,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck", "proc-macro2", @@ -644,9 +651,9 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" dependencies = [ "convert_case", "proc-macro2", @@ -661,6 +668,41 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +[[package]] +name = "difftest" +version = "0.9.0" +dependencies = [ + "bytemuck", + "futures", + "rustc_codegen_spirv", + "serde", + "serde_json", + "spirv-builder", + "tempfile", + "thiserror", + "wgpu", +] + +[[package]] +name = "difftests" +version = "0.9.0" +dependencies = [ + "anyhow", + "bytemuck", + "bytesize", + "futures", + "rustc_codegen_spirv", + "serde", + "serde_json", + "spirv-builder", + "tempfile", + "tester", + "thiserror", + "toml", + "tracing", + "tracing-subscriber", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -726,9 +768,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elsa" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98e71ae4df57d214182a2e5cb90230c0192c6ddfcaa05c36453d46a54713e10" +checksum = "2343daaeabe09879d4ea058bb4f1e63da3fc07dadc6634e01bda1b3d6a9d9d2b" dependencies = [ "indexmap", "stable_deref_trait", @@ -1024,7 +1066,19 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", ] [[package]] @@ -1073,9 +1127,9 @@ dependencies = [ [[package]] name = "glutin_wgl_sys" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e1951bbd9434a81aa496fe59ccc2235af3820d27b85f9314e279609211e2c" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" dependencies = [ "gl_generator", ] @@ -1086,7 +1140,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "gpu-alloc-types", ] @@ -1096,7 +1150,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -1117,7 +1171,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "gpu-descriptor-types", "hashbrown 0.15.2", ] @@ -1128,7 +1182,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -1182,9 +1236,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "indexmap" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -1282,9 +1336,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -1361,16 +1415,16 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "libc", "redox_syscall 0.5.8", ] [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litrs" @@ -1390,9 +1444,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "longest-increasing-subsequence" @@ -1448,7 +1502,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block", "core-graphics-types", "foreign-types", @@ -1485,9 +1539,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -1500,7 +1554,7 @@ checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -1536,7 +1590,7 @@ checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg_aliases 0.1.1", "codespan-reporting", "hexf-parse", @@ -1556,7 +1610,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "jni-sys", "log", "ndk-sys 0.6.0+11769913", @@ -1608,7 +1662,7 @@ version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "filetime", "fsevent-sys", "inotify", @@ -1727,7 +1781,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "libc", "objc2", @@ -1743,7 +1797,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-core-location", @@ -1767,7 +1821,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -1799,9 +1853,9 @@ dependencies = [ [[package]] name = "objc2-encode" -version = "4.0.3" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "objc2-foundation" @@ -1809,7 +1863,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "dispatch", "libc", @@ -1834,7 +1888,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -1846,7 +1900,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -1869,7 +1923,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-cloud-kit", @@ -1901,7 +1955,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-core-location", @@ -2003,18 +2057,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", @@ -2023,9 +2077,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -2100,9 +2154,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -2124,9 +2178,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.36.2" +version = "0.37.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" dependencies = [ "memchr", ] @@ -2142,9 +2196,9 @@ dependencies = [ [[package]] name = "range-alloc" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" [[package]] name = "raw-string" @@ -2220,7 +2274,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -2229,7 +2283,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror", ] @@ -2375,11 +2429,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "errno", "itoa", "libc", @@ -2405,9 +2459,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -2478,9 +2532,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" @@ -2504,9 +2558,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -2514,6 +2568,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -2586,7 +2649,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "calloop", "calloop-wayland-source", "cursor-icon", @@ -2596,12 +2659,12 @@ dependencies = [ "rustix", "thiserror", "wayland-backend", - "wayland-client 0.31.7", + "wayland-client 0.31.8", "wayland-csd-frame", - "wayland-cursor 0.31.7", - "wayland-protocols 0.32.5", + "wayland-cursor 0.31.8", + "wayland-protocols 0.32.6", "wayland-protocols-wlr", - "wayland-scanner 0.31.5", + "wayland-scanner 0.31.6", "xkeysym", ] @@ -2641,7 +2704,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -2751,9 +2814,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.94" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -2762,12 +2825,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -2904,19 +2968,36 @@ dependencies = [ "strict-num", ] +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -3025,9 +3106,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-segmentation" @@ -3055,9 +3136,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "version-compare" @@ -3087,22 +3168,32 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", @@ -3114,9 +3205,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -3127,9 +3218,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3137,9 +3228,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -3150,9 +3241,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasmparser" @@ -3160,21 +3254,21 @@ version = "0.222.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4adf50fde1b1a49c1add6a80d47aea500c88db70551805853aa8b88f3ea27ab5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] name = "wayland-backend" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" dependencies = [ "cc", "downcast-rs", "rustix", "scoped-tls", "smallvec", - "wayland-sys 0.31.5", + "wayland-sys 0.31.6", ] [[package]] @@ -3195,14 +3289,14 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.7" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" +checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "rustix", "wayland-backend", - "wayland-scanner 0.31.5", + "wayland-scanner 0.31.6", ] [[package]] @@ -3223,7 +3317,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cursor-icon", "wayland-backend", ] @@ -3241,12 +3335,12 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.7" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" +checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" dependencies = [ "rustix", - "wayland-client 0.31.7", + "wayland-client 0.31.8", "xcursor", ] @@ -3264,40 +3358,40 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.5" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" +checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", - "wayland-client 0.31.7", - "wayland-scanner 0.31.5", + "wayland-client 0.31.8", + "wayland-scanner 0.31.6", ] [[package]] name = "wayland-protocols-plasma" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" +checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", - "wayland-client 0.31.7", - "wayland-protocols 0.32.5", - "wayland-scanner 0.31.5", + "wayland-client 0.31.8", + "wayland-protocols 0.32.6", + "wayland-scanner 0.31.6", ] [[package]] name = "wayland-protocols-wlr" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" +checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", - "wayland-client 0.31.7", - "wayland-protocols 0.32.5", - "wayland-scanner 0.31.5", + "wayland-client 0.31.8", + "wayland-protocols 0.32.6", + "wayland-scanner 0.31.6", ] [[package]] @@ -3313,12 +3407,12 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.5" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", - "quick-xml 0.36.2", + "quick-xml 0.37.2", "quote", ] @@ -3335,9 +3429,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.5" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" dependencies = [ "dlib", "log", @@ -3347,9 +3441,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -3398,7 +3492,7 @@ checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.6.0", + "bitflags 2.8.0", "bytemuck", "cfg_aliases 0.1.1", "document-features", @@ -3426,7 +3520,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.6.0", + "bitflags 2.8.0", "block", "bytemuck", "cfg_aliases 0.1.1", @@ -3467,7 +3561,7 @@ version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "js-sys", "web-sys", ] @@ -3774,14 +3868,14 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.30.7" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba50bc8ef4b6f1a75c9274fb95aa9a8f63fbc66c56f391bd85cf68d51e7b1a3" +checksum = "f5d74280aabb958072864bff6cfbcf9025cf8bfacdde5e32b5e12920ef703b0f" dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "bytemuck", "calloop", @@ -3814,8 +3908,8 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "wayland-backend", - "wayland-client 0.31.7", - "wayland-protocols 0.32.5", + "wayland-client 0.31.8", + "wayland-protocols 0.32.6", "wayland-protocols-plasma", "web-sys", "web-time", @@ -3827,13 +3921,22 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.21" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f5bb5257f2407a5425c6e749bfd9692192a73e70a6060516ac04f889087d68" +checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "x11-dl" version = "2.21.0" @@ -3878,7 +3981,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "dlib", "log", "once_cell", @@ -3893,9 +3996,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" [[package]] name = "yansi" diff --git a/Cargo.toml b/Cargo.toml index 0907b96b47..4de8b236a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,8 +24,10 @@ members = [ "crates/spirv-std/shared", "crates/spirv-std/macros", - "tests", - "tests/deps-helper", + "tests/compiletests", + "tests/compiletests/deps-helper", + "tests/difftests/bin", + "tests/difftests/lib", ] [workspace.package] diff --git a/deny.toml b/deny.toml index 66205b1108..4d99a3c874 100644 --- a/deny.toml +++ b/deny.toml @@ -60,6 +60,8 @@ skip-tree = [ { name = "num_cpus", version = "=1.16.0", depth = 2 }, # HACK(LegNeato) `tracing-tree` uses newer dependencies of `tracing`. { name = "tracing-tree", version = "=0.3.1" }, + # HACK(LegNeato) `thorin` has not yet released the version that bumps this. + { name = "gimli", version = "=0.30.0" }, ] diff --git a/docs/src/testing.md b/docs/src/testing.md index 40ad1378e2..b85e54e54b 100644 --- a/docs/src/testing.md +++ b/docs/src/testing.md @@ -1,14 +1,18 @@ # Testing Rust-GPU Rust-GPU has a couple of different kinds of tests, most can be ran through -`cargo test`, however Rust-GPU also has end-to-end tests for compiling Rust and -validating its SPIR-V output, which can ran by running `cargo compiletest`. +`cargo test`. Rust-GPU also has end-to-end tests for compiling Rust and +validating its SPIR-V output, which can ran by running `cargo compiletest`. Finally, +Rust-GPU has differential tests, which runs Rust and WGSL shaders and +makes sure they have the same output. These can be run with `cargo difftest`. ```bash -cargo test && cargo compiletest +cargo test && cargo compiletest && cargo difftest ``` -## Adding Tests +## Compile Tests + +### Adding Tests Rust-GPU's end-to-end test's use an external version of the [`compiletest`] tool as a testing framework. Be sure to check out the [repository][`compiletest`] and diff --git a/tests/Cargo.toml b/tests/compiletests/Cargo.toml similarity index 100% rename from tests/Cargo.toml rename to tests/compiletests/Cargo.toml diff --git a/tests/README.md b/tests/compiletests/README.md similarity index 100% rename from tests/README.md rename to tests/compiletests/README.md diff --git a/tests/deps-helper/Cargo.toml b/tests/compiletests/deps-helper/Cargo.toml similarity index 100% rename from tests/deps-helper/Cargo.toml rename to tests/compiletests/deps-helper/Cargo.toml diff --git a/tests/deps-helper/src/lib.rs b/tests/compiletests/deps-helper/src/lib.rs similarity index 100% rename from tests/deps-helper/src/lib.rs rename to tests/compiletests/deps-helper/src/lib.rs diff --git a/tests/src/main.rs b/tests/compiletests/src/main.rs similarity index 99% rename from tests/src/main.rs rename to tests/compiletests/src/main.rs index 551e6eb92f..d77af49b47 100644 --- a/tests/src/main.rs +++ b/tests/compiletests/src/main.rs @@ -31,7 +31,7 @@ const SPIRV_TARGET_PREFIX: &str = "spirv-unknown-"; fn target_spec_json(target: &str) -> String { format!( - "{}/../crates/spirv-builder/target-specs/{target}.json", + "{}/../../crates/spirv-builder/target-specs/{target}.json", env!("CARGO_MANIFEST_DIR") ) } diff --git a/tests/ui/arch/all.rs b/tests/compiletests/ui/arch/all.rs similarity index 100% rename from tests/ui/arch/all.rs rename to tests/compiletests/ui/arch/all.rs diff --git a/tests/ui/arch/all.stderr b/tests/compiletests/ui/arch/all.stderr similarity index 100% rename from tests/ui/arch/all.stderr rename to tests/compiletests/ui/arch/all.stderr diff --git a/tests/ui/arch/all_memory_barrier.rs b/tests/compiletests/ui/arch/all_memory_barrier.rs similarity index 100% rename from tests/ui/arch/all_memory_barrier.rs rename to tests/compiletests/ui/arch/all_memory_barrier.rs diff --git a/tests/ui/arch/all_memory_barrier.stderr b/tests/compiletests/ui/arch/all_memory_barrier.stderr similarity index 100% rename from tests/ui/arch/all_memory_barrier.stderr rename to tests/compiletests/ui/arch/all_memory_barrier.stderr diff --git a/tests/ui/arch/all_memory_barrier_with_group_sync.rs b/tests/compiletests/ui/arch/all_memory_barrier_with_group_sync.rs similarity index 100% rename from tests/ui/arch/all_memory_barrier_with_group_sync.rs rename to tests/compiletests/ui/arch/all_memory_barrier_with_group_sync.rs diff --git a/tests/ui/arch/all_memory_barrier_with_group_sync.stderr b/tests/compiletests/ui/arch/all_memory_barrier_with_group_sync.stderr similarity index 100% rename from tests/ui/arch/all_memory_barrier_with_group_sync.stderr rename to tests/compiletests/ui/arch/all_memory_barrier_with_group_sync.stderr diff --git a/tests/ui/arch/any.rs b/tests/compiletests/ui/arch/any.rs similarity index 100% rename from tests/ui/arch/any.rs rename to tests/compiletests/ui/arch/any.rs diff --git a/tests/ui/arch/any.stderr b/tests/compiletests/ui/arch/any.stderr similarity index 100% rename from tests/ui/arch/any.stderr rename to tests/compiletests/ui/arch/any.stderr diff --git a/tests/ui/arch/atomic_i_increment.rs b/tests/compiletests/ui/arch/atomic_i_increment.rs similarity index 100% rename from tests/ui/arch/atomic_i_increment.rs rename to tests/compiletests/ui/arch/atomic_i_increment.rs diff --git a/tests/ui/arch/control_barrier.rs b/tests/compiletests/ui/arch/control_barrier.rs similarity index 100% rename from tests/ui/arch/control_barrier.rs rename to tests/compiletests/ui/arch/control_barrier.rs diff --git a/tests/ui/arch/convert_u_to_acceleration_structure_khr.rs b/tests/compiletests/ui/arch/convert_u_to_acceleration_structure_khr.rs similarity index 100% rename from tests/ui/arch/convert_u_to_acceleration_structure_khr.rs rename to tests/compiletests/ui/arch/convert_u_to_acceleration_structure_khr.rs diff --git a/tests/ui/arch/debug_printf.rs b/tests/compiletests/ui/arch/debug_printf.rs similarity index 100% rename from tests/ui/arch/debug_printf.rs rename to tests/compiletests/ui/arch/debug_printf.rs diff --git a/tests/ui/arch/debug_printf_type_checking.rs b/tests/compiletests/ui/arch/debug_printf_type_checking.rs similarity index 100% rename from tests/ui/arch/debug_printf_type_checking.rs rename to tests/compiletests/ui/arch/debug_printf_type_checking.rs diff --git a/tests/ui/arch/debug_printf_type_checking.stderr b/tests/compiletests/ui/arch/debug_printf_type_checking.stderr similarity index 100% rename from tests/ui/arch/debug_printf_type_checking.stderr rename to tests/compiletests/ui/arch/debug_printf_type_checking.stderr diff --git a/tests/ui/arch/demote_to_helper_invocation.rs b/tests/compiletests/ui/arch/demote_to_helper_invocation.rs similarity index 100% rename from tests/ui/arch/demote_to_helper_invocation.rs rename to tests/compiletests/ui/arch/demote_to_helper_invocation.rs diff --git a/tests/ui/arch/device_memory_barrier.rs b/tests/compiletests/ui/arch/device_memory_barrier.rs similarity index 100% rename from tests/ui/arch/device_memory_barrier.rs rename to tests/compiletests/ui/arch/device_memory_barrier.rs diff --git a/tests/ui/arch/device_memory_barrier.stderr b/tests/compiletests/ui/arch/device_memory_barrier.stderr similarity index 100% rename from tests/ui/arch/device_memory_barrier.stderr rename to tests/compiletests/ui/arch/device_memory_barrier.stderr diff --git a/tests/ui/arch/device_memory_barrier_with_group_sync.rs b/tests/compiletests/ui/arch/device_memory_barrier_with_group_sync.rs similarity index 100% rename from tests/ui/arch/device_memory_barrier_with_group_sync.rs rename to tests/compiletests/ui/arch/device_memory_barrier_with_group_sync.rs diff --git a/tests/ui/arch/device_memory_barrier_with_group_sync.stderr b/tests/compiletests/ui/arch/device_memory_barrier_with_group_sync.stderr similarity index 100% rename from tests/ui/arch/device_memory_barrier_with_group_sync.stderr rename to tests/compiletests/ui/arch/device_memory_barrier_with_group_sync.stderr diff --git a/tests/ui/arch/emit_stream_vertex.rs b/tests/compiletests/ui/arch/emit_stream_vertex.rs similarity index 100% rename from tests/ui/arch/emit_stream_vertex.rs rename to tests/compiletests/ui/arch/emit_stream_vertex.rs diff --git a/tests/ui/arch/emit_vertex.rs b/tests/compiletests/ui/arch/emit_vertex.rs similarity index 100% rename from tests/ui/arch/emit_vertex.rs rename to tests/compiletests/ui/arch/emit_vertex.rs diff --git a/tests/ui/arch/end_primitive.rs b/tests/compiletests/ui/arch/end_primitive.rs similarity index 100% rename from tests/ui/arch/end_primitive.rs rename to tests/compiletests/ui/arch/end_primitive.rs diff --git a/tests/ui/arch/end_stream_primitive.rs b/tests/compiletests/ui/arch/end_stream_primitive.rs similarity index 100% rename from tests/ui/arch/end_stream_primitive.rs rename to tests/compiletests/ui/arch/end_stream_primitive.rs diff --git a/tests/ui/arch/execute_callable.rs b/tests/compiletests/ui/arch/execute_callable.rs similarity index 100% rename from tests/ui/arch/execute_callable.rs rename to tests/compiletests/ui/arch/execute_callable.rs diff --git a/tests/ui/arch/ignore_intersection_khr.rs b/tests/compiletests/ui/arch/ignore_intersection_khr.rs similarity index 100% rename from tests/ui/arch/ignore_intersection_khr.rs rename to tests/compiletests/ui/arch/ignore_intersection_khr.rs diff --git a/tests/ui/arch/index_unchecked.rs b/tests/compiletests/ui/arch/index_unchecked.rs similarity index 100% rename from tests/ui/arch/index_unchecked.rs rename to tests/compiletests/ui/arch/index_unchecked.rs diff --git a/tests/ui/arch/integer_min_and_max.rs b/tests/compiletests/ui/arch/integer_min_and_max.rs similarity index 100% rename from tests/ui/arch/integer_min_and_max.rs rename to tests/compiletests/ui/arch/integer_min_and_max.rs diff --git a/tests/ui/arch/kill.rs b/tests/compiletests/ui/arch/kill.rs similarity index 100% rename from tests/ui/arch/kill.rs rename to tests/compiletests/ui/arch/kill.rs diff --git a/tests/ui/arch/memory_barrier.rs b/tests/compiletests/ui/arch/memory_barrier.rs similarity index 100% rename from tests/ui/arch/memory_barrier.rs rename to tests/compiletests/ui/arch/memory_barrier.rs diff --git a/tests/ui/arch/mesh_shader_output_lines.rs b/tests/compiletests/ui/arch/mesh_shader_output_lines.rs similarity index 100% rename from tests/ui/arch/mesh_shader_output_lines.rs rename to tests/compiletests/ui/arch/mesh_shader_output_lines.rs diff --git a/tests/ui/arch/mesh_shader_output_points.rs b/tests/compiletests/ui/arch/mesh_shader_output_points.rs similarity index 100% rename from tests/ui/arch/mesh_shader_output_points.rs rename to tests/compiletests/ui/arch/mesh_shader_output_points.rs diff --git a/tests/ui/arch/mesh_shader_output_triangles.rs b/tests/compiletests/ui/arch/mesh_shader_output_triangles.rs similarity index 100% rename from tests/ui/arch/mesh_shader_output_triangles.rs rename to tests/compiletests/ui/arch/mesh_shader_output_triangles.rs diff --git a/tests/ui/arch/mesh_shader_payload.rs b/tests/compiletests/ui/arch/mesh_shader_payload.rs similarity index 100% rename from tests/ui/arch/mesh_shader_payload.rs rename to tests/compiletests/ui/arch/mesh_shader_payload.rs diff --git a/tests/ui/arch/mesh_shader_per_primitive.rs b/tests/compiletests/ui/arch/mesh_shader_per_primitive.rs similarity index 100% rename from tests/ui/arch/mesh_shader_per_primitive.rs rename to tests/compiletests/ui/arch/mesh_shader_per_primitive.rs diff --git a/tests/ui/arch/ray_query_confirm_intersection_khr.rs b/tests/compiletests/ui/arch/ray_query_confirm_intersection_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_confirm_intersection_khr.rs rename to tests/compiletests/ui/arch/ray_query_confirm_intersection_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_barycentrics_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_barycentrics_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_barycentrics_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_barycentrics_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_candidate_aabb_opaque_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_candidate_aabb_opaque_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_candidate_aabb_opaque_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_candidate_aabb_opaque_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_front_face_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_front_face_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_front_face_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_front_face_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_geometry_index_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_geometry_index_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_geometry_index_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_geometry_index_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_instance_custom_index_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_instance_custom_index_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_instance_custom_index_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_instance_custom_index_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_instance_id_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_instance_id_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_instance_id_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_instance_id_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_object_ray_direction_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_object_ray_direction_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_object_ray_direction_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_object_ray_direction_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_object_ray_origin_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_object_ray_origin_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_object_ray_origin_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_object_ray_origin_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_object_to_world_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_object_to_world_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_object_to_world_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_object_to_world_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_primitive_index_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_primitive_index_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_primitive_index_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_primitive_index_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_shader_binding_table_record_offset_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_shader_binding_table_record_offset_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_shader_binding_table_record_offset_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_shader_binding_table_record_offset_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_t_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_t_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_t_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_t_khr.rs diff --git a/tests/ui/arch/ray_query_get_intersection_type_khr.rs b/tests/compiletests/ui/arch/ray_query_get_intersection_type_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_intersection_type_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_intersection_type_khr.rs diff --git a/tests/ui/arch/ray_query_get_ray_flags_khr.rs b/tests/compiletests/ui/arch/ray_query_get_ray_flags_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_ray_flags_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_ray_flags_khr.rs diff --git a/tests/ui/arch/ray_query_get_ray_t_min_khr.rs b/tests/compiletests/ui/arch/ray_query_get_ray_t_min_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_ray_t_min_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_ray_t_min_khr.rs diff --git a/tests/ui/arch/ray_query_get_world_ray_direction_khr.rs b/tests/compiletests/ui/arch/ray_query_get_world_ray_direction_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_world_ray_direction_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_world_ray_direction_khr.rs diff --git a/tests/ui/arch/ray_query_get_world_ray_origin_khr.rs b/tests/compiletests/ui/arch/ray_query_get_world_ray_origin_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_get_world_ray_origin_khr.rs rename to tests/compiletests/ui/arch/ray_query_get_world_ray_origin_khr.rs diff --git a/tests/ui/arch/ray_query_initialize_khr.rs b/tests/compiletests/ui/arch/ray_query_initialize_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_initialize_khr.rs rename to tests/compiletests/ui/arch/ray_query_initialize_khr.rs diff --git a/tests/ui/arch/ray_query_terminate_khr.rs b/tests/compiletests/ui/arch/ray_query_terminate_khr.rs similarity index 100% rename from tests/ui/arch/ray_query_terminate_khr.rs rename to tests/compiletests/ui/arch/ray_query_terminate_khr.rs diff --git a/tests/ui/arch/read_clock_khr.rs b/tests/compiletests/ui/arch/read_clock_khr.rs similarity index 100% rename from tests/ui/arch/read_clock_khr.rs rename to tests/compiletests/ui/arch/read_clock_khr.rs diff --git a/tests/ui/arch/report_intersection_khr.rs b/tests/compiletests/ui/arch/report_intersection_khr.rs similarity index 100% rename from tests/ui/arch/report_intersection_khr.rs rename to tests/compiletests/ui/arch/report_intersection_khr.rs diff --git a/tests/ui/arch/subgroup/subgroup_ballot.rs b/tests/compiletests/ui/arch/subgroup/subgroup_ballot.rs similarity index 100% rename from tests/ui/arch/subgroup/subgroup_ballot.rs rename to tests/compiletests/ui/arch/subgroup/subgroup_ballot.rs diff --git a/tests/ui/arch/subgroup/subgroup_ballot.stderr b/tests/compiletests/ui/arch/subgroup/subgroup_ballot.stderr similarity index 100% rename from tests/ui/arch/subgroup/subgroup_ballot.stderr rename to tests/compiletests/ui/arch/subgroup/subgroup_ballot.stderr diff --git a/tests/ui/arch/subgroup/subgroup_ballot_bit_count.rs b/tests/compiletests/ui/arch/subgroup/subgroup_ballot_bit_count.rs similarity index 100% rename from tests/ui/arch/subgroup/subgroup_ballot_bit_count.rs rename to tests/compiletests/ui/arch/subgroup/subgroup_ballot_bit_count.rs diff --git a/tests/ui/arch/subgroup/subgroup_ballot_bit_count.stderr b/tests/compiletests/ui/arch/subgroup/subgroup_ballot_bit_count.stderr similarity index 100% rename from tests/ui/arch/subgroup/subgroup_ballot_bit_count.stderr rename to tests/compiletests/ui/arch/subgroup/subgroup_ballot_bit_count.stderr diff --git a/tests/ui/arch/subgroup/subgroup_broadcast_first.rs b/tests/compiletests/ui/arch/subgroup/subgroup_broadcast_first.rs similarity index 100% rename from tests/ui/arch/subgroup/subgroup_broadcast_first.rs rename to tests/compiletests/ui/arch/subgroup/subgroup_broadcast_first.rs diff --git a/tests/ui/arch/subgroup/subgroup_broadcast_first.stderr b/tests/compiletests/ui/arch/subgroup/subgroup_broadcast_first.stderr similarity index 100% rename from tests/ui/arch/subgroup/subgroup_broadcast_first.stderr rename to tests/compiletests/ui/arch/subgroup/subgroup_broadcast_first.stderr diff --git a/tests/ui/arch/subgroup/subgroup_builtins.rs b/tests/compiletests/ui/arch/subgroup/subgroup_builtins.rs similarity index 100% rename from tests/ui/arch/subgroup/subgroup_builtins.rs rename to tests/compiletests/ui/arch/subgroup/subgroup_builtins.rs diff --git a/tests/ui/arch/subgroup/subgroup_elect.rs b/tests/compiletests/ui/arch/subgroup/subgroup_elect.rs similarity index 100% rename from tests/ui/arch/subgroup/subgroup_elect.rs rename to tests/compiletests/ui/arch/subgroup/subgroup_elect.rs diff --git a/tests/ui/arch/subgroup/subgroup_elect.stderr b/tests/compiletests/ui/arch/subgroup/subgroup_elect.stderr similarity index 100% rename from tests/ui/arch/subgroup/subgroup_elect.stderr rename to tests/compiletests/ui/arch/subgroup/subgroup_elect.stderr diff --git a/tests/ui/arch/subgroup/subgroup_i_add_clustered.rs b/tests/compiletests/ui/arch/subgroup/subgroup_i_add_clustered.rs similarity index 100% rename from tests/ui/arch/subgroup/subgroup_i_add_clustered.rs rename to tests/compiletests/ui/arch/subgroup/subgroup_i_add_clustered.rs diff --git a/tests/ui/arch/subgroup/subgroup_i_add_clustered.stderr b/tests/compiletests/ui/arch/subgroup/subgroup_i_add_clustered.stderr similarity index 100% rename from tests/ui/arch/subgroup/subgroup_i_add_clustered.stderr rename to tests/compiletests/ui/arch/subgroup/subgroup_i_add_clustered.stderr diff --git a/tests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.rs b/tests/compiletests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.rs similarity index 100% rename from tests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.rs rename to tests/compiletests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.rs diff --git a/tests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.stderr b/tests/compiletests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.stderr similarity index 100% rename from tests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.stderr rename to tests/compiletests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.stderr diff --git a/tests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.rs b/tests/compiletests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.rs similarity index 100% rename from tests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.rs rename to tests/compiletests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.rs diff --git a/tests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.stderr b/tests/compiletests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.stderr similarity index 100% rename from tests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.stderr rename to tests/compiletests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.stderr diff --git a/tests/ui/arch/subgroup/subgroup_i_add_reduce.rs b/tests/compiletests/ui/arch/subgroup/subgroup_i_add_reduce.rs similarity index 100% rename from tests/ui/arch/subgroup/subgroup_i_add_reduce.rs rename to tests/compiletests/ui/arch/subgroup/subgroup_i_add_reduce.rs diff --git a/tests/ui/arch/subgroup/subgroup_i_add_reduce.stderr b/tests/compiletests/ui/arch/subgroup/subgroup_i_add_reduce.stderr similarity index 100% rename from tests/ui/arch/subgroup/subgroup_i_add_reduce.stderr rename to tests/compiletests/ui/arch/subgroup/subgroup_i_add_reduce.stderr diff --git a/tests/ui/arch/task_shader.rs b/tests/compiletests/ui/arch/task_shader.rs similarity index 100% rename from tests/ui/arch/task_shader.rs rename to tests/compiletests/ui/arch/task_shader.rs diff --git a/tests/ui/arch/task_shader_mispile.rs b/tests/compiletests/ui/arch/task_shader_mispile.rs similarity index 100% rename from tests/ui/arch/task_shader_mispile.rs rename to tests/compiletests/ui/arch/task_shader_mispile.rs diff --git a/tests/ui/arch/task_shader_payload.rs b/tests/compiletests/ui/arch/task_shader_payload.rs similarity index 100% rename from tests/ui/arch/task_shader_payload.rs rename to tests/compiletests/ui/arch/task_shader_payload.rs diff --git a/tests/ui/arch/terminate_ray_khr.rs b/tests/compiletests/ui/arch/terminate_ray_khr.rs similarity index 100% rename from tests/ui/arch/terminate_ray_khr.rs rename to tests/compiletests/ui/arch/terminate_ray_khr.rs diff --git a/tests/ui/arch/trace_ray_khr.rs b/tests/compiletests/ui/arch/trace_ray_khr.rs similarity index 100% rename from tests/ui/arch/trace_ray_khr.rs rename to tests/compiletests/ui/arch/trace_ray_khr.rs diff --git a/tests/ui/arch/vector_extract_dynamic.rs b/tests/compiletests/ui/arch/vector_extract_dynamic.rs similarity index 100% rename from tests/ui/arch/vector_extract_dynamic.rs rename to tests/compiletests/ui/arch/vector_extract_dynamic.rs diff --git a/tests/ui/arch/vector_insert_dynamic.rs b/tests/compiletests/ui/arch/vector_insert_dynamic.rs similarity index 100% rename from tests/ui/arch/vector_insert_dynamic.rs rename to tests/compiletests/ui/arch/vector_insert_dynamic.rs diff --git a/tests/ui/arch/workgroup_memory_barrier.rs b/tests/compiletests/ui/arch/workgroup_memory_barrier.rs similarity index 100% rename from tests/ui/arch/workgroup_memory_barrier.rs rename to tests/compiletests/ui/arch/workgroup_memory_barrier.rs diff --git a/tests/ui/arch/workgroup_memory_barrier.stderr b/tests/compiletests/ui/arch/workgroup_memory_barrier.stderr similarity index 100% rename from tests/ui/arch/workgroup_memory_barrier.stderr rename to tests/compiletests/ui/arch/workgroup_memory_barrier.stderr diff --git a/tests/ui/arch/workgroup_memory_barrier_with_group_sync.rs b/tests/compiletests/ui/arch/workgroup_memory_barrier_with_group_sync.rs similarity index 100% rename from tests/ui/arch/workgroup_memory_barrier_with_group_sync.rs rename to tests/compiletests/ui/arch/workgroup_memory_barrier_with_group_sync.rs diff --git a/tests/ui/arch/workgroup_memory_barrier_with_group_sync.stderr b/tests/compiletests/ui/arch/workgroup_memory_barrier_with_group_sync.stderr similarity index 100% rename from tests/ui/arch/workgroup_memory_barrier_with_group_sync.stderr rename to tests/compiletests/ui/arch/workgroup_memory_barrier_with_group_sync.stderr diff --git a/tests/ui/byte_addressable_buffer/arr.rs b/tests/compiletests/ui/byte_addressable_buffer/arr.rs similarity index 100% rename from tests/ui/byte_addressable_buffer/arr.rs rename to tests/compiletests/ui/byte_addressable_buffer/arr.rs diff --git a/tests/ui/byte_addressable_buffer/big_struct.rs b/tests/compiletests/ui/byte_addressable_buffer/big_struct.rs similarity index 100% rename from tests/ui/byte_addressable_buffer/big_struct.rs rename to tests/compiletests/ui/byte_addressable_buffer/big_struct.rs diff --git a/tests/ui/byte_addressable_buffer/complex.rs b/tests/compiletests/ui/byte_addressable_buffer/complex.rs similarity index 100% rename from tests/ui/byte_addressable_buffer/complex.rs rename to tests/compiletests/ui/byte_addressable_buffer/complex.rs diff --git a/tests/ui/byte_addressable_buffer/empty_struct.rs b/tests/compiletests/ui/byte_addressable_buffer/empty_struct.rs similarity index 100% rename from tests/ui/byte_addressable_buffer/empty_struct.rs rename to tests/compiletests/ui/byte_addressable_buffer/empty_struct.rs diff --git a/tests/ui/byte_addressable_buffer/f32.rs b/tests/compiletests/ui/byte_addressable_buffer/f32.rs similarity index 100% rename from tests/ui/byte_addressable_buffer/f32.rs rename to tests/compiletests/ui/byte_addressable_buffer/f32.rs diff --git a/tests/ui/byte_addressable_buffer/small_struct.rs b/tests/compiletests/ui/byte_addressable_buffer/small_struct.rs similarity index 100% rename from tests/ui/byte_addressable_buffer/small_struct.rs rename to tests/compiletests/ui/byte_addressable_buffer/small_struct.rs diff --git a/tests/ui/byte_addressable_buffer/u32.rs b/tests/compiletests/ui/byte_addressable_buffer/u32.rs similarity index 100% rename from tests/ui/byte_addressable_buffer/u32.rs rename to tests/compiletests/ui/byte_addressable_buffer/u32.rs diff --git a/tests/ui/byte_addressable_buffer/vec.rs b/tests/compiletests/ui/byte_addressable_buffer/vec.rs similarity index 100% rename from tests/ui/byte_addressable_buffer/vec.rs rename to tests/compiletests/ui/byte_addressable_buffer/vec.rs diff --git a/tests/ui/dis/add_two_ints.rs b/tests/compiletests/ui/dis/add_two_ints.rs similarity index 100% rename from tests/ui/dis/add_two_ints.rs rename to tests/compiletests/ui/dis/add_two_ints.rs diff --git a/tests/ui/dis/add_two_ints.stderr b/tests/compiletests/ui/dis/add_two_ints.stderr similarity index 100% rename from tests/ui/dis/add_two_ints.stderr rename to tests/compiletests/ui/dis/add_two_ints.stderr diff --git a/tests/ui/dis/asm.rs b/tests/compiletests/ui/dis/asm.rs similarity index 100% rename from tests/ui/dis/asm.rs rename to tests/compiletests/ui/dis/asm.rs diff --git a/tests/ui/dis/asm.stderr b/tests/compiletests/ui/dis/asm.stderr similarity index 100% rename from tests/ui/dis/asm.stderr rename to tests/compiletests/ui/dis/asm.stderr diff --git a/tests/ui/dis/asm_add_two_ints.rs b/tests/compiletests/ui/dis/asm_add_two_ints.rs similarity index 100% rename from tests/ui/dis/asm_add_two_ints.rs rename to tests/compiletests/ui/dis/asm_add_two_ints.rs diff --git a/tests/ui/dis/asm_add_two_ints.stderr b/tests/compiletests/ui/dis/asm_add_two_ints.stderr similarity index 100% rename from tests/ui/dis/asm_add_two_ints.stderr rename to tests/compiletests/ui/dis/asm_add_two_ints.stderr diff --git a/tests/ui/dis/asm_op_decorate.rs b/tests/compiletests/ui/dis/asm_op_decorate.rs similarity index 100% rename from tests/ui/dis/asm_op_decorate.rs rename to tests/compiletests/ui/dis/asm_op_decorate.rs diff --git a/tests/ui/dis/asm_op_decorate.stderr b/tests/compiletests/ui/dis/asm_op_decorate.stderr similarity index 100% rename from tests/ui/dis/asm_op_decorate.stderr rename to tests/compiletests/ui/dis/asm_op_decorate.stderr diff --git a/tests/ui/dis/complex_image_sample_inst.rs b/tests/compiletests/ui/dis/complex_image_sample_inst.rs similarity index 100% rename from tests/ui/dis/complex_image_sample_inst.rs rename to tests/compiletests/ui/dis/complex_image_sample_inst.rs diff --git a/tests/ui/dis/complex_image_sample_inst.stderr b/tests/compiletests/ui/dis/complex_image_sample_inst.stderr similarity index 100% rename from tests/ui/dis/complex_image_sample_inst.stderr rename to tests/compiletests/ui/dis/complex_image_sample_inst.stderr diff --git a/tests/ui/dis/custom_entry_point.rs b/tests/compiletests/ui/dis/custom_entry_point.rs similarity index 100% rename from tests/ui/dis/custom_entry_point.rs rename to tests/compiletests/ui/dis/custom_entry_point.rs diff --git a/tests/ui/dis/custom_entry_point.stderr b/tests/compiletests/ui/dis/custom_entry_point.stderr similarity index 100% rename from tests/ui/dis/custom_entry_point.stderr rename to tests/compiletests/ui/dis/custom_entry_point.stderr diff --git a/tests/ui/dis/entry-pass-mode-cast-array.rs b/tests/compiletests/ui/dis/entry-pass-mode-cast-array.rs similarity index 100% rename from tests/ui/dis/entry-pass-mode-cast-array.rs rename to tests/compiletests/ui/dis/entry-pass-mode-cast-array.rs diff --git a/tests/ui/dis/entry-pass-mode-cast-array.stderr b/tests/compiletests/ui/dis/entry-pass-mode-cast-array.stderr similarity index 100% rename from tests/ui/dis/entry-pass-mode-cast-array.stderr rename to tests/compiletests/ui/dis/entry-pass-mode-cast-array.stderr diff --git a/tests/ui/dis/generic-fn-op-name.rs b/tests/compiletests/ui/dis/generic-fn-op-name.rs similarity index 100% rename from tests/ui/dis/generic-fn-op-name.rs rename to tests/compiletests/ui/dis/generic-fn-op-name.rs diff --git a/tests/ui/dis/generic-fn-op-name.stderr b/tests/compiletests/ui/dis/generic-fn-op-name.stderr similarity index 100% rename from tests/ui/dis/generic-fn-op-name.stderr rename to tests/compiletests/ui/dis/generic-fn-op-name.stderr diff --git a/tests/ui/dis/index_user_dst.rs b/tests/compiletests/ui/dis/index_user_dst.rs similarity index 100% rename from tests/ui/dis/index_user_dst.rs rename to tests/compiletests/ui/dis/index_user_dst.rs diff --git a/tests/ui/dis/index_user_dst.stderr b/tests/compiletests/ui/dis/index_user_dst.stderr similarity index 100% rename from tests/ui/dis/index_user_dst.stderr rename to tests/compiletests/ui/dis/index_user_dst.stderr diff --git a/tests/ui/dis/issue-1062.rs b/tests/compiletests/ui/dis/issue-1062.rs similarity index 100% rename from tests/ui/dis/issue-1062.rs rename to tests/compiletests/ui/dis/issue-1062.rs diff --git a/tests/ui/dis/issue-1062.stderr b/tests/compiletests/ui/dis/issue-1062.stderr similarity index 100% rename from tests/ui/dis/issue-1062.stderr rename to tests/compiletests/ui/dis/issue-1062.stderr diff --git a/tests/ui/dis/issue-373.rs b/tests/compiletests/ui/dis/issue-373.rs similarity index 100% rename from tests/ui/dis/issue-373.rs rename to tests/compiletests/ui/dis/issue-373.rs diff --git a/tests/ui/dis/issue-373.stderr b/tests/compiletests/ui/dis/issue-373.stderr similarity index 100% rename from tests/ui/dis/issue-373.stderr rename to tests/compiletests/ui/dis/issue-373.stderr diff --git a/tests/ui/dis/issue-723-output.rs b/tests/compiletests/ui/dis/issue-723-output.rs similarity index 100% rename from tests/ui/dis/issue-723-output.rs rename to tests/compiletests/ui/dis/issue-723-output.rs diff --git a/tests/ui/dis/issue-723-output.stderr b/tests/compiletests/ui/dis/issue-723-output.stderr similarity index 100% rename from tests/ui/dis/issue-723-output.stderr rename to tests/compiletests/ui/dis/issue-723-output.stderr diff --git a/tests/ui/dis/issue-731.rs b/tests/compiletests/ui/dis/issue-731.rs similarity index 100% rename from tests/ui/dis/issue-731.rs rename to tests/compiletests/ui/dis/issue-731.rs diff --git a/tests/ui/dis/issue-731.stderr b/tests/compiletests/ui/dis/issue-731.stderr similarity index 100% rename from tests/ui/dis/issue-731.stderr rename to tests/compiletests/ui/dis/issue-731.stderr diff --git a/tests/ui/dis/non-writable-storage_buffer.rs b/tests/compiletests/ui/dis/non-writable-storage_buffer.rs similarity index 100% rename from tests/ui/dis/non-writable-storage_buffer.rs rename to tests/compiletests/ui/dis/non-writable-storage_buffer.rs diff --git a/tests/ui/dis/non-writable-storage_buffer.stderr b/tests/compiletests/ui/dis/non-writable-storage_buffer.stderr similarity index 100% rename from tests/ui/dis/non-writable-storage_buffer.stderr rename to tests/compiletests/ui/dis/non-writable-storage_buffer.stderr diff --git a/tests/ui/dis/panic_builtin_bounds_check.rs b/tests/compiletests/ui/dis/panic_builtin_bounds_check.rs similarity index 100% rename from tests/ui/dis/panic_builtin_bounds_check.rs rename to tests/compiletests/ui/dis/panic_builtin_bounds_check.rs diff --git a/tests/ui/dis/panic_builtin_bounds_check.stderr b/tests/compiletests/ui/dis/panic_builtin_bounds_check.stderr similarity index 100% rename from tests/ui/dis/panic_builtin_bounds_check.stderr rename to tests/compiletests/ui/dis/panic_builtin_bounds_check.stderr diff --git a/tests/ui/dis/panic_sequential_many.rs b/tests/compiletests/ui/dis/panic_sequential_many.rs similarity index 100% rename from tests/ui/dis/panic_sequential_many.rs rename to tests/compiletests/ui/dis/panic_sequential_many.rs diff --git a/tests/ui/dis/panic_sequential_many.stderr b/tests/compiletests/ui/dis/panic_sequential_many.stderr similarity index 100% rename from tests/ui/dis/panic_sequential_many.stderr rename to tests/compiletests/ui/dis/panic_sequential_many.stderr diff --git a/tests/ui/dis/pass-mode-cast-struct.rs b/tests/compiletests/ui/dis/pass-mode-cast-struct.rs similarity index 100% rename from tests/ui/dis/pass-mode-cast-struct.rs rename to tests/compiletests/ui/dis/pass-mode-cast-struct.rs diff --git a/tests/ui/dis/pass-mode-cast-struct.stderr b/tests/compiletests/ui/dis/pass-mode-cast-struct.stderr similarity index 100% rename from tests/ui/dis/pass-mode-cast-struct.stderr rename to tests/compiletests/ui/dis/pass-mode-cast-struct.stderr diff --git a/tests/ui/dis/ptr_copy.normal.stderr b/tests/compiletests/ui/dis/ptr_copy.normal.stderr similarity index 100% rename from tests/ui/dis/ptr_copy.normal.stderr rename to tests/compiletests/ui/dis/ptr_copy.normal.stderr diff --git a/tests/ui/dis/ptr_copy.rs b/tests/compiletests/ui/dis/ptr_copy.rs similarity index 100% rename from tests/ui/dis/ptr_copy.rs rename to tests/compiletests/ui/dis/ptr_copy.rs diff --git a/tests/ui/dis/ptr_copy.via_intrinsic.stderr b/tests/compiletests/ui/dis/ptr_copy.via_intrinsic.stderr similarity index 100% rename from tests/ui/dis/ptr_copy.via_intrinsic.stderr rename to tests/compiletests/ui/dis/ptr_copy.via_intrinsic.stderr diff --git a/tests/ui/dis/ptr_read.rs b/tests/compiletests/ui/dis/ptr_read.rs similarity index 100% rename from tests/ui/dis/ptr_read.rs rename to tests/compiletests/ui/dis/ptr_read.rs diff --git a/tests/ui/dis/ptr_read.stderr b/tests/compiletests/ui/dis/ptr_read.stderr similarity index 100% rename from tests/ui/dis/ptr_read.stderr rename to tests/compiletests/ui/dis/ptr_read.stderr diff --git a/tests/ui/dis/ptr_read_method.rs b/tests/compiletests/ui/dis/ptr_read_method.rs similarity index 100% rename from tests/ui/dis/ptr_read_method.rs rename to tests/compiletests/ui/dis/ptr_read_method.rs diff --git a/tests/ui/dis/ptr_read_method.stderr b/tests/compiletests/ui/dis/ptr_read_method.stderr similarity index 100% rename from tests/ui/dis/ptr_read_method.stderr rename to tests/compiletests/ui/dis/ptr_read_method.stderr diff --git a/tests/ui/dis/ptr_write.rs b/tests/compiletests/ui/dis/ptr_write.rs similarity index 100% rename from tests/ui/dis/ptr_write.rs rename to tests/compiletests/ui/dis/ptr_write.rs diff --git a/tests/ui/dis/ptr_write.stderr b/tests/compiletests/ui/dis/ptr_write.stderr similarity index 100% rename from tests/ui/dis/ptr_write.stderr rename to tests/compiletests/ui/dis/ptr_write.stderr diff --git a/tests/ui/dis/ptr_write_method.rs b/tests/compiletests/ui/dis/ptr_write_method.rs similarity index 100% rename from tests/ui/dis/ptr_write_method.rs rename to tests/compiletests/ui/dis/ptr_write_method.rs diff --git a/tests/ui/dis/ptr_write_method.stderr b/tests/compiletests/ui/dis/ptr_write_method.stderr similarity index 100% rename from tests/ui/dis/ptr_write_method.stderr rename to tests/compiletests/ui/dis/ptr_write_method.stderr diff --git a/tests/ui/dis/spec_constant-attr.rs b/tests/compiletests/ui/dis/spec_constant-attr.rs similarity index 100% rename from tests/ui/dis/spec_constant-attr.rs rename to tests/compiletests/ui/dis/spec_constant-attr.rs diff --git a/tests/ui/dis/spec_constant-attr.stderr b/tests/compiletests/ui/dis/spec_constant-attr.stderr similarity index 100% rename from tests/ui/dis/spec_constant-attr.stderr rename to tests/compiletests/ui/dis/spec_constant-attr.stderr diff --git a/tests/ui/dis/target_features.stderr b/tests/compiletests/ui/dis/target_features.stderr similarity index 100% rename from tests/ui/dis/target_features.stderr rename to tests/compiletests/ui/dis/target_features.stderr diff --git a/tests/ui/glam/mat3_vec3_multiply.rs b/tests/compiletests/ui/glam/mat3_vec3_multiply.rs similarity index 100% rename from tests/ui/glam/mat3_vec3_multiply.rs rename to tests/compiletests/ui/glam/mat3_vec3_multiply.rs diff --git a/tests/ui/hello_world.rs b/tests/compiletests/ui/hello_world.rs similarity index 100% rename from tests/ui/hello_world.rs rename to tests/compiletests/ui/hello_world.rs diff --git a/tests/ui/image/components.rs b/tests/compiletests/ui/image/components.rs similarity index 100% rename from tests/ui/image/components.rs rename to tests/compiletests/ui/image/components.rs diff --git a/tests/ui/image/fetch.rs b/tests/compiletests/ui/image/fetch.rs similarity index 100% rename from tests/ui/image/fetch.rs rename to tests/compiletests/ui/image/fetch.rs diff --git a/tests/ui/image/format.rs b/tests/compiletests/ui/image/format.rs similarity index 100% rename from tests/ui/image/format.rs rename to tests/compiletests/ui/image/format.rs diff --git a/tests/ui/image/gather.rs b/tests/compiletests/ui/image/gather.rs similarity index 100% rename from tests/ui/image/gather.rs rename to tests/compiletests/ui/image/gather.rs diff --git a/tests/ui/image/gather_err.rs b/tests/compiletests/ui/image/gather_err.rs similarity index 100% rename from tests/ui/image/gather_err.rs rename to tests/compiletests/ui/image/gather_err.rs diff --git a/tests/ui/image/gather_err.stderr b/tests/compiletests/ui/image/gather_err.stderr similarity index 100% rename from tests/ui/image/gather_err.stderr rename to tests/compiletests/ui/image/gather_err.stderr diff --git a/tests/ui/image/image_with.rs b/tests/compiletests/ui/image/image_with.rs similarity index 100% rename from tests/ui/image/image_with.rs rename to tests/compiletests/ui/image/image_with.rs diff --git a/tests/ui/image/implicit_not_in_fragment.rs b/tests/compiletests/ui/image/implicit_not_in_fragment.rs similarity index 100% rename from tests/ui/image/implicit_not_in_fragment.rs rename to tests/compiletests/ui/image/implicit_not_in_fragment.rs diff --git a/tests/ui/image/implicit_not_in_fragment.stderr b/tests/compiletests/ui/image/implicit_not_in_fragment.stderr similarity index 100% rename from tests/ui/image/implicit_not_in_fragment.stderr rename to tests/compiletests/ui/image/implicit_not_in_fragment.stderr diff --git a/tests/ui/image/issue-330.rs b/tests/compiletests/ui/image/issue-330.rs similarity index 100% rename from tests/ui/image/issue-330.rs rename to tests/compiletests/ui/image/issue-330.rs diff --git a/tests/ui/image/issue_527.rs b/tests/compiletests/ui/image/issue_527.rs similarity index 100% rename from tests/ui/image/issue_527.rs rename to tests/compiletests/ui/image/issue_527.rs diff --git a/tests/ui/image/query/query_levels.rs b/tests/compiletests/ui/image/query/query_levels.rs similarity index 100% rename from tests/ui/image/query/query_levels.rs rename to tests/compiletests/ui/image/query/query_levels.rs diff --git a/tests/ui/image/query/query_levels_err.rs b/tests/compiletests/ui/image/query/query_levels_err.rs similarity index 100% rename from tests/ui/image/query/query_levels_err.rs rename to tests/compiletests/ui/image/query/query_levels_err.rs diff --git a/tests/ui/image/query/query_levels_err.stderr b/tests/compiletests/ui/image/query/query_levels_err.stderr similarity index 100% rename from tests/ui/image/query/query_levels_err.stderr rename to tests/compiletests/ui/image/query/query_levels_err.stderr diff --git a/tests/ui/image/query/query_lod.rs b/tests/compiletests/ui/image/query/query_lod.rs similarity index 100% rename from tests/ui/image/query/query_lod.rs rename to tests/compiletests/ui/image/query/query_lod.rs diff --git a/tests/ui/image/query/query_lod_err.rs b/tests/compiletests/ui/image/query/query_lod_err.rs similarity index 100% rename from tests/ui/image/query/query_lod_err.rs rename to tests/compiletests/ui/image/query/query_lod_err.rs diff --git a/tests/ui/image/query/query_lod_err.stderr b/tests/compiletests/ui/image/query/query_lod_err.stderr similarity index 100% rename from tests/ui/image/query/query_lod_err.stderr rename to tests/compiletests/ui/image/query/query_lod_err.stderr diff --git a/tests/ui/image/query/query_samples.rs b/tests/compiletests/ui/image/query/query_samples.rs similarity index 100% rename from tests/ui/image/query/query_samples.rs rename to tests/compiletests/ui/image/query/query_samples.rs diff --git a/tests/ui/image/query/query_size.rs b/tests/compiletests/ui/image/query/query_size.rs similarity index 100% rename from tests/ui/image/query/query_size.rs rename to tests/compiletests/ui/image/query/query_size.rs diff --git a/tests/ui/image/query/query_size_err.rs b/tests/compiletests/ui/image/query/query_size_err.rs similarity index 100% rename from tests/ui/image/query/query_size_err.rs rename to tests/compiletests/ui/image/query/query_size_err.rs diff --git a/tests/ui/image/query/query_size_err.stderr b/tests/compiletests/ui/image/query/query_size_err.stderr similarity index 100% rename from tests/ui/image/query/query_size_err.stderr rename to tests/compiletests/ui/image/query/query_size_err.stderr diff --git a/tests/ui/image/query/query_size_lod.rs b/tests/compiletests/ui/image/query/query_size_lod.rs similarity index 100% rename from tests/ui/image/query/query_size_lod.rs rename to tests/compiletests/ui/image/query/query_size_lod.rs diff --git a/tests/ui/image/query/query_size_lod_err.rs b/tests/compiletests/ui/image/query/query_size_lod_err.rs similarity index 100% rename from tests/ui/image/query/query_size_lod_err.rs rename to tests/compiletests/ui/image/query/query_size_lod_err.rs diff --git a/tests/ui/image/query/query_size_lod_err.stderr b/tests/compiletests/ui/image/query/query_size_lod_err.stderr similarity index 100% rename from tests/ui/image/query/query_size_lod_err.stderr rename to tests/compiletests/ui/image/query/query_size_lod_err.stderr diff --git a/tests/ui/image/read.rs b/tests/compiletests/ui/image/read.rs similarity index 100% rename from tests/ui/image/read.rs rename to tests/compiletests/ui/image/read.rs diff --git a/tests/ui/image/read_subpass.rs b/tests/compiletests/ui/image/read_subpass.rs similarity index 100% rename from tests/ui/image/read_subpass.rs rename to tests/compiletests/ui/image/read_subpass.rs diff --git a/tests/ui/image/sample.rs b/tests/compiletests/ui/image/sample.rs similarity index 100% rename from tests/ui/image/sample.rs rename to tests/compiletests/ui/image/sample.rs diff --git a/tests/ui/image/sample_bias.rs b/tests/compiletests/ui/image/sample_bias.rs similarity index 100% rename from tests/ui/image/sample_bias.rs rename to tests/compiletests/ui/image/sample_bias.rs diff --git a/tests/ui/image/sample_depth_reference/sample.rs b/tests/compiletests/ui/image/sample_depth_reference/sample.rs similarity index 100% rename from tests/ui/image/sample_depth_reference/sample.rs rename to tests/compiletests/ui/image/sample_depth_reference/sample.rs diff --git a/tests/ui/image/sample_depth_reference/sample_gradient.rs b/tests/compiletests/ui/image/sample_depth_reference/sample_gradient.rs similarity index 100% rename from tests/ui/image/sample_depth_reference/sample_gradient.rs rename to tests/compiletests/ui/image/sample_depth_reference/sample_gradient.rs diff --git a/tests/ui/image/sample_depth_reference/sample_lod.rs b/tests/compiletests/ui/image/sample_depth_reference/sample_lod.rs similarity index 100% rename from tests/ui/image/sample_depth_reference/sample_lod.rs rename to tests/compiletests/ui/image/sample_depth_reference/sample_lod.rs diff --git a/tests/ui/image/sample_depth_reference_with_project_coordinate/sample.rs b/tests/compiletests/ui/image/sample_depth_reference_with_project_coordinate/sample.rs similarity index 100% rename from tests/ui/image/sample_depth_reference_with_project_coordinate/sample.rs rename to tests/compiletests/ui/image/sample_depth_reference_with_project_coordinate/sample.rs diff --git a/tests/ui/image/sample_depth_reference_with_project_coordinate/sample_gradient.rs b/tests/compiletests/ui/image/sample_depth_reference_with_project_coordinate/sample_gradient.rs similarity index 100% rename from tests/ui/image/sample_depth_reference_with_project_coordinate/sample_gradient.rs rename to tests/compiletests/ui/image/sample_depth_reference_with_project_coordinate/sample_gradient.rs diff --git a/tests/ui/image/sample_depth_reference_with_project_coordinate/sample_lod.rs b/tests/compiletests/ui/image/sample_depth_reference_with_project_coordinate/sample_lod.rs similarity index 100% rename from tests/ui/image/sample_depth_reference_with_project_coordinate/sample_lod.rs rename to tests/compiletests/ui/image/sample_depth_reference_with_project_coordinate/sample_lod.rs diff --git a/tests/ui/image/sample_gradient.rs b/tests/compiletests/ui/image/sample_gradient.rs similarity index 100% rename from tests/ui/image/sample_gradient.rs rename to tests/compiletests/ui/image/sample_gradient.rs diff --git a/tests/ui/image/sample_lod.rs b/tests/compiletests/ui/image/sample_lod.rs similarity index 100% rename from tests/ui/image/sample_lod.rs rename to tests/compiletests/ui/image/sample_lod.rs diff --git a/tests/ui/image/sample_with_project_coordinate/sample.rs b/tests/compiletests/ui/image/sample_with_project_coordinate/sample.rs similarity index 100% rename from tests/ui/image/sample_with_project_coordinate/sample.rs rename to tests/compiletests/ui/image/sample_with_project_coordinate/sample.rs diff --git a/tests/ui/image/sample_with_project_coordinate/sample_gradient.rs b/tests/compiletests/ui/image/sample_with_project_coordinate/sample_gradient.rs similarity index 100% rename from tests/ui/image/sample_with_project_coordinate/sample_gradient.rs rename to tests/compiletests/ui/image/sample_with_project_coordinate/sample_gradient.rs diff --git a/tests/ui/image/sample_with_project_coordinate/sample_lod.rs b/tests/compiletests/ui/image/sample_with_project_coordinate/sample_lod.rs similarity index 100% rename from tests/ui/image/sample_with_project_coordinate/sample_lod.rs rename to tests/compiletests/ui/image/sample_with_project_coordinate/sample_lod.rs diff --git a/tests/ui/image/write.rs b/tests/compiletests/ui/image/write.rs similarity index 100% rename from tests/ui/image/write.rs rename to tests/compiletests/ui/image/write.rs diff --git a/tests/ui/lang/asm/block_tracking_fail.rs b/tests/compiletests/ui/lang/asm/block_tracking_fail.rs similarity index 100% rename from tests/ui/lang/asm/block_tracking_fail.rs rename to tests/compiletests/ui/lang/asm/block_tracking_fail.rs diff --git a/tests/ui/lang/asm/block_tracking_fail.stderr b/tests/compiletests/ui/lang/asm/block_tracking_fail.stderr similarity index 100% rename from tests/ui/lang/asm/block_tracking_fail.stderr rename to tests/compiletests/ui/lang/asm/block_tracking_fail.stderr diff --git a/tests/ui/lang/asm/block_tracking_pass.rs b/tests/compiletests/ui/lang/asm/block_tracking_pass.rs similarity index 100% rename from tests/ui/lang/asm/block_tracking_pass.rs rename to tests/compiletests/ui/lang/asm/block_tracking_pass.rs diff --git a/tests/ui/lang/asm/const_args.rs b/tests/compiletests/ui/lang/asm/const_args.rs similarity index 100% rename from tests/ui/lang/asm/const_args.rs rename to tests/compiletests/ui/lang/asm/const_args.rs diff --git a/tests/ui/lang/asm/infer-access-chain-array.rs b/tests/compiletests/ui/lang/asm/infer-access-chain-array.rs similarity index 100% rename from tests/ui/lang/asm/infer-access-chain-array.rs rename to tests/compiletests/ui/lang/asm/infer-access-chain-array.rs diff --git a/tests/ui/lang/asm/infer-access-chain-slice.rs b/tests/compiletests/ui/lang/asm/infer-access-chain-slice.rs similarity index 100% rename from tests/ui/lang/asm/infer-access-chain-slice.rs rename to tests/compiletests/ui/lang/asm/infer-access-chain-slice.rs diff --git a/tests/ui/lang/asm/issue-1002.rs b/tests/compiletests/ui/lang/asm/issue-1002.rs similarity index 100% rename from tests/ui/lang/asm/issue-1002.rs rename to tests/compiletests/ui/lang/asm/issue-1002.rs diff --git a/tests/ui/lang/asm/issue-1002.stderr b/tests/compiletests/ui/lang/asm/issue-1002.stderr similarity index 100% rename from tests/ui/lang/asm/issue-1002.stderr rename to tests/compiletests/ui/lang/asm/issue-1002.stderr diff --git a/tests/ui/lang/consts/issue-1024.rs b/tests/compiletests/ui/lang/consts/issue-1024.rs similarity index 100% rename from tests/ui/lang/consts/issue-1024.rs rename to tests/compiletests/ui/lang/consts/issue-1024.rs diff --git a/tests/ui/lang/consts/issue-329.rs b/tests/compiletests/ui/lang/consts/issue-329.rs similarity index 100% rename from tests/ui/lang/consts/issue-329.rs rename to tests/compiletests/ui/lang/consts/issue-329.rs diff --git a/tests/ui/lang/consts/issue-834.rs b/tests/compiletests/ui/lang/consts/issue-834.rs similarity index 100% rename from tests/ui/lang/consts/issue-834.rs rename to tests/compiletests/ui/lang/consts/issue-834.rs diff --git a/tests/ui/lang/consts/nested-ref-in-composite.rs b/tests/compiletests/ui/lang/consts/nested-ref-in-composite.rs similarity index 100% rename from tests/ui/lang/consts/nested-ref-in-composite.rs rename to tests/compiletests/ui/lang/consts/nested-ref-in-composite.rs diff --git a/tests/ui/lang/consts/nested-ref-in-composite.stderr b/tests/compiletests/ui/lang/consts/nested-ref-in-composite.stderr similarity index 100% rename from tests/ui/lang/consts/nested-ref-in-composite.stderr rename to tests/compiletests/ui/lang/consts/nested-ref-in-composite.stderr diff --git a/tests/ui/lang/consts/nested-ref.rs b/tests/compiletests/ui/lang/consts/nested-ref.rs similarity index 100% rename from tests/ui/lang/consts/nested-ref.rs rename to tests/compiletests/ui/lang/consts/nested-ref.rs diff --git a/tests/ui/lang/consts/nested-ref.stderr b/tests/compiletests/ui/lang/consts/nested-ref.stderr similarity index 100% rename from tests/ui/lang/consts/nested-ref.stderr rename to tests/compiletests/ui/lang/consts/nested-ref.stderr diff --git a/tests/ui/lang/consts/shallow-ref.rs b/tests/compiletests/ui/lang/consts/shallow-ref.rs similarity index 100% rename from tests/ui/lang/consts/shallow-ref.rs rename to tests/compiletests/ui/lang/consts/shallow-ref.rs diff --git a/tests/ui/lang/control_flow/closure_multi.rs b/tests/compiletests/ui/lang/control_flow/closure_multi.rs similarity index 100% rename from tests/ui/lang/control_flow/closure_multi.rs rename to tests/compiletests/ui/lang/control_flow/closure_multi.rs diff --git a/tests/ui/lang/control_flow/defer.rs b/tests/compiletests/ui/lang/control_flow/defer.rs similarity index 100% rename from tests/ui/lang/control_flow/defer.rs rename to tests/compiletests/ui/lang/control_flow/defer.rs diff --git a/tests/ui/lang/control_flow/for_range.rs b/tests/compiletests/ui/lang/control_flow/for_range.rs similarity index 100% rename from tests/ui/lang/control_flow/for_range.rs rename to tests/compiletests/ui/lang/control_flow/for_range.rs diff --git a/tests/ui/lang/control_flow/for_range_signed.rs b/tests/compiletests/ui/lang/control_flow/for_range_signed.rs similarity index 100% rename from tests/ui/lang/control_flow/for_range_signed.rs rename to tests/compiletests/ui/lang/control_flow/for_range_signed.rs diff --git a/tests/ui/lang/control_flow/for_with_custom_range_iter.rs b/tests/compiletests/ui/lang/control_flow/for_with_custom_range_iter.rs similarity index 100% rename from tests/ui/lang/control_flow/for_with_custom_range_iter.rs rename to tests/compiletests/ui/lang/control_flow/for_with_custom_range_iter.rs diff --git a/tests/ui/lang/control_flow/if.rs b/tests/compiletests/ui/lang/control_flow/if.rs similarity index 100% rename from tests/ui/lang/control_flow/if.rs rename to tests/compiletests/ui/lang/control_flow/if.rs diff --git a/tests/ui/lang/control_flow/if_else.rs b/tests/compiletests/ui/lang/control_flow/if_else.rs similarity index 100% rename from tests/ui/lang/control_flow/if_else.rs rename to tests/compiletests/ui/lang/control_flow/if_else.rs diff --git a/tests/ui/lang/control_flow/if_else_if_else.rs b/tests/compiletests/ui/lang/control_flow/if_else_if_else.rs similarity index 100% rename from tests/ui/lang/control_flow/if_else_if_else.rs rename to tests/compiletests/ui/lang/control_flow/if_else_if_else.rs diff --git a/tests/ui/lang/control_flow/if_if.rs b/tests/compiletests/ui/lang/control_flow/if_if.rs similarity index 100% rename from tests/ui/lang/control_flow/if_if.rs rename to tests/compiletests/ui/lang/control_flow/if_if.rs diff --git a/tests/ui/lang/control_flow/if_return_else.rs b/tests/compiletests/ui/lang/control_flow/if_return_else.rs similarity index 100% rename from tests/ui/lang/control_flow/if_return_else.rs rename to tests/compiletests/ui/lang/control_flow/if_return_else.rs diff --git a/tests/ui/lang/control_flow/if_return_else_return.rs b/tests/compiletests/ui/lang/control_flow/if_return_else_return.rs similarity index 100% rename from tests/ui/lang/control_flow/if_return_else_return.rs rename to tests/compiletests/ui/lang/control_flow/if_return_else_return.rs diff --git a/tests/ui/lang/control_flow/if_while.rs b/tests/compiletests/ui/lang/control_flow/if_while.rs similarity index 100% rename from tests/ui/lang/control_flow/if_while.rs rename to tests/compiletests/ui/lang/control_flow/if_while.rs diff --git a/tests/ui/lang/control_flow/ifx2.rs b/tests/compiletests/ui/lang/control_flow/ifx2.rs similarity index 100% rename from tests/ui/lang/control_flow/ifx2.rs rename to tests/compiletests/ui/lang/control_flow/ifx2.rs diff --git a/tests/ui/lang/control_flow/issue_283.rs b/tests/compiletests/ui/lang/control_flow/issue_283.rs similarity index 100% rename from tests/ui/lang/control_flow/issue_283.rs rename to tests/compiletests/ui/lang/control_flow/issue_283.rs diff --git a/tests/ui/lang/control_flow/issue_764.rs b/tests/compiletests/ui/lang/control_flow/issue_764.rs similarity index 100% rename from tests/ui/lang/control_flow/issue_764.rs rename to tests/compiletests/ui/lang/control_flow/issue_764.rs diff --git a/tests/ui/lang/control_flow/issue_764.stderr b/tests/compiletests/ui/lang/control_flow/issue_764.stderr similarity index 100% rename from tests/ui/lang/control_flow/issue_764.stderr rename to tests/compiletests/ui/lang/control_flow/issue_764.stderr diff --git a/tests/ui/lang/control_flow/loop.rs b/tests/compiletests/ui/lang/control_flow/loop.rs similarity index 100% rename from tests/ui/lang/control_flow/loop.rs rename to tests/compiletests/ui/lang/control_flow/loop.rs diff --git a/tests/ui/lang/control_flow/while.rs b/tests/compiletests/ui/lang/control_flow/while.rs similarity index 100% rename from tests/ui/lang/control_flow/while.rs rename to tests/compiletests/ui/lang/control_flow/while.rs diff --git a/tests/ui/lang/control_flow/while_break.rs b/tests/compiletests/ui/lang/control_flow/while_break.rs similarity index 100% rename from tests/ui/lang/control_flow/while_break.rs rename to tests/compiletests/ui/lang/control_flow/while_break.rs diff --git a/tests/ui/lang/control_flow/while_continue.rs b/tests/compiletests/ui/lang/control_flow/while_continue.rs similarity index 100% rename from tests/ui/lang/control_flow/while_continue.rs rename to tests/compiletests/ui/lang/control_flow/while_continue.rs diff --git a/tests/ui/lang/control_flow/while_if_break.rs b/tests/compiletests/ui/lang/control_flow/while_if_break.rs similarity index 100% rename from tests/ui/lang/control_flow/while_if_break.rs rename to tests/compiletests/ui/lang/control_flow/while_if_break.rs diff --git a/tests/ui/lang/control_flow/while_if_break_else_break.rs b/tests/compiletests/ui/lang/control_flow/while_if_break_else_break.rs similarity index 100% rename from tests/ui/lang/control_flow/while_if_break_else_break.rs rename to tests/compiletests/ui/lang/control_flow/while_if_break_else_break.rs diff --git a/tests/ui/lang/control_flow/while_if_break_if_break.rs b/tests/compiletests/ui/lang/control_flow/while_if_break_if_break.rs similarity index 100% rename from tests/ui/lang/control_flow/while_if_break_if_break.rs rename to tests/compiletests/ui/lang/control_flow/while_if_break_if_break.rs diff --git a/tests/ui/lang/control_flow/while_if_continue.rs b/tests/compiletests/ui/lang/control_flow/while_if_continue.rs similarity index 100% rename from tests/ui/lang/control_flow/while_if_continue.rs rename to tests/compiletests/ui/lang/control_flow/while_if_continue.rs diff --git a/tests/ui/lang/control_flow/while_if_continue_else_continue.rs b/tests/compiletests/ui/lang/control_flow/while_if_continue_else_continue.rs similarity index 100% rename from tests/ui/lang/control_flow/while_if_continue_else_continue.rs rename to tests/compiletests/ui/lang/control_flow/while_if_continue_else_continue.rs diff --git a/tests/ui/lang/control_flow/while_return.rs b/tests/compiletests/ui/lang/control_flow/while_return.rs similarity index 100% rename from tests/ui/lang/control_flow/while_return.rs rename to tests/compiletests/ui/lang/control_flow/while_return.rs diff --git a/tests/ui/lang/control_flow/while_while.rs b/tests/compiletests/ui/lang/control_flow/while_while.rs similarity index 100% rename from tests/ui/lang/control_flow/while_while.rs rename to tests/compiletests/ui/lang/control_flow/while_while.rs diff --git a/tests/ui/lang/control_flow/while_while_break.rs b/tests/compiletests/ui/lang/control_flow/while_while_break.rs similarity index 100% rename from tests/ui/lang/control_flow/while_while_break.rs rename to tests/compiletests/ui/lang/control_flow/while_while_break.rs diff --git a/tests/ui/lang/control_flow/while_while_continue.rs b/tests/compiletests/ui/lang/control_flow/while_while_continue.rs similarity index 100% rename from tests/ui/lang/control_flow/while_while_continue.rs rename to tests/compiletests/ui/lang/control_flow/while_while_continue.rs diff --git a/tests/ui/lang/control_flow/while_while_if_break.rs b/tests/compiletests/ui/lang/control_flow/while_while_if_break.rs similarity index 100% rename from tests/ui/lang/control_flow/while_while_if_break.rs rename to tests/compiletests/ui/lang/control_flow/while_while_if_break.rs diff --git a/tests/ui/lang/control_flow/while_while_if_continue.rs b/tests/compiletests/ui/lang/control_flow/while_while_if_continue.rs similarity index 100% rename from tests/ui/lang/control_flow/while_while_if_continue.rs rename to tests/compiletests/ui/lang/control_flow/while_while_if_continue.rs diff --git a/tests/ui/lang/core/intrinsics/bswap.rs b/tests/compiletests/ui/lang/core/intrinsics/bswap.rs similarity index 100% rename from tests/ui/lang/core/intrinsics/bswap.rs rename to tests/compiletests/ui/lang/core/intrinsics/bswap.rs diff --git a/tests/ui/lang/core/intrinsics/log10.rs b/tests/compiletests/ui/lang/core/intrinsics/log10.rs similarity index 100% rename from tests/ui/lang/core/intrinsics/log10.rs rename to tests/compiletests/ui/lang/core/intrinsics/log10.rs diff --git a/tests/ui/lang/core/mem/create_unitialized_memory.rs b/tests/compiletests/ui/lang/core/mem/create_unitialized_memory.rs similarity index 100% rename from tests/ui/lang/core/mem/create_unitialized_memory.rs rename to tests/compiletests/ui/lang/core/mem/create_unitialized_memory.rs diff --git a/tests/ui/lang/core/ops/logical_and.rs b/tests/compiletests/ui/lang/core/ops/logical_and.rs similarity index 100% rename from tests/ui/lang/core/ops/logical_and.rs rename to tests/compiletests/ui/lang/core/ops/logical_and.rs diff --git a/tests/ui/lang/core/ops/range-contains.rs b/tests/compiletests/ui/lang/core/ops/range-contains.rs similarity index 100% rename from tests/ui/lang/core/ops/range-contains.rs rename to tests/compiletests/ui/lang/core/ops/range-contains.rs diff --git a/tests/ui/lang/core/ptr/allocate_const_scalar.rs b/tests/compiletests/ui/lang/core/ptr/allocate_const_scalar.rs similarity index 100% rename from tests/ui/lang/core/ptr/allocate_const_scalar.rs rename to tests/compiletests/ui/lang/core/ptr/allocate_const_scalar.rs diff --git a/tests/ui/lang/core/ptr/allocate_const_scalar.stderr b/tests/compiletests/ui/lang/core/ptr/allocate_const_scalar.stderr similarity index 100% rename from tests/ui/lang/core/ptr/allocate_const_scalar.stderr rename to tests/compiletests/ui/lang/core/ptr/allocate_const_scalar.stderr diff --git a/tests/ui/lang/core/ptr/allocate_null.rs b/tests/compiletests/ui/lang/core/ptr/allocate_null.rs similarity index 100% rename from tests/ui/lang/core/ptr/allocate_null.rs rename to tests/compiletests/ui/lang/core/ptr/allocate_null.rs diff --git a/tests/ui/lang/core/ptr/allocate_vec_like.rs b/tests/compiletests/ui/lang/core/ptr/allocate_vec_like.rs similarity index 100% rename from tests/ui/lang/core/ptr/allocate_vec_like.rs rename to tests/compiletests/ui/lang/core/ptr/allocate_vec_like.rs diff --git a/tests/ui/lang/core/ptr/allocate_vec_like.stderr b/tests/compiletests/ui/lang/core/ptr/allocate_vec_like.stderr similarity index 100% rename from tests/ui/lang/core/ptr/allocate_vec_like.stderr rename to tests/compiletests/ui/lang/core/ptr/allocate_vec_like.stderr diff --git a/tests/ui/lang/core/ref/member_ref_arg-broken.rs b/tests/compiletests/ui/lang/core/ref/member_ref_arg-broken.rs similarity index 100% rename from tests/ui/lang/core/ref/member_ref_arg-broken.rs rename to tests/compiletests/ui/lang/core/ref/member_ref_arg-broken.rs diff --git a/tests/ui/lang/core/ref/member_ref_arg-broken.stderr b/tests/compiletests/ui/lang/core/ref/member_ref_arg-broken.stderr similarity index 100% rename from tests/ui/lang/core/ref/member_ref_arg-broken.stderr rename to tests/compiletests/ui/lang/core/ref/member_ref_arg-broken.stderr diff --git a/tests/ui/lang/core/ref/member_ref_arg.rs b/tests/compiletests/ui/lang/core/ref/member_ref_arg.rs similarity index 100% rename from tests/ui/lang/core/ref/member_ref_arg.rs rename to tests/compiletests/ui/lang/core/ref/member_ref_arg.rs diff --git a/tests/ui/lang/core/ref/member_ref_arg.stderr b/tests/compiletests/ui/lang/core/ref/member_ref_arg.stderr similarity index 100% rename from tests/ui/lang/core/ref/member_ref_arg.stderr rename to tests/compiletests/ui/lang/core/ref/member_ref_arg.stderr diff --git a/tests/ui/lang/core/ref/zst_member_ref_arg-broken.rs b/tests/compiletests/ui/lang/core/ref/zst_member_ref_arg-broken.rs similarity index 100% rename from tests/ui/lang/core/ref/zst_member_ref_arg-broken.rs rename to tests/compiletests/ui/lang/core/ref/zst_member_ref_arg-broken.rs diff --git a/tests/ui/lang/core/ref/zst_member_ref_arg-broken.stderr b/tests/compiletests/ui/lang/core/ref/zst_member_ref_arg-broken.stderr similarity index 100% rename from tests/ui/lang/core/ref/zst_member_ref_arg-broken.stderr rename to tests/compiletests/ui/lang/core/ref/zst_member_ref_arg-broken.stderr diff --git a/tests/ui/lang/core/ref/zst_member_ref_arg.rs b/tests/compiletests/ui/lang/core/ref/zst_member_ref_arg.rs similarity index 100% rename from tests/ui/lang/core/ref/zst_member_ref_arg.rs rename to tests/compiletests/ui/lang/core/ref/zst_member_ref_arg.rs diff --git a/tests/ui/lang/core/unwrap_or.rs b/tests/compiletests/ui/lang/core/unwrap_or.rs similarity index 100% rename from tests/ui/lang/core/unwrap_or.rs rename to tests/compiletests/ui/lang/core/unwrap_or.rs diff --git a/tests/ui/lang/core/unwrap_or.stderr b/tests/compiletests/ui/lang/core/unwrap_or.stderr similarity index 100% rename from tests/ui/lang/core/unwrap_or.stderr rename to tests/compiletests/ui/lang/core/unwrap_or.stderr diff --git a/tests/ui/lang/f32/packing.rs b/tests/compiletests/ui/lang/f32/packing.rs similarity index 100% rename from tests/ui/lang/f32/packing.rs rename to tests/compiletests/ui/lang/f32/packing.rs diff --git a/tests/ui/lang/f32/signum.rs b/tests/compiletests/ui/lang/f32/signum.rs similarity index 100% rename from tests/ui/lang/f32/signum.rs rename to tests/compiletests/ui/lang/f32/signum.rs diff --git a/tests/ui/lang/issue-415.rs b/tests/compiletests/ui/lang/issue-415.rs similarity index 100% rename from tests/ui/lang/issue-415.rs rename to tests/compiletests/ui/lang/issue-415.rs diff --git a/tests/ui/lang/issue-46.rs b/tests/compiletests/ui/lang/issue-46.rs similarity index 100% rename from tests/ui/lang/issue-46.rs rename to tests/compiletests/ui/lang/issue-46.rs diff --git a/tests/ui/lang/issue-836.rs b/tests/compiletests/ui/lang/issue-836.rs similarity index 100% rename from tests/ui/lang/issue-836.rs rename to tests/compiletests/ui/lang/issue-836.rs diff --git a/tests/ui/lang/panic/builtin.rs b/tests/compiletests/ui/lang/panic/builtin.rs similarity index 100% rename from tests/ui/lang/panic/builtin.rs rename to tests/compiletests/ui/lang/panic/builtin.rs diff --git a/tests/ui/lang/panic/builtin_bounds_check.rs b/tests/compiletests/ui/lang/panic/builtin_bounds_check.rs similarity index 100% rename from tests/ui/lang/panic/builtin_bounds_check.rs rename to tests/compiletests/ui/lang/panic/builtin_bounds_check.rs diff --git a/tests/ui/lang/panic/simple.rs b/tests/compiletests/ui/lang/panic/simple.rs similarity index 100% rename from tests/ui/lang/panic/simple.rs rename to tests/compiletests/ui/lang/panic/simple.rs diff --git a/tests/ui/lang/panic/track_caller.rs b/tests/compiletests/ui/lang/panic/track_caller.rs similarity index 100% rename from tests/ui/lang/panic/track_caller.rs rename to tests/compiletests/ui/lang/panic/track_caller.rs diff --git a/tests/ui/lang/panic/track_caller.stderr b/tests/compiletests/ui/lang/panic/track_caller.stderr similarity index 100% rename from tests/ui/lang/panic/track_caller.stderr rename to tests/compiletests/ui/lang/panic/track_caller.stderr diff --git a/tests/ui/spirv-attr/all-builtins.rs b/tests/compiletests/ui/spirv-attr/all-builtins.rs similarity index 100% rename from tests/ui/spirv-attr/all-builtins.rs rename to tests/compiletests/ui/spirv-attr/all-builtins.rs diff --git a/tests/ui/spirv-attr/bad-deduce-storage-class.rs b/tests/compiletests/ui/spirv-attr/bad-deduce-storage-class.rs similarity index 100% rename from tests/ui/spirv-attr/bad-deduce-storage-class.rs rename to tests/compiletests/ui/spirv-attr/bad-deduce-storage-class.rs diff --git a/tests/ui/spirv-attr/bad-deduce-storage-class.stderr b/tests/compiletests/ui/spirv-attr/bad-deduce-storage-class.stderr similarity index 100% rename from tests/ui/spirv-attr/bad-deduce-storage-class.stderr rename to tests/compiletests/ui/spirv-attr/bad-deduce-storage-class.stderr diff --git a/tests/ui/spirv-attr/bool-inputs-err.rs b/tests/compiletests/ui/spirv-attr/bool-inputs-err.rs similarity index 100% rename from tests/ui/spirv-attr/bool-inputs-err.rs rename to tests/compiletests/ui/spirv-attr/bool-inputs-err.rs diff --git a/tests/ui/spirv-attr/bool-inputs-err.stderr b/tests/compiletests/ui/spirv-attr/bool-inputs-err.stderr similarity index 100% rename from tests/ui/spirv-attr/bool-inputs-err.stderr rename to tests/compiletests/ui/spirv-attr/bool-inputs-err.stderr diff --git a/tests/ui/spirv-attr/bool-inputs.rs b/tests/compiletests/ui/spirv-attr/bool-inputs.rs similarity index 100% rename from tests/ui/spirv-attr/bool-inputs.rs rename to tests/compiletests/ui/spirv-attr/bool-inputs.rs diff --git a/tests/ui/spirv-attr/int-without-flat.rs b/tests/compiletests/ui/spirv-attr/int-without-flat.rs similarity index 100% rename from tests/ui/spirv-attr/int-without-flat.rs rename to tests/compiletests/ui/spirv-attr/int-without-flat.rs diff --git a/tests/ui/spirv-attr/int-without-flat.stderr b/tests/compiletests/ui/spirv-attr/int-without-flat.stderr similarity index 100% rename from tests/ui/spirv-attr/int-without-flat.stderr rename to tests/compiletests/ui/spirv-attr/int-without-flat.stderr diff --git a/tests/ui/spirv-attr/invalid-matrix-type-empty.rs b/tests/compiletests/ui/spirv-attr/invalid-matrix-type-empty.rs similarity index 100% rename from tests/ui/spirv-attr/invalid-matrix-type-empty.rs rename to tests/compiletests/ui/spirv-attr/invalid-matrix-type-empty.rs diff --git a/tests/ui/spirv-attr/invalid-matrix-type-empty.stderr b/tests/compiletests/ui/spirv-attr/invalid-matrix-type-empty.stderr similarity index 100% rename from tests/ui/spirv-attr/invalid-matrix-type-empty.stderr rename to tests/compiletests/ui/spirv-attr/invalid-matrix-type-empty.stderr diff --git a/tests/ui/spirv-attr/invalid-matrix-type.rs b/tests/compiletests/ui/spirv-attr/invalid-matrix-type.rs similarity index 100% rename from tests/ui/spirv-attr/invalid-matrix-type.rs rename to tests/compiletests/ui/spirv-attr/invalid-matrix-type.rs diff --git a/tests/ui/spirv-attr/invalid-matrix-type.stderr b/tests/compiletests/ui/spirv-attr/invalid-matrix-type.stderr similarity index 100% rename from tests/ui/spirv-attr/invalid-matrix-type.stderr rename to tests/compiletests/ui/spirv-attr/invalid-matrix-type.stderr diff --git a/tests/ui/spirv-attr/invalid-storage-class.rs b/tests/compiletests/ui/spirv-attr/invalid-storage-class.rs similarity index 100% rename from tests/ui/spirv-attr/invalid-storage-class.rs rename to tests/compiletests/ui/spirv-attr/invalid-storage-class.rs diff --git a/tests/ui/spirv-attr/invalid-storage-class.stderr b/tests/compiletests/ui/spirv-attr/invalid-storage-class.stderr similarity index 100% rename from tests/ui/spirv-attr/invalid-storage-class.stderr rename to tests/compiletests/ui/spirv-attr/invalid-storage-class.stderr diff --git a/tests/ui/spirv-attr/invalid-target.rs b/tests/compiletests/ui/spirv-attr/invalid-target.rs similarity index 100% rename from tests/ui/spirv-attr/invalid-target.rs rename to tests/compiletests/ui/spirv-attr/invalid-target.rs diff --git a/tests/ui/spirv-attr/invalid-target.stderr b/tests/compiletests/ui/spirv-attr/invalid-target.stderr similarity index 100% rename from tests/ui/spirv-attr/invalid-target.stderr rename to tests/compiletests/ui/spirv-attr/invalid-target.stderr diff --git a/tests/ui/spirv-attr/invariant-invalid.rs b/tests/compiletests/ui/spirv-attr/invariant-invalid.rs similarity index 100% rename from tests/ui/spirv-attr/invariant-invalid.rs rename to tests/compiletests/ui/spirv-attr/invariant-invalid.rs diff --git a/tests/ui/spirv-attr/invariant-invalid.stderr b/tests/compiletests/ui/spirv-attr/invariant-invalid.stderr similarity index 100% rename from tests/ui/spirv-attr/invariant-invalid.stderr rename to tests/compiletests/ui/spirv-attr/invariant-invalid.stderr diff --git a/tests/ui/spirv-attr/invariant.rs b/tests/compiletests/ui/spirv-attr/invariant.rs similarity index 100% rename from tests/ui/spirv-attr/invariant.rs rename to tests/compiletests/ui/spirv-attr/invariant.rs diff --git a/tests/ui/spirv-attr/matrix-type.rs b/tests/compiletests/ui/spirv-attr/matrix-type.rs similarity index 100% rename from tests/ui/spirv-attr/matrix-type.rs rename to tests/compiletests/ui/spirv-attr/matrix-type.rs diff --git a/tests/ui/spirv-attr/multiple.rs b/tests/compiletests/ui/spirv-attr/multiple.rs similarity index 100% rename from tests/ui/spirv-attr/multiple.rs rename to tests/compiletests/ui/spirv-attr/multiple.rs diff --git a/tests/ui/spirv-attr/multiple.stderr b/tests/compiletests/ui/spirv-attr/multiple.stderr similarity index 100% rename from tests/ui/spirv-attr/multiple.stderr rename to tests/compiletests/ui/spirv-attr/multiple.stderr diff --git a/tests/ui/storage_class/mutability-errors.rs b/tests/compiletests/ui/storage_class/mutability-errors.rs similarity index 100% rename from tests/ui/storage_class/mutability-errors.rs rename to tests/compiletests/ui/storage_class/mutability-errors.rs diff --git a/tests/ui/storage_class/mutability-errors.stderr b/tests/compiletests/ui/storage_class/mutability-errors.stderr similarity index 100% rename from tests/ui/storage_class/mutability-errors.stderr rename to tests/compiletests/ui/storage_class/mutability-errors.stderr diff --git a/tests/ui/storage_class/push_constant.rs b/tests/compiletests/ui/storage_class/push_constant.rs similarity index 100% rename from tests/ui/storage_class/push_constant.rs rename to tests/compiletests/ui/storage_class/push_constant.rs diff --git a/tests/ui/storage_class/runtime_descriptor_array.rs b/tests/compiletests/ui/storage_class/runtime_descriptor_array.rs similarity index 100% rename from tests/ui/storage_class/runtime_descriptor_array.rs rename to tests/compiletests/ui/storage_class/runtime_descriptor_array.rs diff --git a/tests/ui/storage_class/runtime_descriptor_array_error.rs b/tests/compiletests/ui/storage_class/runtime_descriptor_array_error.rs similarity index 100% rename from tests/ui/storage_class/runtime_descriptor_array_error.rs rename to tests/compiletests/ui/storage_class/runtime_descriptor_array_error.rs diff --git a/tests/ui/storage_class/runtime_descriptor_array_error.stderr b/tests/compiletests/ui/storage_class/runtime_descriptor_array_error.stderr similarity index 100% rename from tests/ui/storage_class/runtime_descriptor_array_error.stderr rename to tests/compiletests/ui/storage_class/runtime_descriptor_array_error.stderr diff --git a/tests/ui/storage_class/storage_buffer-dst.rs b/tests/compiletests/ui/storage_class/storage_buffer-dst.rs similarity index 100% rename from tests/ui/storage_class/storage_buffer-dst.rs rename to tests/compiletests/ui/storage_class/storage_buffer-dst.rs diff --git a/tests/ui/storage_class/typed_buffer.rs b/tests/compiletests/ui/storage_class/typed_buffer.rs similarity index 100% rename from tests/ui/storage_class/typed_buffer.rs rename to tests/compiletests/ui/storage_class/typed_buffer.rs diff --git a/tests/ui/storage_class/typed_buffer_descriptor_array.rs b/tests/compiletests/ui/storage_class/typed_buffer_descriptor_array.rs similarity index 100% rename from tests/ui/storage_class/typed_buffer_descriptor_array.rs rename to tests/compiletests/ui/storage_class/typed_buffer_descriptor_array.rs diff --git a/tests/ui/storage_class/typed_buffer_descriptor_array_slice.rs b/tests/compiletests/ui/storage_class/typed_buffer_descriptor_array_slice.rs similarity index 100% rename from tests/ui/storage_class/typed_buffer_descriptor_array_slice.rs rename to tests/compiletests/ui/storage_class/typed_buffer_descriptor_array_slice.rs diff --git a/tests/ui/storage_class/typed_buffer_slice.rs b/tests/compiletests/ui/storage_class/typed_buffer_slice.rs similarity index 100% rename from tests/ui/storage_class/typed_buffer_slice.rs rename to tests/compiletests/ui/storage_class/typed_buffer_slice.rs diff --git a/tests/ui/target_features_err.rs b/tests/compiletests/ui/target_features_err.rs similarity index 100% rename from tests/ui/target_features_err.rs rename to tests/compiletests/ui/target_features_err.rs diff --git a/tests/ui/target_features_err.stderr b/tests/compiletests/ui/target_features_err.stderr similarity index 100% rename from tests/ui/target_features_err.stderr rename to tests/compiletests/ui/target_features_err.stderr diff --git a/tests/difftests/README.md b/tests/difftests/README.md new file mode 100644 index 0000000000..caf8887a49 --- /dev/null +++ b/tests/difftests/README.md @@ -0,0 +1,150 @@ +# Difftests + +Difftests verify correctness by running multiple implementations of the same logic and +comparing their outputs. Instead of relying on fixed reference outputs, they detect +discrepancies across implementations. + +## How It Works + +1. **Test Discovery** + + - The harness scans `tests/` for test cases. + - A test case is a directory containing at least two Rust binary packages / variants + to compare. + +2. **Configuration & Execution** + + - The harness creates a temporary output file for each variant binary. + - The harness runs each test variant binary with `cargo run --release`. + - A JSON config file with the output path and other settings is passed to the test + binary as `argv[1]`. + - The binary reads the config, runs its computation, and writes to the output file. + - Tests are run serially so they have full control of the GPU. + +3. **Output Comparison** + - The harness reads outputs as opaque bytes. + - If outputs differ, the test fails. + +Because the difftest harness merely runs Rust binaries in a directory, it supports +testing various setups. For example, you can: + +- Compare different CPU host code (`ash`, `wgpu`, etc.) with different GPU backends + (`rust-gpu`, `cuda`, `metal`, `wgsl`, etc.) against each other to make sure the output + is consistent. +- Verify that CPU and GPU implementations produce the same output. +- Ensure the same `rust-gpu` code gives identical results across different dispatch + methods. + +## Writing a Test + +Create a subdirectory under `tests/` with the test name. For example, `tests/foo/` for a +test named `foo`. In the test directory, create 2 or more Rust binary packages. Add the +packages to the top-level workspace `Cargo.toml` in the `tests/` directory. _Note that +this isn't the top-level workspace for the project._ The test binaries are in their own +workspace rather than the main workspace. + +### Test Binary Example + +Each test binary must: + +1. Have a unique package name in `Cargo.toml`. +2. Read the config file path from `argv[1]`. +3. Load the config using `difftest::Config::from_path`. +4. Write its computed output to `output_path`. + +For example: + +```rust +use difftest::config::Config; +use std::{env, fs, io::Write}; + +fn main() { + let config_path = env::args().nth(1).expect("No config path provided"); + let config = Config::from_path(&config_path).expect("Invalid config"); + + // Real work would go here. + let output = compute_test_output(); + + let mut file = fs::File::create(&config.output_path) + .expect("Failed to create output file"); + file.write_all(&output).expect("Failed to write output"); +} +``` + +### Common test types + +Of course, many test will have common host and GPU needs. Rather than require every test +binary to reimplement functionality, we have created some common tests with reasonable +defaults in the `difftest` library. + +For example, this will handle compiling the current crate as a Rust compute shader, +running it via `wgpu`, and writing the output to the appropriate place: + +```rust +fn main() { + // Load the config from the harness. + let config = Config::from_path(std::env::args().nth(1).unwrap()).unwrap(); + + // Define test parameters, loading the rust shader from the current crate. + let test = WgpuComputeTest::new(RustComputeShader::default(), [1, 1, 1], 1024); + + // Run the test and write the output to a file. + test.run_test(&config).unwrap(); +} +``` + +and this will handle loading a shader named `shader.wgsl` or `compute.wgsl` in the root +of the current crate, running it via `wgpu`, and writing the output to the appropriate +place: + +```rust +fn main() { + // Load the config from the harness. + let config = Config::from_path(std::env::args().nth(1).unwrap()).unwrap(); + + // Define test parameters, loading the wgsl shader from the crate directory. + let test = WgpuComputeTest::new(WgslComputeShader::default(), [1, 1, 1], 1024); + + // Run the test and write the output to a file. + test.run_test(&config).unwrap(); +} +``` + +## Running Tests + +### Run all difftests: + +```sh +cargo difftest +``` + +Note that `cargo difftest` is an alias in `.cargo/config` for `cargo run --release -p +difftest --`. + +### Run specific tests by name: + +```sh +cargo difftest some_test_name +``` + +### Show stdout/stderr from tests: + +```sh +cargo difftest --nocapture +``` + +## Debugging Failing Tests + +If outputs differ, the error message lists: + +- Binary package names +- Their directories +- Output file paths + +Inspect the output files with your preferred tools to determine the differences. + +If you suspect a bug in the test harness, you can view detailed test harness logs: + +```sh +RUST_LOG=trace cargo difftest +``` diff --git a/tests/difftests/bin/Cargo.toml b/tests/difftests/bin/Cargo.toml new file mode 100644 index 0000000000..571631e570 --- /dev/null +++ b/tests/difftests/bin/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "difftests" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true + +# See rustc_codegen_spirv/Cargo.toml for details on these features +[features] +default = ["use-compiled-tools"] +use-installed-tools = [ + "rustc_codegen_spirv/use-installed-tools", + "spirv-builder/use-installed-tools" +] +use-compiled-tools = [ + "rustc_codegen_spirv/use-compiled-tools", + "spirv-builder/use-compiled-tools" +] + +[dependencies] +rustc_codegen_spirv.workspace = true +spirv-builder.workspace = true +anyhow = "1.0" +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["fmt"] } +tempfile = "3.5" +futures = "0.3.31" +tester = "0.9.1" +bytemuck = "1.21.0" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +thiserror = "1.0" +toml = { version = "0.8.20", default-features = false, features = ["parse"] } +bytesize = "2.0.1" + +[lints] +workspace = true diff --git a/tests/difftests/bin/src/main.rs b/tests/difftests/bin/src/main.rs new file mode 100644 index 0000000000..ca76acb8df --- /dev/null +++ b/tests/difftests/bin/src/main.rs @@ -0,0 +1,96 @@ +use anyhow::Result; +use std::{env, process}; +use tester::{ + ColorConfig, DynTestName, OutputFormat, RunIgnored, ShouldPanic, TestDesc, TestDescAndFn, + TestFn, TestType, run_tests_console, + test::{TestOpts, parse_opts}, +}; +use tracing_subscriber::FmtSubscriber; + +mod runner; +use runner::Runner; + +fn main() -> Result<()> { + let subscriber = FmtSubscriber::builder() + .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) + .finish(); + tracing::subscriber::set_global_default(subscriber).expect("Failed to set global subscriber"); + + let args: Vec = env::args().collect(); + let opts: TestOpts = match parse_opts(&args) { + Some(Ok(o)) => TestOpts { + test_threads: Some(1), + ..o + }, + Some(Err(e)) => { + eprintln!("Error parsing test options: {}", e); + process::exit(1); + } + None => TestOpts { + list: false, + filters: vec![], + filter_exact: false, + force_run_in_process: false, + exclude_should_panic: false, + run_ignored: RunIgnored::No, + run_tests: true, + bench_benchmarks: false, + logfile: None, + nocapture: false, + color: ColorConfig::AutoColor, + format: OutputFormat::Pretty, + test_threads: Some(1), + skip: vec![], + time_options: None, + options: tester::Options { + display_output: true, + panic_abort: true, + }, + }, + }; + + // Find the manifest directory at compile time and locate tests in ../tests. + let manifest_dir = env!("CARGO_MANIFEST_DIR"); + let base = std::path::Path::new(manifest_dir) + .join("../tests") + .canonicalize() + .expect("Failed to canonicalize tests directory"); + tracing::debug!("Using tests directory: {}", base.display()); + + let runner = Runner::new(base.clone()); + + let test_cases = + Runner::collect_test_dirs(&base).expect("Failed to collect test case directories"); + if test_cases.is_empty() { + eprintln!("No valid tests found in {}", base.display()); + process::exit(1); + } + + let tests: Vec = test_cases + .into_iter() + .map(|case| { + let test_name = Runner::format_test_name(&case, &base); + TestDescAndFn { + desc: TestDesc { + name: DynTestName(test_name.clone()), + ignore: false, + should_panic: ShouldPanic::No, + allow_fail: false, + test_type: TestType::IntegrationTest, + }, + testfn: TestFn::DynTestFn(Box::new({ + let runner = runner.clone(); + move || { + runner + .run_test_case(&case) + .unwrap_or_else(|e| panic!("{}", e)); + } + })), + } + }) + .collect(); + + let passed = run_tests_console(&opts, tests).expect("Failed to run tests"); + + process::exit(if passed { 0 } else { 1 }); +} diff --git a/tests/difftests/bin/src/runner.rs b/tests/difftests/bin/src/runner.rs new file mode 100644 index 0000000000..bac35eb3fb --- /dev/null +++ b/tests/difftests/bin/src/runner.rs @@ -0,0 +1,456 @@ +use bytesize::ByteSize; +use serde::{Deserialize, Serialize}; +use std::{ + collections::{HashMap, HashSet}, + fs, + io::Write, + path::{Component, Path, PathBuf}, + process::Command, +}; +use tempfile::NamedTempFile; +use thiserror::Error; +use tracing::{debug, error, info, trace}; + +#[derive(Debug, Error)] +pub enum RunnerError { + #[error("I/O error: {source}")] + Io { + #[from] + source: std::io::Error, + }, + #[error("TOML parse error in manifest at {path:?}: {source}")] + Toml { + path: PathBuf, + #[source] + source: toml::de::Error, + }, + #[error("Manifest error in manifest at {path:?}")] + Manifest { path: PathBuf }, + #[error("Insufficient binary packages: found {count}, but at least 2 are required.")] + InsufficientPackages { count: usize }, + #[error("All binaries produced empty output.")] + EmptyOutput, + #[error( + "Duplicate package name found: {pkg_name}. Packages must use unique names as we reuse the target directory to reduce compile times" + )] + DuplicatePackageName { pkg_name: String }, + #[error("Outputs differ:\n\n{0}")] + DifferingOutput(String), + #[error( + "Cargo execution failed in package '{pkg_name}' at '{package_path}' with exit code {exit_status}. Stderr:\n{stderr}" + )] + CargoExecutionFailed { + pkg_name: String, + package_path: PathBuf, + exit_status: i32, + stderr: String, + }, + #[error("Configuration error: {msg}")] + Config { msg: String }, +} + +pub type RunnerResult = std::result::Result; + +#[derive(Debug, Serialize)] +pub struct HarnessConfig { + pub output_path: PathBuf, +} + +#[derive(Deserialize)] +struct CargoPackage { + name: String, +} + +#[derive(Deserialize)] +struct CargoManifest { + package: CargoPackage, +} + +struct PackageOutput { + pkg_name: String, + package_path: PathBuf, + output: Vec, + temp_path: PathBuf, +} + +#[derive(Clone)] +pub struct Runner { + pub base_dir: PathBuf, +} + +impl Runner { + pub fn new(base_dir: PathBuf) -> Self { + Self { base_dir } + } + + pub fn run_test_case(&self, test_case: &Path) -> RunnerResult<()> { + trace!("Starting test case: {}", test_case.display()); + let packages = self.collect_packages(test_case)?; + debug!( + "Found {} package(s) in test case {}", + packages.len(), + test_case.display() + ); + if packages.len() < 2 { + error!("Insufficient packages in test case {}", test_case.display()); + return Err(RunnerError::InsufficientPackages { + count: packages.len(), + }); + } + + // Pre-check that package names are globally unique. + let mut names_seen = HashSet::new(); + for package in &packages { + let manifest_path = package.join("Cargo.toml"); + let pkg_name = self.get_package_name(&manifest_path)?; + if !names_seen.insert(pkg_name.clone()) { + return Err(RunnerError::DuplicatePackageName { pkg_name }); + } + } + + let mut temp_files: Vec = Vec::with_capacity(packages.len()); + let mut pkg_outputs: Vec = Vec::with_capacity(packages.len()); + + for package in packages { + trace!("Processing package at {}", package.display()); + let manifest_path = package.join("Cargo.toml"); + let pkg_name = self.get_package_name(&manifest_path)?; + debug!("Package '{}' detected", pkg_name); + + let output_file = NamedTempFile::new()?; + let temp_output_path = output_file.path().to_path_buf(); + temp_files.push(output_file); + trace!( + "Temporary output file created at {}", + temp_output_path.display() + ); + + let config = HarnessConfig { + output_path: temp_output_path.clone(), + }; + let config_json = serde_json::to_string(&config) + .map_err(|e| RunnerError::Config { msg: e.to_string() })?; + let mut config_file = NamedTempFile::new()?; + write!(config_file, "{}", config_json).map_err(|e| RunnerError::Io { source: e })?; + trace!("Config file created at {}", config_file.path().display()); + + let mut cmd = Command::new("cargo"); + let cmd = cmd + .arg("run") + .arg("--release") + .arg("--manifest-path") + .arg( + manifest_path + .to_str() + .ok_or_else(|| RunnerError::Manifest { + path: manifest_path.clone(), + })?, + ) + .arg( + config_file + .path() + .to_str() + .ok_or_else(|| RunnerError::Config { + msg: "Invalid config file path".into(), + })?, + ); + debug!("Running cargo command: {:?}", cmd); + + let output = cmd + .current_dir(&package) + .output() + .map_err(|e| RunnerError::Io { source: e })?; + let exit_code = output.status.code().unwrap_or(-1); + debug!( + "Cargo run for package '{}' exited with code {}", + pkg_name, exit_code + ); + if !output.status.success() { + let stderr_str = String::from_utf8_lossy(&output.stderr).to_string(); + error!("Cargo execution failed for package '{}'", pkg_name); + return Err(RunnerError::CargoExecutionFailed { + pkg_name, + package_path: package, + exit_status: exit_code, + stderr: stderr_str, + }); + } + + let output_bytes = fs::read(temp_files.last().unwrap().path())?; + debug!( + "Read {} bytes of output for package '{}'", + output_bytes.len(), + pkg_name + ); + pkg_outputs.push(PackageOutput { + pkg_name, + package_path: package, + output: output_bytes, + temp_path: temp_output_path, + }); + } + + if pkg_outputs.iter().all(|po| po.output.is_empty()) { + error!("All packages produced empty output."); + return Err(RunnerError::EmptyOutput); + } + + let groups = self.group_outputs(&pkg_outputs); + if groups.len() > 1 { + let details = self.format_group_details(&pkg_outputs); + self.keep_temp_files(&mut temp_files); + return Err(RunnerError::DifferingOutput(details)); + } + info!( + "Test case '{}' passed.", + Runner::format_test_name(test_case, test_case.parent().unwrap_or(test_case)) + ); + Ok(()) + } + + #[allow(clippy::unused_self)] + fn collect_packages(&self, test_case: &Path) -> RunnerResult> { + let mut packages = Vec::new(); + for entry in fs::read_dir(test_case)? { + let entry = entry?; + let path = entry.path(); + if path.is_dir() && path.join("Cargo.toml").exists() { + debug!("Found package candidate: {}", path.display()); + packages.push(path); + } + } + Ok(packages) + } + + #[allow(clippy::unused_self)] + fn group_outputs<'a>( + &self, + pkg_outputs: &'a [PackageOutput], + ) -> HashMap, Vec<&'a PackageOutput>> { + let mut groups: HashMap, Vec<&'a PackageOutput>> = HashMap::new(); + for po in pkg_outputs { + groups.entry(po.output.clone()).or_default().push(po); + } + groups + } + + fn format_group_details(&self, pkg_outputs: &[PackageOutput]) -> String { + let groups = self.group_outputs(pkg_outputs); + const TOTAL_WIDTH: usize = 50; + let mut details = Vec::with_capacity(groups.len() * 4); + for (i, (output, group)) in groups.iter().enumerate() { + let group_index = i + 1; + let header = format!( + "╭─ Output {} ({}) ", + group_index, + ByteSize::b(output.len() as u64) + ); + let header = if header.len() < TOTAL_WIDTH { + format!("{}{}", header, "─".repeat(TOTAL_WIDTH - header.len())) + } else { + header + }; + details.push(header); + for po in group { + let p = po + .package_path + .strip_prefix(self.base_dir.parent().expect("base_dir is not root")) + .expect("base_path is not a prefix of package_path"); + details.push(format!("│ {} ({})", po.pkg_name, p.display())); + } + let footer = format!("╰──▶ {} \n", group[0].temp_path.display()); + details.push(footer); + } + details.join("\n") + } + + #[allow(clippy::unused_self)] + fn get_package_name(&self, manifest_path: &Path) -> RunnerResult { + trace!("Reading manifest from {}", manifest_path.display()); + let content = fs::read_to_string(manifest_path)?; + let manifest: CargoManifest = toml::from_str(&content).map_err(|e| RunnerError::Toml { + path: manifest_path.to_path_buf(), + source: e, + })?; + debug!("Package name '{}' found in manifest", manifest.package.name); + Ok(manifest.package.name) + } + + #[allow(clippy::unused_self)] + fn keep_temp_files(&self, temp_files: &mut Vec) { + for file in temp_files.drain(..) { + let _ = file.into_temp_path().keep(); + } + } + + pub fn format_test_name(test_case: &Path, base: &Path) -> String { + let name = test_case.strip_prefix(base).map_or_else( + |_| test_case.to_string_lossy().into_owned(), + |relative| { + relative + .components() + .filter_map(|comp| match comp { + Component::Normal(os_str) => Some(os_str.to_string_lossy()), + _ => None, + }) + .collect::>() + .join("::") + }, + ); + format!("difftests::{}", name) + } + + pub fn collect_test_dirs(root: &Path) -> RunnerResult> { + let mut test_cases = Vec::new(); + for entry in fs::read_dir(root)? { + let entry = entry?; + let path = entry.path(); + if path.is_dir() { + if Runner::collect_test_binaries(&path)?.len() >= 2 { + debug!("Test case found: {}", path.display()); + test_cases.push(path.clone()); + } + let mut subdirs = Runner::collect_test_dirs(&path)?; + test_cases.append(&mut subdirs); + } + } + Ok(test_cases) + } + + fn collect_test_binaries(test_case: &Path) -> RunnerResult> { + let mut packages = Vec::new(); + for entry in fs::read_dir(test_case)? { + let entry = entry?; + let path = entry.path(); + if path.is_dir() && path.join("Cargo.toml").exists() { + debug!("Found binary package candidate: {}", path.display()); + packages.push(path); + } + } + Ok(packages) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::{fs, io::Write, path::Path, path::PathBuf}; + use tempfile::{NamedTempFile, tempdir}; + + fn dummy_package_output(name: &str, path: &str, output: &[u8], temp: &str) -> PackageOutput { + PackageOutput { + pkg_name: name.to_string(), + package_path: PathBuf::from(path), + output: output.to_vec(), + temp_path: PathBuf::from(temp), + } + } + + #[test] + fn test_group_outputs_multiple_groups() { + let pkg1 = dummy_package_output("foo", "/path/to/foo", b"hello", "tmp1"); + let pkg2 = dummy_package_output("bar", "/path/to/bar", b"world", "tmp2"); + let pkg3 = dummy_package_output("baz", "/path/to/baz", b"hello", "tmp3"); + let outputs = vec![pkg1, pkg2, pkg3]; + let runner = Runner::new(PathBuf::from("dummy_base")); + let groups = runner.group_outputs(&outputs); + assert_eq!(groups.len(), 2); + } + + #[test] + fn test_format_test_name() { + let base = Path::new("/home/user/tests"); + let test_case = base.join("group1/testcase1"); + let formatted = Runner::format_test_name(&test_case, base); + assert_eq!(formatted, "difftests::group1::testcase1"); + } + + #[test] + fn test_get_package_name() { + let mut temp = NamedTempFile::new().expect("failed to create temp file"); + let cargo_toml = r#" + [package] + name = "dummy_package" + version = "0.1.0" + edition = "2021" + "#; + write!(temp, "{}", cargo_toml).expect("failed to write to temp file"); + let runner = Runner::new(PathBuf::from("dummy_base")); + let pkg_name = runner + .get_package_name(temp.path()) + .expect("failed to get package name"); + assert_eq!(pkg_name, "dummy_package"); + } + + #[test] + fn test_collect_packages() { + let temp_dir = tempdir().expect("failed to create temp dir"); + let dir_path = temp_dir.path(); + let pkg_dir = dir_path.join("pkg1"); + fs::create_dir(&pkg_dir).expect("failed to create pkg1 dir"); + fs::write(pkg_dir.join("Cargo.toml"), "[package]\nname = \"pkg1\"") + .expect("failed to write Cargo.toml"); + let runner = Runner::new(PathBuf::from("dummy_base")); + let packages = runner + .collect_packages(dir_path) + .expect("failed to collect packages"); + assert_eq!(packages.len(), 1); + assert_eq!(packages[0], pkg_dir); + } + + #[test] + fn test_collect_test_dirs() { + let temp_dir = tempdir().expect("failed to create temp dir"); + let base = temp_dir.path(); + let test_case_dir = base.join("test_case"); + fs::create_dir(&test_case_dir).expect("failed to create test_case dir"); + let pkg1_dir = test_case_dir.join("pkg1"); + fs::create_dir(&pkg1_dir).expect("failed to create pkg1"); + fs::write(pkg1_dir.join("Cargo.toml"), "[package]\nname = \"pkg1\"") + .expect("failed to write Cargo.toml for pkg1"); + let pkg2_dir = test_case_dir.join("pkg2"); + fs::create_dir(&pkg2_dir).expect("failed to create pkg2"); + fs::write(pkg2_dir.join("Cargo.toml"), "[package]\nname = \"pkg2\"") + .expect("failed to write Cargo.toml for pkg2"); + let test_dirs = Runner::collect_test_dirs(base).expect("failed to collect test dirs"); + assert!(test_dirs.contains(&test_case_dir)); + } + + #[test] + fn test_run_test_case_insufficient_packages() { + let temp_dir = tempdir().expect("failed to create temp dir"); + let test_case_dir = temp_dir.path().join("single_pkg"); + fs::create_dir(&test_case_dir).expect("failed to create test_case dir"); + let pkg_dir = test_case_dir.join("pkg1"); + fs::create_dir(&pkg_dir).expect("failed to create pkg1"); + fs::write(pkg_dir.join("Cargo.toml"), "[package]\nname = \"pkg1\"") + .expect("failed to write Cargo.toml for pkg1"); + let runner = Runner::new(PathBuf::from("dummy_base")); + let result = runner.run_test_case(&test_case_dir); + match result { + Err(RunnerError::InsufficientPackages { count }) => assert_eq!(count, 1), + _ => panic!("Expected InsufficientPackages error"), + } + } + + #[test] + fn test_duplicate_package_names() { + let temp_dir = tempdir().expect("failed to create temp dir"); + let test_case_dir = temp_dir.path().join("dup_pkg"); + fs::create_dir(&test_case_dir).expect("failed to create test_case dir"); + let pkg1_dir = test_case_dir.join("pkg1"); + fs::create_dir(&pkg1_dir).expect("failed to create pkg1"); + fs::write(pkg1_dir.join("Cargo.toml"), "[package]\nname = \"dup_pkg\"") + .expect("failed to write Cargo.toml for pkg1"); + let pkg2_dir = test_case_dir.join("pkg2"); + fs::create_dir(&pkg2_dir).expect("failed to create pkg2"); + fs::write(pkg2_dir.join("Cargo.toml"), "[package]\nname = \"dup_pkg\"") + .expect("failed to write Cargo.toml for pkg2"); + let runner = Runner::new(PathBuf::from("dummy_base")); + let result = runner.run_test_case(&test_case_dir); + match result { + Err(RunnerError::DuplicatePackageName { pkg_name }) => assert_eq!(pkg_name, "dup_pkg"), + _ => panic!("Expected DuplicatePackageName error"), + } + } +} diff --git a/tests/difftests/lib/Cargo.toml b/tests/difftests/lib/Cargo.toml new file mode 100644 index 0000000000..4459cc202d --- /dev/null +++ b/tests/difftests/lib/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "difftest" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true + +# See rustc_codegen_spirv/Cargo.toml for details on these features +[features] +default = ["use-compiled-tools"] +use-installed-tools = [ + "spirv-builder/use-installed-tools" +] +use-compiled-tools = [ + "spirv-builder/use-compiled-tools" +] + +[dependencies] +rustc_codegen_spirv.workspace = true +spirv-builder.workspace = true +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +wgpu = { version = "23", features = ["spirv", "vulkan-portability"] } +tempfile = "3.5" +futures = "0.3.31" +bytemuck = "1.21.0" +thiserror = "1.0" + +[lints] +workspace = true diff --git a/tests/difftests/lib/src/config.rs b/tests/difftests/lib/src/config.rs new file mode 100644 index 0000000000..28c6ebb6b3 --- /dev/null +++ b/tests/difftests/lib/src/config.rs @@ -0,0 +1,24 @@ +use serde::Deserialize; +use std::{fs, path::Path}; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum ConfigError { + #[error("I/O error: {0}")] + Io(#[from] std::io::Error), + #[error("JSON error: {0}")] + Json(#[from] serde_json::Error), +} + +#[derive(Debug, Deserialize)] +pub struct Config { + pub output_path: std::path::PathBuf, +} + +impl Config { + pub fn from_path>(path: P) -> Result { + let content = fs::read_to_string(path)?; + let config = serde_json::from_str(&content)?; + Ok(config) + } +} diff --git a/tests/difftests/lib/src/lib.rs b/tests/difftests/lib/src/lib.rs new file mode 100644 index 0000000000..fb32118b29 --- /dev/null +++ b/tests/difftests/lib/src/lib.rs @@ -0,0 +1,18 @@ +pub mod config; +pub mod scaffold; + +#[cfg(test)] +mod tests { + use super::config::Config; + use std::io::Write; + use tempfile::NamedTempFile; + + #[test] + fn test_config_from_path() { + let mut tmp = NamedTempFile::new().unwrap(); + let config_json = r#"{ "output_path": "/tmp/output.txt" }"#; + write!(tmp, "{}", config_json).unwrap(); + let config = Config::from_path(tmp.path()).unwrap(); + assert_eq!(config.output_path.to_str().unwrap(), "/tmp/output.txt"); + } +} diff --git a/tests/difftests/lib/src/scaffold/compute/mod.rs b/tests/difftests/lib/src/scaffold/compute/mod.rs new file mode 100644 index 0000000000..0478faecfd --- /dev/null +++ b/tests/difftests/lib/src/scaffold/compute/mod.rs @@ -0,0 +1,2 @@ +mod wgpu; +pub use wgpu::{RustComputeShader, WgpuComputeTest, WgslComputeShader}; diff --git a/tests/difftests/lib/src/scaffold/compute/wgpu.rs b/tests/difftests/lib/src/scaffold/compute/wgpu.rs new file mode 100644 index 0000000000..1125fd4f39 --- /dev/null +++ b/tests/difftests/lib/src/scaffold/compute/wgpu.rs @@ -0,0 +1,361 @@ +use crate::config::Config; +use bytemuck::Pod; +use futures::{channel::oneshot::Canceled, executor::block_on}; +use spirv_builder::{ModuleResult, SpirvBuilder}; +use std::{ + borrow::Cow, + env, + fs::{self, File}, + io::Write, + path::PathBuf, +}; +use thiserror::Error; +use wgpu::{BufferAsyncError, PipelineCompilationOptions, util::DeviceExt}; + +#[derive(Error, Debug)] +pub enum ComputeError { + #[error("Failed to find a suitable GPU adapter")] + AdapterNotFound, + #[error("Failed to create device: {0}")] + DeviceCreationFailed(String), + #[error("Failed to load shader: {0}")] + ShaderLoadFailed(String), + #[error("Mapping compute output future canceled: {0}")] + MappingCanceled(Canceled), + #[error("Mapping compute output failed: {0}")] + MappingFailed(BufferAsyncError), +} + +/// Trait that creates a shader module and provides its entry point. +pub trait ComputeShader { + fn create_module( + &self, + device: &wgpu::Device, + ) -> Result<(wgpu::ShaderModule, Option), ComputeError>; +} + +/// A compute shader written in Rust compiled with spirv-builder. +pub struct RustComputeShader { + pub path: PathBuf, +} + +impl RustComputeShader { + pub fn new>(path: P) -> Self { + Self { path: path.into() } + } +} + +impl ComputeShader for RustComputeShader { + fn create_module( + &self, + device: &wgpu::Device, + ) -> Result<(wgpu::ShaderModule, Option), ComputeError> { + let builder = SpirvBuilder::new(&self.path, "spirv-unknown-vulkan1.1") + .print_metadata(spirv_builder::MetadataPrintout::None) + .release(true) + .multimodule(false) + .shader_panic_strategy(spirv_builder::ShaderPanicStrategy::SilentExit) + .preserve_bindings(true); + let artifact = builder + .build() + .map_err(|e| ComputeError::ShaderLoadFailed(e.to_string()))?; + + if artifact.entry_points.len() != 1 { + return Err(ComputeError::ShaderLoadFailed(format!( + "Expected exactly one entry point, found {}", + artifact.entry_points.len() + ))); + } + let entry_point = artifact.entry_points.into_iter().next().unwrap(); + + let shader_bytes = match artifact.module { + ModuleResult::SingleModule(path) => { + fs::read(&path).map_err(|e| ComputeError::ShaderLoadFailed(e.to_string()))? + } + ModuleResult::MultiModule(_modules) => { + return Err(ComputeError::ShaderLoadFailed( + "Multiple modules produced".to_string(), + )); + } + }; + + if shader_bytes.len() % 4 != 0 { + return Err(ComputeError::ShaderLoadFailed( + "SPIR-V binary length is not a multiple of 4".to_string(), + )); + } + let shader_words: Vec = bytemuck::cast_slice(&shader_bytes).to_vec(); + let module = device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: Some("Compute Shader"), + source: wgpu::ShaderSource::SpirV(Cow::Owned(shader_words)), + }); + Ok((module, Some(entry_point))) + } +} + +/// A WGSL compute shader. +pub struct WgslComputeShader { + pub path: PathBuf, + pub entry_point: Option, +} + +impl WgslComputeShader { + pub fn new>(path: P, entry_point: Option) -> Self { + Self { + path: path.into(), + entry_point, + } + } +} + +impl ComputeShader for WgslComputeShader { + fn create_module( + &self, + device: &wgpu::Device, + ) -> Result<(wgpu::ShaderModule, Option), ComputeError> { + let shader_source = fs::read_to_string(&self.path) + .map_err(|e| ComputeError::ShaderLoadFailed(e.to_string()))?; + let module = device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: Some("Compute Shader"), + source: wgpu::ShaderSource::Wgsl(Cow::Owned(shader_source)), + }); + Ok((module, self.entry_point.clone())) + } +} + +/// Compute test that is generic over the shader type. +pub struct WgpuComputeTest { + shader: S, + dispatch: [u32; 3], + output_bytes: u64, +} + +impl WgpuComputeTest +where + S: ComputeShader, +{ + pub fn new(shader: S, dispatch: [u32; 3], output_bytes: u64) -> Self { + Self { + shader, + dispatch, + output_bytes, + } + } + + fn init() -> Result<(wgpu::Device, wgpu::Queue), ComputeError> { + block_on(async { + let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(target_os = "linux")] + backends: wgpu::Backends::VULKAN, + #[cfg(not(target_os = "linux"))] + backends: wgpu::Backends::PRIMARY, + dx12_shader_compiler: Default::default(), + flags: Default::default(), + gles_minor_version: Default::default(), + }); + let adapter = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::HighPerformance, + compatible_surface: None, + force_fallback_adapter: false, + }) + .await + .ok_or(ComputeError::AdapterNotFound)?; + let (device, queue) = adapter + .request_device( + &wgpu::DeviceDescriptor { + label: Some("wgpu Device"), + #[cfg(target_os = "linux")] + required_features: wgpu::Features::SPIRV_SHADER_PASSTHROUGH, + #[cfg(not(target_os = "linux"))] + required_features: wgpu::Features::empty(), + required_limits: wgpu::Limits::default(), + memory_hints: Default::default(), + }, + None, + ) + .await + .map_err(|e| ComputeError::DeviceCreationFailed(e.to_string()))?; + Ok((device, queue)) + }) + } + + fn run_internal(self, input: Option) -> Result, ComputeError> + where + I: Sized + Pod, + { + let (device, queue) = Self::init()?; + let (module, entrypoint) = self.shader.create_module(&device)?; + let pipeline = device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { + label: Some("Compute Pipeline"), + layout: None, + module: &module, + entry_point: entrypoint.as_deref(), + compilation_options: PipelineCompilationOptions::default(), + cache: None, + }); + + // Create the output buffer. + let output_buffer = device.create_buffer(&wgpu::BufferDescriptor { + label: Some("Output Buffer"), + size: self.output_bytes, + usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_SRC, + mapped_at_creation: true, + }); + { + // Zero the buffer. + let initial_data = vec![0u8; self.output_bytes as usize]; + let mut mapping = output_buffer.slice(..).get_mapped_range_mut(); + mapping.copy_from_slice(&initial_data); + } + output_buffer.unmap(); + + // Build the bind group. + let bind_group = if let Some(input_val) = input { + let input_bytes = bytemuck::bytes_of(&input_val); + let input_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Input Buffer"), + contents: input_bytes, + usage: wgpu::BufferUsages::UNIFORM, + }); + device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &pipeline.get_bind_group_layout(0), + entries: &[ + // Binding 0: uniform input. + wgpu::BindGroupEntry { + binding: 0, + resource: input_buffer.as_entire_binding(), + }, + // Binding 1: storage output. + wgpu::BindGroupEntry { + binding: 1, + resource: output_buffer.as_entire_binding(), + }, + ], + label: Some("Compute Bind Group (with input)"), + }) + } else { + device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &pipeline.get_bind_group_layout(0), + entries: &[ + // Binding 0: storage output. + wgpu::BindGroupEntry { + binding: 0, + resource: output_buffer.as_entire_binding(), + }, + ], + label: Some("Compute Bind Group (no input)"), + }) + }; + + let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Compute Encoder"), + }); + { + let mut pass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { + label: Some("Compute Pass"), + timestamp_writes: Default::default(), + }); + pass.set_pipeline(&pipeline); + pass.set_bind_group(0, &bind_group, &[]); + pass.dispatch_workgroups(self.dispatch[0], self.dispatch[1], self.dispatch[2]); + } + + // Create a staging buffer. + let staging_buffer = device.create_buffer(&wgpu::BufferDescriptor { + label: Some("Staging Buffer"), + size: self.output_bytes, + usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST, + mapped_at_creation: false, + }); + encoder.copy_buffer_to_buffer(&output_buffer, 0, &staging_buffer, 0, self.output_bytes); + queue.submit(Some(encoder.finish())); + + let buffer_slice = staging_buffer.slice(..); + let (sender, receiver) = futures::channel::oneshot::channel(); + buffer_slice.map_async(wgpu::MapMode::Read, move |res| { + let _ = sender.send(res); + }); + device.poll(wgpu::Maintain::Wait); + block_on(receiver) + .map_err(ComputeError::MappingCanceled)? + .map_err(ComputeError::MappingFailed)?; + let data = buffer_slice.get_mapped_range().to_vec(); + staging_buffer.unmap(); + Ok(data) + } + + /// Runs the compute shader with no input. + pub fn run(self) -> Result, ComputeError> { + self.run_internal::<()>(None) + } + + /// Runs the compute shader with provided input. + pub fn run_with_input(self, input: I) -> Result, ComputeError> + where + I: Sized + Pod, + { + self.run_internal(Some(input)) + } + + /// Runs the compute shader with no input and writes the output to a file. + pub fn run_test(self, config: &Config) -> Result<(), ComputeError> { + let output = self.run()?; + let mut f = File::create(&config.output_path).unwrap(); + f.write_all(&output).unwrap(); + Ok(()) + } + + /// Runs the compute shader with provided input and writes the output to a file. + pub fn run_test_with_input(self, config: &Config, input: I) -> Result<(), ComputeError> + where + I: Sized + Pod, + { + let output = self.run_with_input(input)?; + let mut f = File::create(&config.output_path).unwrap(); + f.write_all(&output).unwrap(); + Ok(()) + } +} + +/// For WGSL, the code checks for "shader.wgsl" then "compute.wgsl". +impl Default for WgslComputeShader { + fn default() -> Self { + let manifest_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"); + let manifest_path = PathBuf::from(manifest_dir); + let shader_path = manifest_path.join("shader.wgsl"); + let compute_path = manifest_path.join("compute.wgsl"); + + let (file, source) = if shader_path.exists() { + ( + shader_path.clone(), + fs::read_to_string(&shader_path).unwrap_or_default(), + ) + } else if compute_path.exists() { + ( + compute_path.clone(), + fs::read_to_string(&compute_path).unwrap_or_default(), + ) + } else { + panic!("No default WGSL shader found in manifest directory"); + }; + + let entry_point = if source.contains("fn main_cs(") { + Some("main_cs".to_string()) + } else if source.contains("fn main(") { + Some("main".to_string()) + } else { + None + }; + + Self::new(file, entry_point) + } +} + +/// For the SPIR-V shader, the manifest directory is used as the build path. +impl Default for RustComputeShader { + fn default() -> Self { + let manifest_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"); + Self::new(PathBuf::from(manifest_dir)) + } +} diff --git a/tests/difftests/lib/src/scaffold/mod.rs b/tests/difftests/lib/src/scaffold/mod.rs new file mode 100644 index 0000000000..6ad3d09910 --- /dev/null +++ b/tests/difftests/lib/src/scaffold/mod.rs @@ -0,0 +1 @@ +pub mod compute; diff --git a/tests/difftests/tests/Cargo.lock b/tests/difftests/tests/Cargo.lock new file mode 100644 index 0000000000..49602e0f50 --- /dev/null +++ b/tests/difftests/tests/Cargo.lock @@ -0,0 +1,1977 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ar" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d67af77d68a931ecd5cbd8a3b5987d63a1d1d1278f7f6a60ae33db485cdebb69" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytemuck" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cc" +version = "1.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "derive_more" +version = "0.99.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "difftest" +version = "0.9.0" +dependencies = [ + "bytemuck", + "futures", + "rustc_codegen_spirv", + "serde", + "serde_json", + "spirv-builder", + "tempfile", + "thiserror", + "wgpu", +] + +[[package]] +name = "document-features" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +dependencies = [ + "litrs", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elsa" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9abf33c656a7256451ebb7d0082c5a471820c31269e49d807c538c252352186e" +dependencies = [ + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", +] + +[[package]] +name = "gimli" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e1d97fbe9722ba9bbd0c97051c2956e726562b61f86a25a4360398a40edfc9" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc46dd3ec48fdd8e693a98d2b8bafae273a2d54c1de02a2a7e3d57d501f39677" +dependencies = [ + "libm", +] + +[[package]] +name = "glow" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.9.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" +dependencies = [ + "bitflags 2.9.0", + "gpu-descriptor-types", + "hashbrown 0.15.2", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "internal-iterator" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "969ee3fc68ec2e88eb21434ce4d9b7e1600d1ce92ff974560a6c4a304f5124b9" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets", +] + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "longest-increasing-subsequence" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.9.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + +[[package]] +name = "naga" +version = "23.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.9.0", + "cfg_aliases", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "petgraph", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "crc32fast", + "flate2", + "hashbrown 0.15.2", + "indexmap", + "memchr", + "ruzstd", + "wasmparser", +] + +[[package]] +name = "once_cell" +version = "1.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "range-alloc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" + +[[package]] +name = "raw-string" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0501e134c6905fee1f10fed25b0a7e1261bf676cffac9543a7d0730dec01af2" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "rspirv" +version = "0.12.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cf3a93856b6e5946537278df0d3075596371b1950ccff012f02b0f7eafec8d" +dependencies = [ + "rustc-hash", + "spirv", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_codegen_spirv" +version = "0.9.0" +dependencies = [ + "ahash", + "ar", + "bytemuck", + "either", + "indexmap", + "itertools", + "lazy_static", + "libc", + "log", + "object", + "regex", + "rspirv", + "rustc-demangle", + "rustc_codegen_spirv-types", + "rustix 0.38.44", + "sanitize-filename", + "smallvec", + "spirt", + "spirv-tools", + "thorin-dwp", + "tracing", + "tracing-subscriber", + "tracing-tree", +] + +[[package]] +name = "rustc_codegen_spirv-types" +version = "0.9.0" +dependencies = [ + "rspirv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.0", + "errno", + "itoa", + "libc", + "linux-raw-sys 0.4.15", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.3", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ruzstd" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad02996bfc73da3e301efe90b1837be9ed8f4a462b6ed410aa35d00381de89f" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "sanitize-filename" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c502bdb638f1396509467cb0580ef3b29aa2a45c5d43e5d84928241280296c" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simple-compute-rust" +version = "0.0.0" +dependencies = [ + "difftest", + "spirv-std", +] + +[[package]] +name = "simple-compute-wgsl" +version = "0.0.0" +dependencies = [ + "difftest", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +dependencies = [ + "serde", +] + +[[package]] +name = "spirt" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2d5968bd2a36466468aac637b355776f080edfb0c6f769b2b99b9708260c42a" +dependencies = [ + "arrayvec", + "bytemuck", + "derive_more", + "elsa", + "indexmap", + "internal-iterator", + "itertools", + "lazy_static", + "longest-increasing-subsequence", + "rustc-hash", + "serde", + "serde_json", + "smallvec", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "spirv-builder" +version = "0.9.0" +dependencies = [ + "memchr", + "raw-string", + "rustc_codegen_spirv", + "rustc_codegen_spirv-types", + "serde", + "serde_json", +] + +[[package]] +name = "spirv-std" +version = "0.9.0" +dependencies = [ + "bitflags 1.3.2", + "glam", + "num-traits", + "spirv-std-macros", + "spirv-std-types", +] + +[[package]] +name = "spirv-std-macros" +version = "0.9.0" +dependencies = [ + "proc-macro2", + "quote", + "spirv-std-types", + "syn", +] + +[[package]] +name = "spirv-std-types" +version = "0.9.0" + +[[package]] +name = "spirv-tools" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcb3b0832881834994b7ec82b709ec5491043ceb4bf8101e27da6b5234b24261" +dependencies = [ + "spirv-tools-sys", +] + +[[package]] +name = "spirv-tools-sys" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e68b55a97aa6856e010a6f2477425875a97873e147bb0232160e73c45bdae7" +dependencies = [ + "cc", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488960f40a3fd53d72c2a29a58722561dee8afdd175bd88e3db4677d7b2ba600" +dependencies = [ + "fastrand", + "getrandom 0.3.1", + "once_cell", + "rustix 1.0.2", + "windows-sys 0.59.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thorin-dwp" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "813ba76597db32dc4f6992fd8bf8f394715b88d352fd97401da67dab6283b4c6" +dependencies = [ + "gimli", + "hashbrown 0.14.5", + "object", + "tracing", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term 0.46.0", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "tracing-tree" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b56c62d2c80033cb36fae448730a2f2ef99410fe3ecbffc916681a32f6807dbe" +dependencies = [ + "nu-ansi-term 0.50.1", + "tracing-core", + "tracing-log", + "tracing-subscriber", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasmparser" +version = "0.222.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa210fd1788e6b37a1d1930f3389c48e1d6ebd1a013d34fa4b7f9e3e3bf03146" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wgpu" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" +dependencies = [ + "arrayvec", + "cfg_aliases", + "document-features", + "js-sys", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.9.0", + "bytemuck", + "cfg_aliases", + "document-features", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash", + "smallvec", + "thiserror", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.9.0", + "block", + "bytemuck", + "cfg_aliases", + "core-graphics-types", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows", + "windows-core", +] + +[[package]] +name = "wgpu-types" +version = "23.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" +dependencies = [ + "bitflags 2.9.0", + "js-sys", + "web-sys", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core", + "windows-targets", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "xml-rs" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/tests/difftests/tests/Cargo.toml b/tests/difftests/tests/Cargo.toml new file mode 100644 index 0000000000..34f08f9250 --- /dev/null +++ b/tests/difftests/tests/Cargo.toml @@ -0,0 +1,53 @@ +[workspace] +resolver = "2" +members = [ + "simple-compute/simple-compute-rust", + "simple-compute/simple-compute-wgsl", +] + +[workspace.package] +edition = "2021" +license = "MIT OR Apache-2.0" +publish = false + +[workspace.lints.rust] +unexpected_cfgs = { level = "allow", check-cfg = [ + 'cfg(target_arch, values("spirv"))' +] } + +[workspace.dependencies] +spirv-builder = { path = "../../../crates/spirv-builder", version = "=0.9.0", default-features = false } +spirv-std = { path = "../../../crates/spirv-std", version = "=0.9.0" } +spirv-std-types = { path = "../../../crates/spirv-std/shared", version = "=0.9.0" } +spirv-std-macros = { path = "../../../crates/spirv-std/macros", version = "=0.9.0" } +difftest = { path = "../../../tests/difftests/lib" } +# External dependencies that need to be mentioned more than once. +num-traits = { version = "0.2.15", default-features = false } +glam = { version = ">=0.22, <=0.29", default-features = false } + +# Enable incremental by default in release mode. +[profile.release] +incremental = true +# HACK(eddyb) this is the default but without explicitly specifying it, Cargo +# will treat the identical settings in `[profile.release.build-override]` below +# as different sets of `rustc` flags and will not reuse artifacts between them. +codegen-units = 256 + +# Compile build-dependencies in release mode with the same settings +# as regular dependencies (including the incremental enabled above). +[profile.release.build-override] +opt-level = 3 +incremental = true +codegen-units = 256 + +# HACK(eddyb) reduce the number of linker exports and/or imports, by avoiding +# inter-CGU linkage, to stay under the 64Ki MSVC limit for `rustc_codegen_spirv` +# when building it in "debug mode" (only relevant to CI for now, realistically), +# i.e. working around this issue: https://github.com/rust-lang/rust/issues/53014. +[profile.dev] +# HACK(eddyb) fewer inter-crate exports/imports (not just inter-CGU), but sadly +# not configurable w/o breaking `Cargo.toml` parsing from non-nightly Cargo +# (moved to `.github/workflows/ci.yaml` as `RUSTFLAGS: -Zshare-generics=off`). +# +# rustflags = ["-Zshare-generics=off"] +codegen-units = 1 diff --git a/tests/difftests/tests/simple-compute/simple-compute-rust/Cargo.toml b/tests/difftests/tests/simple-compute/simple-compute-rust/Cargo.toml new file mode 100644 index 0000000000..b619027e6e --- /dev/null +++ b/tests/difftests/tests/simple-compute/simple-compute-rust/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "simple-compute-rust" +edition.workspace = true + +[lints] +workspace = true + +[lib] +crate-type = ["dylib"] + +# Common deps +[dependencies] + +# GPU deps +[target.'cfg(target_arch = "spirv")'.dependencies] +spirv-std.workspace = true + +# CPU deps +[target.'cfg(not(target_arch = "spirv"))'.dependencies] +difftest.workspace = true diff --git a/tests/difftests/tests/simple-compute/simple-compute-rust/src/lib.rs b/tests/difftests/tests/simple-compute/simple-compute-rust/src/lib.rs new file mode 100644 index 0000000000..a398192b92 --- /dev/null +++ b/tests/difftests/tests/simple-compute/simple-compute-rust/src/lib.rs @@ -0,0 +1,9 @@ +#![cfg(target_arch = "spirv")] +#![no_std] + +use spirv_std::spirv; + +#[spirv(compute(threads(1)))] +pub fn main_cs(#[spirv(storage_buffer, descriptor_set = 0, binding = 0)] output: &mut [u32]) { + output[0] = 42; +} diff --git a/tests/difftests/tests/simple-compute/simple-compute-rust/src/main.rs b/tests/difftests/tests/simple-compute/simple-compute-rust/src/main.rs new file mode 100644 index 0000000000..a413174aca --- /dev/null +++ b/tests/difftests/tests/simple-compute/simple-compute-rust/src/main.rs @@ -0,0 +1,14 @@ +use difftest::config::Config; +use difftest::scaffold::compute::{RustComputeShader, WgpuComputeTest}; +use std::path::PathBuf; + +fn main() { + // Load the config from the harness. + let config = Config::from_path(std::env::args().nth(1).unwrap()).unwrap(); + + // Define test parameters, loading the rust shader from the current crate. + let test = WgpuComputeTest::new(RustComputeShader::default(), [1, 1, 1], 1024); + + // Run the test and write the output to a file. + test.run_test(&config).unwrap(); +} diff --git a/tests/difftests/tests/simple-compute/simple-compute-wgsl/Cargo.toml b/tests/difftests/tests/simple-compute/simple-compute-wgsl/Cargo.toml new file mode 100644 index 0000000000..ae5a79dda3 --- /dev/null +++ b/tests/difftests/tests/simple-compute/simple-compute-wgsl/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "simple-compute-wgsl" +edition.workspace = true + +[lints] +workspace = true + +[dependencies] +difftest.workspace = true diff --git a/tests/difftests/tests/simple-compute/simple-compute-wgsl/shader.wgsl b/tests/difftests/tests/simple-compute/simple-compute-wgsl/shader.wgsl new file mode 100644 index 0000000000..8088eddf31 --- /dev/null +++ b/tests/difftests/tests/simple-compute/simple-compute-wgsl/shader.wgsl @@ -0,0 +1,7 @@ +@group(0) @binding(0) +var output: array; + +@compute @workgroup_size(1) +fn main_cs() { + output[0] = 42u; +} diff --git a/tests/difftests/tests/simple-compute/simple-compute-wgsl/src/main.rs b/tests/difftests/tests/simple-compute/simple-compute-wgsl/src/main.rs new file mode 100644 index 0000000000..163a2c99b3 --- /dev/null +++ b/tests/difftests/tests/simple-compute/simple-compute-wgsl/src/main.rs @@ -0,0 +1,14 @@ +use difftest::config::Config; +use difftest::scaffold::compute::{WgpuComputeTest, WgslComputeShader}; +use std::path::PathBuf; + +fn main() { + // Load the config from the harness. + let config = Config::from_path(std::env::args().nth(1).unwrap()).unwrap(); + + // Define test parameters, loading the wgsl shader from the crate directory. + let test = WgpuComputeTest::new(WgslComputeShader::default(), [1, 1, 1], 1024); + + // Run the test and write the output to a file. + test.run_test(&config).unwrap(); +} diff --git a/tests/ui/arch/derivative.rs b/tests/ui/arch/derivative.rs deleted file mode 100644 index 06b63ab154..0000000000 --- a/tests/ui/arch/derivative.rs +++ /dev/null @@ -1,16 +0,0 @@ -// build-pass -// compile-flags: -C llvm-args=--disassemble-fn=derivative::derivative - -use spirv_std::arch::Derivative; -use spirv_std::spirv; - -#[spirv(fragment)] -pub fn main() { - derivative(); -} - -pub fn derivative() { - Derivative::dfdx(0.); - Derivative::dfdy(0.); - Derivative::fwidth(0.); -} diff --git a/tests/ui/arch/derivative.stderr b/tests/ui/arch/derivative.stderr deleted file mode 100644 index 5a4404b1b3..0000000000 --- a/tests/ui/arch/derivative.stderr +++ /dev/null @@ -1,11 +0,0 @@ -%1 = OpFunction %2 None %3 -%4 = OpLabel -OpLine %5 37 8 -%6 = OpDPdx %7 %8 -OpLine %5 79 8 -%9 = OpDPdy %7 %8 -OpLine %5 119 8 -%10 = OpFwidth %7 %8 -OpNoLine -OpReturn -OpFunctionEnd diff --git a/tests/ui/arch/derivative_control.rs b/tests/ui/arch/derivative_control.rs deleted file mode 100644 index 3ff44dc4b4..0000000000 --- a/tests/ui/arch/derivative_control.rs +++ /dev/null @@ -1,21 +0,0 @@ -// build-pass -// compile-flags: -C target-feature=+DerivativeControl -// compile-flags: -C llvm-args=--disassemble-fn=derivative_control::derivative - -use spirv_std::arch::Derivative; -use spirv_std::spirv; - -#[spirv(fragment)] -pub fn main() { - derivative(); -} - -pub fn derivative() { - Derivative::dfdx_fine(0.); - Derivative::dfdy_fine(0.); - Derivative::fwidth_fine(0.); - - Derivative::dfdx_coarse(0.); - Derivative::dfdy_coarse(0.); - Derivative::fwidth_coarse(0.); -} diff --git a/tests/ui/arch/derivative_control.stderr b/tests/ui/arch/derivative_control.stderr deleted file mode 100644 index 0085d26025..0000000000 --- a/tests/ui/arch/derivative_control.stderr +++ /dev/null @@ -1,17 +0,0 @@ -%1 = OpFunction %2 None %3 -%4 = OpLabel -OpLine %5 50 8 -%6 = OpDPdxFine %7 %8 -OpLine %5 92 8 -%9 = OpDPdyFine %7 %8 -OpLine %5 131 8 -%10 = OpFwidthFine %7 %8 -OpLine %5 65 8 -%11 = OpDPdxCoarse %7 %8 -OpLine %5 107 8 -%12 = OpDPdyCoarse %7 %8 -OpLine %5 143 8 -%13 = OpFwidthCoarse %7 %8 -OpNoLine -OpReturn -OpFunctionEnd