def run_generate( graphicsfuzz_tool_path: Path, reference_shader_json: pathlib.Path, donors_path: pathlib.Path, output_shader_json: pathlib.Path, seed: Optional[str] = None, other_args: Optional[List[str]] = None, legacy_graphics_fuzz_vulkan_arg: bool = False, ) -> pathlib.Path: util.file_mkdirs_parent(output_shader_json) cmd = [ str(graphicsfuzz_tool_path), "com.graphicsfuzz.generator.tool.Generate", str(reference_shader_json), str(donors_path), str(output_shader_json), ( "--generate-uniform-bindings" if legacy_graphics_fuzz_vulkan_arg else "--vulkan" ), "--max-uniforms", "10", ] if seed: cmd.append(f"--seed={seed}") if other_args: cmd.extend(other_args) subprocess_util.run(cmd) return output_shader_json
def run_glslang_glsl_shader_to_spirv_shader( glsl_shader_path: pathlib.Path, output_dir_path: pathlib.Path, glslang_validator_file_path: Optional[pathlib.Path] = None, time_limit: int = GLSLANG_DEFAULT_TIME_LIMIT, ) -> pathlib.Path: if not glslang_validator_file_path: glslang_validator_file_path = util.tool_on_path( binaries_util.GLSLANG_VALIDATOR_NAME ) output_spirv_file_path = output_dir_path / (glsl_shader_path.name + ".spv") util.file_mkdirs_parent(output_spirv_file_path) subprocess_util.run( util.prepend_catchsegv_if_available( [ str(glslang_validator_file_path), "-V", "-o", str(output_spirv_file_path), str(glsl_shader_path), ] ), timeout=time_limit, ) return output_spirv_file_path
def run_spirv_opt_on_spirv_shader( input_spirv_file_path: pathlib.Path, output_dir_path: pathlib.Path, spirv_opt_args: List[str], spirv_opt_file_path: Optional[pathlib.Path] = None, spirv_opt_no_validate_after_all: bool = False, time_limit: int = SPIRV_OPT_DEFAULT_TIME_LIMIT, ) -> pathlib.Path: if not spirv_opt_file_path: spirv_opt_file_path = util.tool_on_path(binaries_util.SPIRV_OPT_NAME) output_spirv_file_path = output_dir_path / input_spirv_file_path.name util.file_mkdirs_parent(output_spirv_file_path) cmd = [ str(spirv_opt_file_path), str(input_spirv_file_path), "-o", str(output_spirv_file_path), ] if not spirv_opt_no_validate_after_all: cmd.append("--validate-after-all") cmd += spirv_opt_args cmd = util.prepend_catchsegv_if_available(cmd) subprocess_util.run(cmd, timeout=time_limit) return output_spirv_file_path
def run_generate( spirv_fuzz_path: Path, reference_shader_spv: Path, output_shader_spv: Path, donors_list_path: Path, seed: Optional[str] = None, other_args: Optional[List[str]] = None, ) -> Path: util.check( output_shader_spv.suffix == shader_job_util.SUFFIX_SPIRV, AssertionError(f"Expected {str(output_shader_spv)} to end with .spv"), ) util.file_mkdirs_parent(output_shader_spv) cmd = [ str(spirv_fuzz_path), str(reference_shader_spv), "-o", str(output_shader_spv), f"--donors={str(donors_list_path)}", "--fuzzer-pass-validation", ] if seed: cmd.append(f"--seed={seed}") if other_args: cmd.extend(other_args) subprocess_util.run(cmd) # reference.spv -> output.spv_orig util.copy_file( reference_shader_spv, output_shader_spv.with_suffix(shader_job_util.SUFFIX_SPIRV_ORIG), ) # reference.spv.facts -> output.spv.facts source_facts_path = reference_shader_spv.with_suffix( shader_job_util.SUFFIX_FACTS) dest_facts_path = output_shader_spv.with_suffix( shader_job_util.SUFFIX_FACTS) if source_facts_path.exists(): util.copy_file(source_facts_path, dest_facts_path) return output_shader_spv
def run_replay( spirv_fuzz_path: Path, variant_shader_spv: Path, output_shader_spv: Path, other_args: Optional[List[str]] = None, ) -> Path: """Replays all transformations except the last to get a similar variant shader.""" util.check( output_shader_spv.suffix == shader_job_util.SUFFIX_SPIRV, AssertionError(f"Expected {str(output_shader_spv)} to end with .spv"), ) util.file_mkdirs_parent(output_shader_spv) # Copy shader.<STAGE>.facts. if variant_shader_spv.with_suffix(shader_job_util.SUFFIX_FACTS).is_file(): util.copy_file( variant_shader_spv.with_suffix(shader_job_util.SUFFIX_FACTS), output_shader_spv.with_suffix(shader_job_util.SUFFIX_FACTS), ) # Copy shader.<STAGE>.spv_orig. orig_spv = util.copy_file( variant_shader_spv.with_suffix(shader_job_util.SUFFIX_SPIRV_ORIG), output_shader_spv.with_suffix(shader_job_util.SUFFIX_SPIRV_ORIG), ) transformations = variant_shader_spv.with_suffix( shader_job_util.SUFFIX_TRANSFORMATIONS) cmd = [ str(spirv_fuzz_path), str(orig_spv), "-o", str(output_shader_spv), f"--replay={str(transformations)}", "--replay-range=-1", # replays all transformations except the last ] if other_args: cmd.extend(other_args) subprocess_util.run(cmd) return output_shader_spv
def run_prepare_reference( graphicsfuzz_tool_path: Path, input_reference_shader_json: Path, output_reference_shader_json: Path, ) -> Path: util.file_mkdirs_parent(output_reference_shader_json) cmd = [ str(graphicsfuzz_tool_path), "com.graphicsfuzz.generator.tool.PrepareReference", "--generate-uniform-bindings", "--max-uniforms", "10", str(input_reference_shader_json), str(output_reference_shader_json), ] subprocess_util.run(cmd) return output_reference_shader_json
def run_spirv_dis_on_spirv_shader( input_spirv_file_path: pathlib.Path, output_dir_path: pathlib.Path, spirv_dis_file_path: Optional[pathlib.Path] = None, ) -> pathlib.Path: if not spirv_dis_file_path: spirv_dis_file_path = util.tool_on_path(binaries_util.SPIRV_DIS_NAME) output_spirv_file_path = output_dir_path / ( util.remove_end(input_spirv_file_path.name, ".spv") + ".asm") util.file_mkdirs_parent(output_spirv_file_path) subprocess_util.run( util.prepend_catchsegv_if_available([ str(spirv_dis_file_path), str(input_spirv_file_path), "-o", str(output_spirv_file_path), "--raw-id", ])) return output_spirv_file_path
def run_glslang_glsl_shader_to_spirv_shader( glsl_shader_path: pathlib.Path, output_dir_path: pathlib.Path, glslang_validator_file_path: Optional[pathlib.Path] = None, time_limit: int = GLSLANG_DEFAULT_TIME_LIMIT, preprocessor_cache: Optional[util.CommandCache] = None, ) -> pathlib.Path: if not glslang_validator_file_path: glslang_validator_file_path = util.tool_on_path( binaries_util.GLSLANG_VALIDATOR_NAME) output_spirv_file_path = output_dir_path / (glsl_shader_path.name + ".spv") util.file_mkdirs_parent(output_spirv_file_path) cmd = util.HashedCommand() cmd.append_program_path(glslang_validator_file_path) cmd.append_str("-V") cmd.append_str("-o") cmd.append_output_file(output_spirv_file_path) cmd.append_input_file(glsl_shader_path) if preprocessor_cache and preprocessor_cache.write_cached_output_file( cmd, output_spirv_file_path): return output_spirv_file_path cmd_str = util.prepend_catchsegv_if_available(cmd.cmd) subprocess_util.run( cmd_str, timeout=time_limit, ) if preprocessor_cache: preprocessor_cache.add_output_to_cache(cmd, output_spirv_file_path) return output_spirv_file_path
def run_spirv_opt_on_spirv_shader( input_spirv_file_path: pathlib.Path, output_dir_path: pathlib.Path, spirv_opt_args: List[str], spirv_opt_file_path: Optional[pathlib.Path] = None, spirv_opt_no_validate_after_all: bool = False, time_limit: int = SPIRV_OPT_DEFAULT_TIME_LIMIT, preprocessor_cache: Optional[util.CommandCache] = None, ) -> pathlib.Path: if not spirv_opt_file_path: spirv_opt_file_path = util.tool_on_path(binaries_util.SPIRV_OPT_NAME) output_spirv_file_path = output_dir_path / input_spirv_file_path.name util.file_mkdirs_parent(output_spirv_file_path) cmd = util.HashedCommand() cmd.append_program_path(spirv_opt_file_path) cmd.append_input_file(input_spirv_file_path) cmd.append_str("-o") cmd.append_output_file(output_spirv_file_path) if not spirv_opt_no_validate_after_all: cmd.append_str("--validate-after-all") cmd.extend_str(spirv_opt_args) if preprocessor_cache and preprocessor_cache.write_cached_output_file( cmd, output_spirv_file_path): return output_spirv_file_path cmd_str = util.prepend_catchsegv_if_available(cmd.cmd) subprocess_util.run(cmd_str, timeout=time_limit) if preprocessor_cache: preprocessor_cache.add_output_to_cache(cmd, output_spirv_file_path) return output_spirv_file_path