def extract_shaders(tests_dir: Path, binaries: binaries_util.BinaryManager) -> None: for amber_file in sorted(tests_dir.glob("*.amber")): amber_converter.extract_shaders( amber_file, output_dir=amber_file.parent, binaries=binaries ) zip_files = [ util.ZipEntry(f, Path(f.name)) for f in sorted(tests_dir.glob(f"{amber_file.stem}.*")) ] util.create_zip(amber_file.with_suffix(".zip"), zip_files)
def download_cts_graphicsfuzz_tests( # pylint: disable=too-many-locals; git_tool: Path, cookie: str, binaries: binaries_util.BinaryManager) -> None: work_dir = Path() / "temp" / ("cts_" + fuzz.get_random_name()) latest_change = gerrit_util.get_latest_deqp_change(cookie) latest_change_number = latest_change["_number"] latest_change_details = gerrit_util.get_gerrit_change_details( change_number=latest_change_number, cookie=cookie) current_revision = latest_change_details["current_revision"] cts_archive_path = gerrit_util.download_gerrit_revision( output_path=work_dir / "cts.tgz", change_number=latest_change_number, revision=current_revision, download_type=gerrit_util.DownloadType.Archive, cookie=cookie, ) cts_dir_name = "cts_temp" cts_out = util.extract_archive(cts_archive_path, work_dir / cts_dir_name) pending_graphicsfuzz_changes = gerrit_util.get_deqp_graphicsfuzz_pending_changes( cookie) for pending_change in pending_graphicsfuzz_changes: change_number = pending_change["_number"] change_details = gerrit_util.get_gerrit_change_details( change_number=change_number, cookie=cookie) current_revision = change_details["current_revision"] patch_zip = gerrit_util.download_gerrit_revision( output_path=work_dir / f"{change_number}.zip", change_number=change_number, revision=current_revision, download_type=gerrit_util.DownloadType.Patch, cookie=cookie, ) util.extract_archive(patch_zip, work_dir) # Create a dummy git repo in the work directory, otherwise "git apply" can fail silently. # --unsafe-paths is possibly supposed to address this, but it doesn't seem to work if we # are already in a git repo. subprocess_util.run([str(git_tool), "init", "."], verbose=True, working_dir=work_dir) cmd = [str(git_tool), "apply"] patch_names = [p.name for p in work_dir.glob("*.diff")] cmd += patch_names # Use unix-style path for git. cmd += [ "--verbose", "--unsafe-paths", f"--directory={cts_dir_name}", f"--include={cts_dir_name}/external/vulkancts/data/vulkan/amber/graphicsfuzz/*", ] subprocess_util.run(cmd, verbose=True, working_dir=work_dir) shader_dir = util.copy_dir( cts_out / "external" / "vulkancts" / "data" / "vulkan" / "amber" / "graphicsfuzz", Path() / "graphicsfuzz", ) for amber_file in shader_dir.glob("*.amber"): amber_converter.extract_shaders(amber_file, output_dir=amber_file.parent, binaries=binaries) zip_files = [ util.ZipEntry(f, Path(f.name)) for f in sorted(shader_dir.glob(f"{amber_file.stem}.*")) ] util.create_zip(amber_file.with_suffix(".zip"), zip_files)
def tool_crash_summary_bug_report_dir( # pylint: disable=too-many-locals; source_dir: Path, result_dir: Path, output_dir: Path, binary_manager: binaries_util.BinaryManager, ) -> Optional[Path]: # Create a simple script and README. shader_job = source_dir / test_util.VARIANT_DIR / test_util.SHADER_JOB if not shader_job.is_file(): return None test_metadata: Test = test_util.metadata_read_from_path( source_dir / test_util.TEST_METADATA ) shader_files = shader_job_util.get_related_files( shader_job, shader_job_util.EXT_ALL, (shader_job_util.SUFFIX_GLSL, shader_job_util.SUFFIX_SPIRV), ) check( len(shader_files) > 0, AssertionError(f"Need at least one shader for {shader_job}"), ) shader_extension = shader_files[0].suffix bug_report_dir = util.copy_dir(result_dir, output_dir / "bug_report") # Create bug_report.zip. zip_files = [ util.ZipEntry(f, f.relative_to(bug_report_dir)) for f in sorted(bug_report_dir.rglob("*")) ] util.create_zip(bug_report_dir.with_suffix(".zip"), zip_files) shader_files = sorted(bug_report_dir.rglob("shader.*")) glsl_files = [ shader_file for shader_file in shader_files if shader_file.suffix == shader_extension ] asm_files = [ shader_file for shader_file in shader_files if shader_file.name.endswith( shader_extension + shader_job_util.SUFFIX_ASM_SPIRV ) ] spv_files = [ shader_file for shader_file in shader_files if shader_file.name.endswith(shader_extension + shader_job_util.SUFFIX_SPIRV) ] readme = "\n\n" readme += ( "Issue found using [GraphicsFuzz](https://github.com/google/graphicsfuzz).\n\n" ) readme += "Tool versions:\n\n" # noinspection PyTypeChecker if test_metadata.HasField("glsl"): readme += f"* glslangValidator commit hash: {binary_manager.get_binary_by_name(binaries_util.GLSLANG_VALIDATOR_NAME).version}\n" if test_metadata.glsl.spirv_opt_args or test_metadata.spirv_fuzz.spirv_opt_args: readme += f"* spirv-opt commit hash: {binary_manager.get_binary_by_name(binaries_util.SPIRV_OPT_NAME).version}\n" readme += "\nTo reproduce:\n\n" readme += f"`glslangValidator -V shader{shader_extension} -o shader{shader_extension}.spv`\n\n" if ( test_metadata.HasField("glsl") and spv_files and not test_metadata.glsl.spirv_opt_args ): # GLSL was converted to SPIR-V, and spirv-opt was not run, so indicate that we should validate the SPIR-V. readme += f"`spirv-val shader{shader_extension}.spv`\n\n" if test_metadata.glsl.spirv_opt_args or test_metadata.spirv_fuzz.spirv_opt_args: readme += f"`spirv-opt shader{shader_extension}.spv -o temp.spv --validate-after-all {' '.join(test_metadata.glsl.spirv_opt_args)}`\n\n" files_to_list = glsl_files + spv_files + asm_files files_to_list.sort() files_to_show = glsl_files + asm_files files_to_show.sort() readme += "The following shader files are included in the attached archive, some of which are also shown inline below:\n\n" for file_to_list in files_to_list: short_path = file_to_list.relative_to(bug_report_dir).as_posix() readme += f"* {short_path}\n" for file_to_show in files_to_show: short_path = file_to_show.relative_to(bug_report_dir).as_posix() file_contents = util.file_read_text(file_to_show) readme += f"\n{short_path}:\n\n" readme += f"```\n{file_contents}\n```\n" util.file_write_text(output_dir / "README.md", readme) return bug_report_dir