def make_test( base_source_dir: Path, subtest_dir: Path, spirv_opt_args: Optional[List[str]], binary_manager: binaries_util.BinaryManager, derived_from: Optional[str], stable_shader: bool, common_spirv_args: Optional[List[str]], ) -> Path: source_dir = test_util.get_source_dir(subtest_dir) # Create the subtest by copying the base source. util.copy_dir(base_source_dir, source_dir) test = Test( glsl=TestGlsl(spirv_opt_args=spirv_opt_args), derived_from=derived_from, common_spirv_args=common_spirv_args, ) test.binaries.extend( [binary_manager.get_binary_by_name(name="glslangValidator")]) fuzz_test_util.add_spirv_shader_test_binaries(test, spirv_opt_args, binary_manager) # Write the test metadata. test_util.metadata_write(test, subtest_dir) # If the reference shader is "stable" (with respect to floating-point sensitivity) # then this can be a wrong image test; i.e. we will render the reference and variant shaders # and compare the output images. # Otherwise, we should just render the variant shader and check for crashes; to do this, # we just rename the `reference/` directory to `_reference/` so that the test has no reference shader. if not stable_shader and (source_dir / test_util.REFERENCE_DIR).is_dir(): util.move_dir( source_dir / test_util.REFERENCE_DIR, source_dir / f"_{test_util.REFERENCE_DIR}", ) return subtest_dir
def create_summary_and_reproduce( # pylint: disable=too-many-locals; test_dir: Path, binary_manager: binaries_util.BinaryManager, settings: Settings ) -> None: test_metadata = test_util.metadata_read(test_dir) summary_dir = test_dir / "summary" summary_source_dirs: List[Path] = [] unreduced = util.copy_dir( test_util.get_source_dir(test_dir), summary_dir / "unreduced" ) summary_source_dirs.append(unreduced) # For the `summary/reduced_1/` directory. reduction_output_dir_1 = test_util.get_reduced_test_dir( test_dir, test_metadata.device.name, "1" ) reduced_1: Optional[Path] = None if reduction_output_dir_1.is_dir(): reduction_output_source_dir_1 = test_util.get_source_dir(reduction_output_dir_1) if reduction_output_source_dir_1.is_dir(): reduced_1 = util.copy_dir( reduction_output_source_dir_1, summary_dir / "reduced_1" ) summary_source_dirs.append(reduced_1) # For the `summary/reduced_2/` directory. reduction_output_dir_2 = test_util.get_reduced_test_dir( test_dir, test_metadata.device.name, "2" ) if reduction_output_dir_2.is_dir(): reduction_output_source_dir_2 = test_util.get_source_dir(reduction_output_dir_2) if reduction_output_source_dir_2.is_dir(): reduced_2 = util.copy_dir( reduction_output_source_dir_2, summary_dir / "reduced_2" ) summary_source_dirs.append(reduced_2) # If this test was generated from a stable shader... if test_metadata.derived_from.startswith("stable_") and reduced_1: # Before running the reduced_1 source dir, find any renamed shader jobs (e.g. reference/ -> _reference/) # and rename them back. Thus, the modified test becomes a wrong image test once again, even though # the actual bug was probably a crash bug. renamed_shader_jobs = list(reduced_1.glob("_*")) renamed_shader_jobs = [ r for r in renamed_shader_jobs if (r / test_util.SHADER_JOB).is_file() ] if renamed_shader_jobs: for renamed_shader_job in renamed_shader_jobs: util.move_dir( renamed_shader_job, renamed_shader_job.with_name(renamed_shader_job.name[1:]), ) # Also, if this is a spirv_fuzz test then try to create a variant_2 shader job that is even more similar to the # variant than the reference shader job. if test_metadata.HasField("spirv_fuzz"): fuzz_spirv_test.create_spirv_fuzz_variant_2( reduced_1, binary_manager, settings ) # Run every source dir that we added to the summary dir. for summary_source_dir in summary_source_dirs: run_shader_job( source_dir=summary_source_dir, output_dir=(summary_dir / f"{summary_source_dir.name}_result"), binary_manager=binary_manager, )