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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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
示例#7
0
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
示例#9
0
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