static int cli_bench(Context *context, int argc, char *argv[]) { if (argc < 1) { cli_bench_help(context); return EXIT_FAILURE; } BenchArguments args; CLICallbacks cbs; cbs.add("help", [context](CLIParser &parser) { cli_bench_help(context); parser.end(); }); cbs.add("--width", [&args](CLIParser &parser) { args.width = parser.next_uint(); }); cbs.add("--height", [&args](CLIParser &parser) { args.height = parser.next_uint(); }); cbs.add("--warmup", [&args](CLIParser &parser) { args.warmup = parser.next_uint(); }); cbs.add("--iterations", [&args](CLIParser &parser) { args.iterations = parser.next_uint(); }); cbs.add("--dispatches", [&args](CLIParser &parser) { args.dispatches = parser.next_uint(); }); cbs.add("--timeout", [&args](CLIParser &parser) { args.timeout = parser.next_double(); }); cbs.add("--fp16", [&args](CLIParser&) { args.fp16 = true; }); cbs.add("--type", [&args](CLIParser &parser) { args.type = parse_type(parser.next_string(), args); }); cbs.add("--input-texture", [&args](CLIParser&) { args.input_texture = true; }); cbs.add("--output-texture", [&args](CLIParser&) { args.output_texture = true; }); cbs.error_handler = [context]{ cli_bench_help(context); }; CLIParser parser(move(cbs), argc, argv); if (!parser.parse()) { return EXIT_FAILURE; } else if (parser.ended_state) { return EXIT_SUCCESS; } run_benchmark(context, args); return EXIT_SUCCESS; }
static int cli_test(Context *context, int argc, char *argv[]) { if (argc < 1) { cli_test_help(context); return EXIT_FAILURE; } TestSuiteArguments args; CLICallbacks cbs; cbs.add("help", [context](CLIParser &parser) { cli_test_help(context); parser.end(); }); cbs.add("--test", [&args](CLIParser &parser) { args.test_id_min = args.test_id_max = parser.next_uint(); args.exhaustive = false; }); cbs.add("--test-range", [&args](CLIParser &parser) { args.test_id_min = parser.next_uint(); args.test_id_max = parser.next_uint(); args.exhaustive = false; }); cbs.add("--test-all", [&args](CLIParser&) { args.exhaustive = true; }); cbs.add("--exit-on-fail", [&args](CLIParser&) { args.throw_on_fail = true; }); cbs.add("--minimum-snr-fp16", [&args](CLIParser &parser) { args.min_snr_fp16 = parser.next_double(); }); cbs.add("--minimum-snr-fp32", [&args](CLIParser &parser) { args.min_snr_fp32 = parser.next_double(); }); cbs.add("--epsilon-fp16", [&args](CLIParser &parser) { args.epsilon_fp16 = parser.next_double(); }); cbs.add("--epsilon-fp32", [&args](CLIParser &parser) { args.epsilon_fp32 = parser.next_double(); }); cbs.error_handler = [context]{ cli_test_help(context); }; CLIParser parser(move(cbs), argc, argv); if (!parser.parse()) { return EXIT_FAILURE; } else if (parser.ended_state) { return EXIT_SUCCESS; } run_test_suite(context, args); return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { CLIArguments args; CLICallbacks cbs; cbs.add("--help", [](CLIParser &parser) { print_help(); parser.end(); }); cbs.add("--dump-vram", [&args](CLIParser &parser) { args.frame_output = parser.next_string(); }); cbs.add("--trace-frame", [&args](CLIParser &parser) { args.trace_frame = parser.next_uint(); args.trace_output = parser.next_string(); args.trace = true; }); cbs.add("--scale", [&args](CLIParser &parser) { args.scale = parser.next_uint(); }); cbs.add("--verbose", [&args](CLIParser &) { args.verbose = true; }); cbs.error_handler = [] { print_help(); }; cbs.default_handler = [&args](const char *value) { args.dump = value; }; CLIParser parser{ move(cbs), argc - 1, argv + 1 }; if (!parser.parse()) return 1; else if (parser.ended_state) return 0; if (!args.dump) { fprintf(stderr, "Didn't specify input file.\n"); print_help(); return 1; } WSI wsi; wsi.init(1280, 960); auto &device = wsi.get_device(); Renderer renderer(device, args.scale, nullptr); FILE *file = fopen(args.dump, "rb"); if (!file) return 1; read_tag(file); bool eof = false; unsigned frames = 0; unsigned draw_call = 0; double total_time = 0.0; while (!eof && wsi.alive()) { draw_call = 0; double start = gettime(); wsi.begin_frame(); renderer.reset_counters(); while (read_command(args, file, device, renderer, eof, frames, draw_call)) ; renderer.scanout(); if (args.frame_output) dump_vram_to_file(args, device, renderer, frames); renderer.flush(); wsi.end_frame(); double end = gettime(); total_time += end - start; frames++; if (args.verbose) { if (renderer.counters.render_passes) { LOG("========================\n"); LOG("Completed frame %u.\n", frames); LOG("Render passes: %u\n", renderer.counters.render_passes); LOG("Readback pixels: %u\n", renderer.counters.fragment_readback_pixels); LOG("Writeout pixels: %u\n", renderer.counters.fragment_writeout_pixels); LOG("Draw calls: %u\n", renderer.counters.draw_calls); LOG("Vertices: %u\n", renderer.counters.vertices); LOG("========================\n"); } else { LOG("========================\n"); LOG("Completed frame %u.\n", frames); LOG("========================\n"); } } } LOG("Ran %u frames in %f s! (%.3f ms / frame).\n", frames, total_time, 1000.0 * total_time / frames); }
static int main_inner(int argc, char *argv[]) { CLIArguments args; CLICallbacks cbs; cbs.add("--help", [](CLIParser &parser) { print_help(); parser.end(); }); cbs.add("--output", [&args](CLIParser &parser) { args.output = parser.next_string(); }); cbs.add("--es", [&args](CLIParser &) { args.es = true; args.set_es = true; }); cbs.add("--no-es", [&args](CLIParser &) { args.es = false; args.set_es = true; }); cbs.add("--version", [&args](CLIParser &parser) { args.version = parser.next_uint(); args.set_version = true; }); cbs.add("--dump-resources", [&args](CLIParser &) { args.dump_resources = true; }); cbs.add("--force-temporary", [&args](CLIParser &) { args.force_temporary = true; }); cbs.add("--flatten-ubo", [&args](CLIParser &) { args.flatten_ubo = true; }); cbs.add("--fixup-clipspace", [&args](CLIParser &) { args.fixup = true; }); cbs.add("--flip-vert-y", [&args](CLIParser &) { args.yflip = true; }); cbs.add("--iterations", [&args](CLIParser &parser) { args.iterations = parser.next_uint(); }); cbs.add("--cpp", [&args](CLIParser &) { args.cpp = true; }); cbs.add("--reflect", [&args](CLIParser &parser) { args.reflect = parser.next_value_string("json"); }); cbs.add("--cpp-interface-name", [&args](CLIParser &parser) { args.cpp_interface_name = parser.next_string(); }); cbs.add("--metal", [&args](CLIParser &) { args.msl = true; }); // Legacy compatibility cbs.add("--glsl-emit-push-constant-as-ubo", [&args](CLIParser &) { args.glsl_emit_push_constant_as_ubo = true; }); cbs.add("--msl", [&args](CLIParser &) { args.msl = true; }); cbs.add("--hlsl", [&args](CLIParser &) { args.hlsl = true; }); cbs.add("--hlsl-enable-compat", [&args](CLIParser &) { args.hlsl_compat = true; }); cbs.add("--hlsl-support-nonzero-basevertex-baseinstance", [&args](CLIParser &) { args.hlsl_support_nonzero_base = true; }); cbs.add("--vulkan-semantics", [&args](CLIParser &) { args.vulkan_semantics = true; }); cbs.add("--flatten-multidimensional-arrays", [&args](CLIParser &) { args.flatten_multidimensional_arrays = true; }); cbs.add("--no-420pack-extension", [&args](CLIParser &) { args.use_420pack_extension = false; }); cbs.add("--msl-capture-output", [&args](CLIParser &) { args.msl_capture_output_to_buffer = true; }); cbs.add("--msl-swizzle-texture-samples", [&args](CLIParser &) { args.msl_swizzle_texture_samples = true; }); cbs.add("--msl-ios", [&args](CLIParser &) { args.msl_ios = true; }); cbs.add("--msl-pad-fragment-output", [&args](CLIParser &) { args.msl_pad_fragment_output = true; }); cbs.add("--msl-domain-lower-left", [&args](CLIParser &) { args.msl_domain_lower_left = true; }); cbs.add("--msl-argument-buffers", [&args](CLIParser &) { args.msl_argument_buffers = true; }); cbs.add("--msl-discrete-descriptor-set", [&args](CLIParser &parser) { args.msl_discrete_descriptor_sets.push_back(parser.next_uint()); }); cbs.add("--msl-texture-buffer-native", [&args](CLIParser &) { args.msl_texture_buffer_native = true; }); cbs.add("--extension", [&args](CLIParser &parser) { args.extensions.push_back(parser.next_string()); }); cbs.add("--rename-entry-point", [&args](CLIParser &parser) { auto old_name = parser.next_string(); auto new_name = parser.next_string(); auto model = stage_to_execution_model(parser.next_string()); args.entry_point_rename.push_back({ old_name, new_name, move(model) }); }); cbs.add("--entry", [&args](CLIParser &parser) { args.entry = parser.next_string(); }); cbs.add("--stage", [&args](CLIParser &parser) { args.entry_stage = parser.next_string(); }); cbs.add("--separate-shader-objects", [&args](CLIParser &) { args.sso = true; }); cbs.add("--set-hlsl-vertex-input-semantic", [&args](CLIParser &parser) { HLSLVertexAttributeRemap remap; remap.location = parser.next_uint(); remap.semantic = parser.next_string(); args.hlsl_attr_remap.push_back(move(remap)); }); cbs.add("--remap", [&args](CLIParser &parser) { string src = parser.next_string(); string dst = parser.next_string(); uint32_t components = parser.next_uint(); args.remaps.push_back({ move(src), move(dst), components }); }); cbs.add("--remap-variable-type", [&args](CLIParser &parser) { string var_name = parser.next_string(); string new_type = parser.next_string(); args.variable_type_remaps.push_back({ move(var_name), move(new_type) }); }); cbs.add("--rename-interface-variable", [&args](CLIParser &parser) { StorageClass cls = StorageClassMax; string clsStr = parser.next_string(); if (clsStr == "in") cls = StorageClassInput; else if (clsStr == "out") cls = StorageClassOutput; uint32_t loc = parser.next_uint(); string var_name = parser.next_string(); args.interface_variable_renames.push_back({ cls, loc, move(var_name) }); }); cbs.add("--pls-in", [&args](CLIParser &parser) { auto fmt = pls_format(parser.next_string()); auto name = parser.next_string(); args.pls_in.push_back({ move(fmt), move(name) }); }); cbs.add("--pls-out", [&args](CLIParser &parser) { auto fmt = pls_format(parser.next_string()); auto name = parser.next_string(); args.pls_out.push_back({ move(fmt), move(name) }); }); cbs.add("--shader-model", [&args](CLIParser &parser) { args.shader_model = parser.next_uint(); args.set_shader_model = true; }); cbs.add("--msl-version", [&args](CLIParser &parser) { args.msl_version = parser.next_uint(); args.set_msl_version = true; }); cbs.add("--remove-unused-variables", [&args](CLIParser &) { args.remove_unused = true; }); cbs.add("--combined-samplers-inherit-bindings", [&args](CLIParser &) { args.combined_samplers_inherit_bindings = true; }); cbs.add("--no-support-nonzero-baseinstance", [&](CLIParser &) { args.support_nonzero_baseinstance = false; }); cbs.default_handler = [&args](const char *value) { args.input = value; }; cbs.error_handler = [] { print_help(); }; CLIParser parser{ move(cbs), argc - 1, argv + 1 }; if (!parser.parse()) return EXIT_FAILURE; else if (parser.ended_state) return EXIT_SUCCESS; if (!args.input) { fprintf(stderr, "Didn't specify input file.\n"); print_help(); return EXIT_FAILURE; } auto spirv_file = read_spirv_file(args.input); if (spirv_file.empty()) return EXIT_FAILURE; // Special case reflection because it has little to do with the path followed by code-outputting compilers if (!args.reflect.empty()) { Parser spirv_parser(move(spirv_file)); spirv_parser.parse(); CompilerReflection compiler(move(spirv_parser.get_parsed_ir())); compiler.set_format(args.reflect); auto json = compiler.compile(); if (args.output) write_string_to_file(args.output, json.c_str()); else printf("%s", json.c_str()); return EXIT_SUCCESS; } string compiled_output; if (args.iterations == 1) compiled_output = compile_iteration(args, move(spirv_file)); else { for (unsigned i = 0; i < args.iterations; i++) compiled_output = compile_iteration(args, spirv_file); } if (args.output) write_string_to_file(args.output, compiled_output.c_str()); else printf("%s", compiled_output.c_str()); return EXIT_SUCCESS; }