From 91b829952d4d77732f88e3358522c7866cbfb86b Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Mon, 18 Mar 2024 12:59:25 +0100 Subject: [PATCH] generator code cleanup wip --- src/shdc/CMakeLists.txt | 2 +- src/shdc/formats/bare.h | 18 ----- src/shdc/formats/sokol.h | 18 ----- src/shdc/formats/sokolnim.h | 18 ----- src/shdc/formats/sokolodin.h | 18 ----- src/shdc/formats/sokolrust.h | 18 ----- src/shdc/formats/sokolzig.h | 18 ----- src/shdc/formats/yaml.h | 18 ----- src/shdc/{formats => generators}/bare.cc | 14 ++-- src/shdc/generators/bare.h | 8 +++ src/shdc/generators/generate.cc | 35 ++++++++++ src/shdc/generators/generate.h | 10 +++ src/shdc/{formats => generators}/sokol.cc | 56 +++++++-------- src/shdc/generators/sokol.h | 8 +++ src/shdc/{formats => generators}/sokolnim.cc | 32 ++++----- src/shdc/generators/sokolnim.h | 8 +++ src/shdc/{formats => generators}/sokolodin.cc | 32 ++++----- src/shdc/generators/sokolodin.h | 8 +++ src/shdc/{formats => generators}/sokolrust.cc | 32 ++++----- src/shdc/generators/sokolrust.h | 8 +++ src/shdc/{formats => generators}/sokolzig.cc | 32 ++++----- src/shdc/generators/sokolzig.h | 8 +++ src/shdc/{formats => generators}/util.cc | 2 +- src/shdc/{formats => generators}/util.h | 2 +- src/shdc/{formats => generators}/yaml.cc | 16 ++--- src/shdc/generators/yaml.h | 8 +++ src/shdc/main.cc | 69 +++++++------------ src/shdc/reflection.cc | 14 ++-- src/shdc/reflection.h | 2 +- src/shdc/types/gen/gen_input.h | 37 ++++++++++ 30 files changed, 279 insertions(+), 290 deletions(-) delete mode 100644 src/shdc/formats/bare.h delete mode 100644 src/shdc/formats/sokol.h delete mode 100644 src/shdc/formats/sokolnim.h delete mode 100644 src/shdc/formats/sokolodin.h delete mode 100644 src/shdc/formats/sokolrust.h delete mode 100644 src/shdc/formats/sokolzig.h delete mode 100644 src/shdc/formats/yaml.h rename src/shdc/{formats => generators}/bare.cc (84%) create mode 100644 src/shdc/generators/bare.h create mode 100644 src/shdc/generators/generate.cc create mode 100644 src/shdc/generators/generate.h rename src/shdc/{formats => generators}/sokol.cc (95%) create mode 100644 src/shdc/generators/sokol.h rename src/shdc/{formats => generators}/sokolnim.cc (95%) create mode 100644 src/shdc/generators/sokolnim.h rename src/shdc/{formats => generators}/sokolodin.cc (95%) create mode 100644 src/shdc/generators/sokolodin.h rename src/shdc/{formats => generators}/sokolrust.cc (95%) create mode 100644 src/shdc/generators/sokolrust.h rename src/shdc/{formats => generators}/sokolzig.cc (95%) create mode 100644 src/shdc/generators/sokolzig.h rename src/shdc/{formats => generators}/util.cc (99%) rename src/shdc/{formats => generators}/util.h (96%) rename src/shdc/{formats => generators}/yaml.cc (92%) create mode 100644 src/shdc/generators/yaml.h create mode 100644 src/shdc/types/gen/gen_input.h diff --git a/src/shdc/CMakeLists.txt b/src/shdc/CMakeLists.txt index b0483b88..e3cf4206 100644 --- a/src/shdc/CMakeLists.txt +++ b/src/shdc/CMakeLists.txt @@ -1,6 +1,6 @@ fips_begin_app(sokol-shdc cmdline) fips_src(. NO_RECURSE) - fips_src(formats NO_RECURSE) + fips_src(generators NO_RECURSE) fips_src(types NO_RECURSE) fips_src(types/reflection) fips_deps(fmt getopt pystring glslang SPIRV-Cross tint) diff --git a/src/shdc/formats/bare.h b/src/shdc/formats/bare.h deleted file mode 100644 index dc378489..00000000 --- a/src/shdc/formats/bare.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include -#include "args.h" -#include "bytecode.h" -#include "input.h" -#include "spirvcross.h" -#include "types/errmsg.h" -#include "types/slang.h" -#include "types/reflection/bindings.h" - -namespace shdc::formats::bare { - -ErrMsg gen(const Args& args, - const Input& inp, - const std::array& spirvcross, - const std::array& bytecode); - -} diff --git a/src/shdc/formats/sokol.h b/src/shdc/formats/sokol.h deleted file mode 100644 index 28d9c424..00000000 --- a/src/shdc/formats/sokol.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include -#include "args.h" -#include "bytecode.h" -#include "input.h" -#include "spirvcross.h" -#include "types/errmsg.h" -#include "types/slang.h" - -namespace shdc::formats::sokol { - -ErrMsg gen(const Args& args, - const Input& inp, - const std::array& spirvcross, - const std::array& bytecode, - const refl::Bindings& merged_bindings); - -} diff --git a/src/shdc/formats/sokolnim.h b/src/shdc/formats/sokolnim.h deleted file mode 100644 index e6532f35..00000000 --- a/src/shdc/formats/sokolnim.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include -#include "args.h" -#include "bytecode.h" -#include "input.h" -#include "spirvcross.h" -#include "types/errmsg.h" -#include "types/slang.h" - -namespace shdc::formats::sokolnim { - -ErrMsg gen(const Args& args, - const Input& inp, - const std::array& spirvcross, - const std::array& bytecode, - const refl::Bindings& merged_bindings); - -} diff --git a/src/shdc/formats/sokolodin.h b/src/shdc/formats/sokolodin.h deleted file mode 100644 index 43a56ccc..00000000 --- a/src/shdc/formats/sokolodin.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include -#include "args.h" -#include "bytecode.h" -#include "input.h" -#include "spirvcross.h" -#include "types/errmsg.h" -#include "types/slang.h" - -namespace shdc::formats::sokolodin { - -ErrMsg gen(const Args& args, - const Input& inp, - const std::array& spirvcross, - const std::array& bytecode, - const refl::Bindings& merged_bindings); - -} diff --git a/src/shdc/formats/sokolrust.h b/src/shdc/formats/sokolrust.h deleted file mode 100644 index d84e6c22..00000000 --- a/src/shdc/formats/sokolrust.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include -#include "args.h" -#include "bytecode.h" -#include "input.h" -#include "spirvcross.h" -#include "types/errmsg.h" -#include "types/slang.h" - -namespace shdc::formats::sokolrust { - -ErrMsg gen(const Args& args, - const Input& inp, - const std::array& spirvcross, - const std::array& bytecode, - const refl::Bindings& merged_bindings); - -} diff --git a/src/shdc/formats/sokolzig.h b/src/shdc/formats/sokolzig.h deleted file mode 100644 index 74fc92ff..00000000 --- a/src/shdc/formats/sokolzig.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include -#include "args.h" -#include "bytecode.h" -#include "input.h" -#include "spirvcross.h" -#include "types/errmsg.h" -#include "types/slang.h" - -namespace shdc::formats::sokolzig { - -ErrMsg gen(const Args& args, - const Input& inp, - const std::array& spirvcross, - const std::array& bytecode, - const refl::Bindings& merged_bindings); - -} diff --git a/src/shdc/formats/yaml.h b/src/shdc/formats/yaml.h deleted file mode 100644 index 79ef0024..00000000 --- a/src/shdc/formats/yaml.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include -#include "args.h" -#include "bytecode.h" -#include "input.h" -#include "spirvcross.h" -#include "types/errmsg.h" -#include "types/slang.h" - -namespace shdc::formats::yaml { - -ErrMsg gen(const Args& args, - const Input& inp, - const std::array& spirvcross, - const std::array& bytecode, - const refl::Bindings& merged_bindings); - -} diff --git a/src/shdc/formats/bare.cc b/src/shdc/generators/bare.cc similarity index 84% rename from src/shdc/formats/bare.cc rename to src/shdc/generators/bare.cc index 71d7e637..30e2a085 100644 --- a/src/shdc/formats/bare.cc +++ b/src/shdc/generators/bare.cc @@ -7,13 +7,13 @@ #include "pystring.h" #include -namespace shdc::formats::bare { +namespace shdc::gen::bare { using namespace util; static ErrMsg write_stage(const std::string& file_path, - const SpirvcrossSource* src, - const BytecodeBlob* blob) + const SpirvcrossSource* src, + const BytecodeBlob* blob) { // write text or binary to output file FILE* f = fopen(file_path.c_str(), "wb"); @@ -69,15 +69,15 @@ static ErrMsg write_shader_sources_and_blobs(const Args& args, return ErrMsg(); } -ErrMsg gen(const Args& args, const Input& inp, const std::array& spirvcross, const std::array& bytecode) { +ErrMsg generate(const GenInput& gen) { for (int i = 0; i < Slang::NUM; i++) { Slang::Enum slang = (Slang::Enum) i; - if (args.slang & Slang::bit(slang)) { - ErrMsg err = check_errors(inp, spirvcross[i], slang); + if (gen.args.slang & Slang::bit(slang)) { + ErrMsg err = check_errors(gen.inp, gen.spirvcross[i], slang); if (err.valid()) { return err; } - err = write_shader_sources_and_blobs(args, inp, spirvcross[i], bytecode[i], slang); + err = write_shader_sources_and_blobs(gen.args, gen.inp, gen.spirvcross[i], gen.bytecode[i], slang); if (err.valid()) { return err; } diff --git a/src/shdc/generators/bare.h b/src/shdc/generators/bare.h new file mode 100644 index 00000000..e7d0f7f8 --- /dev/null +++ b/src/shdc/generators/bare.h @@ -0,0 +1,8 @@ +#pragma once +#include "types/gen/gen_input.h" + +namespace shdc::gen::bare { + +ErrMsg generate(const GenInput& gen); + +} diff --git a/src/shdc/generators/generate.cc b/src/shdc/generators/generate.cc new file mode 100644 index 00000000..80a408ec --- /dev/null +++ b/src/shdc/generators/generate.cc @@ -0,0 +1,35 @@ +/* + Top-level wrapper for code-generators. +*/ +#include "generate.h" +#include "types/format.h" +#include "bare.h" +#include "sokol.h" +#include "sokolnim.h" +#include "sokolodin.h" +#include "sokolrust.h" +#include "sokolzig.h" +#include "yaml.h" + +namespace shdc::gen { + +ErrMsg generate(Format::Enum format, const GenInput& gen_input) { + switch (format) { + case Format::BARE: + return bare::generate(gen_input); + case Format::BARE_YAML: + return yaml::generate(gen_input); + case Format::SOKOL_ZIG: + return sokolzig::generate(gen_input); + case Format::SOKOL_NIM: + return sokolnim::generate(gen_input); + case Format::SOKOL_ODIN: + return sokolodin::generate(gen_input); + case Format::SOKOL_RUST: + return sokolrust::generate(gen_input); + default: + return sokol::generate(gen_input); + } +} + +} // namespace \ No newline at end of file diff --git a/src/shdc/generators/generate.h b/src/shdc/generators/generate.h new file mode 100644 index 00000000..50bce16c --- /dev/null +++ b/src/shdc/generators/generate.h @@ -0,0 +1,10 @@ +#pragma once +#include "types/gen/gen_input.h" +#include "types/errmsg.h" +#include "types/format.h" + +namespace shdc::gen { + +ErrMsg generate(Format::Enum format, const GenInput& gen_input); + +} \ No newline at end of file diff --git a/src/shdc/formats/sokol.cc b/src/shdc/generators/sokol.cc similarity index 95% rename from src/shdc/formats/sokol.cc rename to src/shdc/generators/sokol.cc index dc25b43b..d63b37f7 100644 --- a/src/shdc/formats/sokol.cc +++ b/src/shdc/generators/sokol.cc @@ -7,7 +7,7 @@ #include "pystring.h" #include -namespace shdc::formats::sokol { +namespace shdc::gen::sokol { using namespace util; using namespace refl; @@ -777,7 +777,7 @@ static void write_uniform_desc_func(const Program& prog, const Args& args, const } -ErrMsg gen(const Args& args, const Input& inp, const std::array& spirvcross, const std::array& bytecode, const Bindings& merged_bindings) { +ErrMsg generate(const GenInput& gen) { // first write everything into a string, and only when no errors occur, // dump this into a file (so we don't have half-written files lying around) file_content.clear(); @@ -789,71 +789,71 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array= 0) && (slang_index < Slang::NUM)); - write_attr_slot_func(prog, args, inp, spirvcross[slang_index]); - write_image_slot_func(prog, args, inp, spirvcross[slang_index]); - write_sampler_slot_func(prog, args, inp, spirvcross[slang_index]); - write_uniformblock_slot_func(prog, args, inp, spirvcross[slang_index]); - write_uniformblock_size_func(prog, args, inp, spirvcross[slang_index]); - write_uniform_offset_func(prog, args, inp, spirvcross[slang_index]); - write_uniform_desc_func(prog, args, inp, spirvcross[slang_index]); + write_attr_slot_func(prog, gen.args, gen.inp, gen.spirvcross[slang_index]); + write_image_slot_func(prog, gen.args, gen.inp, gen.spirvcross[slang_index]); + write_sampler_slot_func(prog, gen.args, gen.inp, gen.spirvcross[slang_index]); + write_uniformblock_slot_func(prog, gen.args, gen.inp, gen.spirvcross[slang_index]); + write_uniformblock_size_func(prog, gen.args, gen.inp, gen.spirvcross[slang_index]); + write_uniform_offset_func(prog, gen.args, gen.inp, gen.spirvcross[slang_index]); + write_uniform_desc_func(prog, gen.args, gen.inp, gen.spirvcross[slang_index]); } } if (guard_written) { - if (args.output_format == Format::SOKOL_DECL) { + if (gen.args.output_format == Format::SOKOL_DECL) { L("#endif /* SOKOL_SHDC_DECL */\n"); - } else if (args.output_format == Format::SOKOL_IMPL) { + } else if (gen.args.output_format == Format::SOKOL_IMPL) { L("#endif /* SOKOL_SHDC_IMPL */\n"); } } // write result into output file - FILE* f = fopen(args.output.c_str(), "w"); + FILE* f = fopen(gen.args.output.c_str(), "w"); if (!f) { - return ErrMsg::error(inp.base_path, 0, fmt::format("failed to open output file '{}'", args.output)); + return ErrMsg::error(gen.inp.base_path, 0, fmt::format("failed to open output file '{}'", gen.args.output)); } fwrite(file_content.c_str(), file_content.length(), 1, f); fclose(f); diff --git a/src/shdc/generators/sokol.h b/src/shdc/generators/sokol.h new file mode 100644 index 00000000..f06d72fb --- /dev/null +++ b/src/shdc/generators/sokol.h @@ -0,0 +1,8 @@ +#pragma once +#include "types/gen/gen_input.h" + +namespace shdc::gen::sokol { + +ErrMsg generate(const GenInput& gen); + +} diff --git a/src/shdc/formats/sokolnim.cc b/src/shdc/generators/sokolnim.cc similarity index 95% rename from src/shdc/formats/sokolnim.cc rename to src/shdc/generators/sokolnim.cc index ea2b5d90..3dded473 100644 --- a/src/shdc/formats/sokolnim.cc +++ b/src/shdc/generators/sokolnim.cc @@ -7,7 +7,7 @@ #include "pystring.h" #include -namespace shdc::formats::sokolnim { +namespace shdc::gen::sokolnim { using namespace util; using namespace refl; @@ -447,7 +447,7 @@ static void write_shader_desc_init(const char* indent, const Program& prog, cons L("{}result.label = \"{}\"\n", indent, shader_name); } -ErrMsg gen(const Args& args, const Input& inp, const std::array& spirvcross, const std::array& bytecode, const Bindings& merged_bindings) { +ErrMsg generate(const GenInput& gen) { // first write everything into a string, and only when no errors occur, // dump this into a file (so we don't have half-written files lying around) file_content.clear(); @@ -456,36 +456,36 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array -namespace shdc::formats::sokolodin { +namespace shdc::gen::sokolodin { using namespace util; using namespace refl; @@ -427,7 +427,7 @@ static void write_shader_desc_init(const char* indent, const Program& prog, cons L("{}desc.label = \"{}{}_shader\"\n", indent, mod_prefix(inp), prog.name); } -ErrMsg gen(const Args& args, const Input& inp, const std::array& spirvcross, const std::array& bytecode, const Bindings& merged_bindings) { +ErrMsg generate(const GenInput& gen) { // first write everything into a string, and only when no errors occur, // dump this into a file (so we don't have half-written files lying around) file_content.clear(); @@ -436,37 +436,37 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array sg.Shader_Desc {{\n", mod_prefix(inp), prog.name); + L("{}{}_shader_desc :: proc (backend: sg.Backend) -> sg.Shader_Desc {{\n", mod_prefix(gen.inp), prog.name); L(" desc: sg.Shader_Desc\n"); L(" #partial switch backend {{\n"); for (int i = 0; i < Slang::NUM; i++) { Slang::Enum slang = (Slang::Enum) i; - if (args.slang & Slang::bit(slang)) { + if (gen.args.slang & Slang::bit(slang)) { L(" case {}: {{\n", sokol_backend(slang)); - write_shader_desc_init(" ", prog, inp, spirvcross[i], bytecode[i], slang); + write_shader_desc_init(" ", prog, gen.inp, gen.spirvcross[i], gen.bytecode[i], slang); L(" }}\n"); } } @@ -476,9 +476,9 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array -namespace shdc::formats::sokolrust { +namespace shdc::gen::sokolrust { using namespace util; using namespace refl; @@ -446,7 +446,7 @@ static void write_shader_desc_init(const char* indent, const Program& prog, cons L("{}desc.label = b\"{}{}_shader\\0\".as_ptr() as *const _;\n", indent, mod_prefix(inp), prog.name); } -ErrMsg gen(const Args& args, const Input& inp, const std::array& spirvcross, const std::array& bytecode, const Bindings& merged_bindings) { +ErrMsg generate(const GenInput& gen) { // first write everything into a string, and only when no errors occur, // dump this into a file (so we don't have half-written files lying around) file_content.clear(); @@ -457,39 +457,39 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array sg::ShaderDesc {{\n", mod_prefix(inp), prog.name); + L("pub fn {}{}_shader_desc(backend: sg::Backend) -> sg::ShaderDesc {{\n", mod_prefix(gen.inp), prog.name); L(" let mut desc = sg::ShaderDesc::new();\n"); L(" match backend {{\n"); for (int i = 0; i < Slang::NUM; i++) { Slang::Enum slang = (Slang::Enum) i; - if (args.slang & Slang::bit(slang)) { + if (gen.args.slang & Slang::bit(slang)) { L(" {} => {{\n", sokol_backend(slang)); - write_shader_desc_init(" ", prog, inp, spirvcross[i], bytecode[i], slang); + write_shader_desc_init(" ", prog, gen.inp, gen.spirvcross[i], gen.bytecode[i], slang); L(" }},\n"); } } @@ -500,9 +500,9 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array -namespace shdc::formats::sokolzig { +namespace shdc::gen::sokolzig { using namespace util; using namespace refl; @@ -432,7 +432,7 @@ static void write_shader_desc_init(const char* indent, const Program& prog, cons L("{}desc.label = \"{}{}_shader\";\n", indent, mod_prefix(inp), prog.name); } -ErrMsg gen(const Args& args, const Input& inp, const std::array& spirvcross, const std::array& bytecode, const Bindings& merged_bindings) { +ErrMsg generate(const GenInput& gen) { // first write everything into a string, and only when no errors occur, // dump this into a file (so we don't have half-written files lying around) file_content.clear(); @@ -442,37 +442,37 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array {{\n", sokol_backend(slang)); - write_shader_desc_init(" ", prog, inp, spirvcross[i], bytecode[i], slang); + write_shader_desc_init(" ", prog, gen.inp, gen.spirvcross[i], gen.bytecode[i], slang); L(" }},\n"); } } @@ -483,9 +483,9 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array -namespace shdc::formats::yaml { +namespace shdc::gen::yaml { using namespace util; using namespace refl; @@ -198,9 +198,9 @@ static ErrMsg write_shader_sources_and_blobs(const Args& args, return ErrMsg(); } -ErrMsg gen(const Args& args, const Input& inp, const std::array& spirvcross, const std::array& bytecode, const Bindings& merged_bindings) { +ErrMsg generate(const GenInput& gen) { // first generate the bare-output files - ErrMsg output_err = bare::gen(args, inp, spirvcross, bytecode); + ErrMsg output_err = bare::generate(gen); if (output_err.valid()) { return output_err; } @@ -211,15 +211,15 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array snippet_bindings; - for (int i = 0; i < Slang::NUM; i++) { - Slang::Enum slang = (Slang::Enum)i; - if (args.slang & Slang::bit(slang)) { - for (const SpirvcrossSource& src: spirvcross[i].sources) { - snippet_bindings.push_back(src.refl.bindings); - } + std::vector snippet_bindings; + for (int i = 0; i < Slang::NUM; i++) { + Slang::Enum slang = (Slang::Enum)i; + if (args.slang & Slang::bit(slang)) { + for (const SpirvcrossSource& src: spirvcross[i].sources) { + snippet_bindings.push_back(src.refl.bindings); } } - ErrMsg merge_error; - if (!Reflection::merge_bindings(snippet_bindings, inp.base_path, merged_bindings, merge_error)) { - merge_error.print(args.error_format); - } + } + ErrMsg merge_error; + const Bindings merged_bindings = Reflection::merge_bindings(snippet_bindings, inp.base_path, merge_error); + if (merge_error.valid()) { + merge_error.print(args.error_format); + return 10; } // generate output files - ErrMsg output_err; - switch (args.output_format) { - case Format::BARE: - output_err = formats::bare::gen(args, inp, spirvcross, bytecode); - break; - case Format::BARE_YAML: - output_err = formats::yaml::gen(args, inp, spirvcross, bytecode, merged_bindings); - break; - case Format::SOKOL_ZIG: - output_err = formats::sokolzig::gen(args, inp, spirvcross, bytecode, merged_bindings); - break; - case Format::SOKOL_NIM: - output_err = formats::sokolnim::gen(args, inp, spirvcross, bytecode, merged_bindings); - break; - case Format::SOKOL_ODIN: - output_err = formats::sokolodin::gen(args, inp, spirvcross, bytecode, merged_bindings); - break; - case Format::SOKOL_RUST: - output_err = formats::sokolrust::gen(args, inp, spirvcross, bytecode, merged_bindings); - break; - default: - output_err = formats::sokol::gen(args, inp, spirvcross, bytecode, merged_bindings); - break; - } - if (output_err.valid()) { - output_err.print(args.error_format); + const GenInput gen_input(args, inp, spirvcross, bytecode, merged_bindings); + ErrMsg gen_error = generate(args.output_format, gen_input); + if (gen_error.valid()) { + gen_error.print(args.error_format); return 10; } diff --git a/src/shdc/reflection.cc b/src/shdc/reflection.cc index a45f5c87..483a62e3 100644 --- a/src/shdc/reflection.cc +++ b/src/shdc/reflection.cc @@ -220,8 +220,8 @@ Reflection Reflection::parse(const Compiler& compiler, const Snippet& snippet, S return refl; } -bool Reflection::merge_bindings(const std::vector& in_bindings, const std::string& inp_base_path, Bindings& out_bindings, ErrMsg& out_error) { - out_bindings = Bindings(); +Bindings Reflection::merge_bindings(const std::vector& in_bindings, const std::string& inp_base_path, ErrMsg& out_error) { + Bindings out_bindings; out_error = ErrMsg(); for (const Bindings& src_bindings: in_bindings) { @@ -232,7 +232,7 @@ bool Reflection::merge_bindings(const std::vector& in_bindings, const // another uniform block of the same name exists, make sure it's identical if (!ub.equals(*other_ub)) { out_error = ErrMsg::error(inp_base_path, 0, fmt::format("conflicting uniform block definitions found for '{}'", ub.struct_name)); - return false; + return Bindings(); } } else { out_bindings.uniform_blocks.push_back(ub); @@ -246,7 +246,7 @@ bool Reflection::merge_bindings(const std::vector& in_bindings, const // another image of the same name exists, make sure it's identical if (!img.equals(*other_img)) { out_error = ErrMsg::error(inp_base_path, 0, fmt::format("conflicting texture definitions found for '{}'", img.name)); - return false; + return Bindings(); } } else { out_bindings.images.push_back(img); @@ -260,7 +260,7 @@ bool Reflection::merge_bindings(const std::vector& in_bindings, const // another sampler of the same name exists, make sure it's identical if (!smp.equals(*other_smp)) { out_error = ErrMsg::error(inp_base_path, 0, fmt::format("conflicting sampler definitions found for '{}'", smp.name)); - return false; + return Bindings(); } } else { out_bindings.samplers.push_back(smp); @@ -274,14 +274,14 @@ bool Reflection::merge_bindings(const std::vector& in_bindings, const // another image sampler of the same name exists, make sure it's identical if (!img_smp.equals(*other_img_smp)) { out_error = ErrMsg::error(inp_base_path, 0, fmt::format("conflicting image-sampler definition found for '{}'", img_smp.name)); - return false; + return Bindings(); } } else { out_bindings.image_samplers.push_back(img_smp); } } } - return true; + return out_bindings; } } // namespace diff --git a/src/shdc/reflection.h b/src/shdc/reflection.h index 50cbd5ae..180a1154 100644 --- a/src/shdc/reflection.h +++ b/src/shdc/reflection.h @@ -22,7 +22,7 @@ struct Reflection { // parse reflection info for a compiled shader source static Reflection parse(const spirv_cross::Compiler& compiler, const Snippet& snippet, Slang::Enum slang); // create a set of unique resource bindings from shader snippet input bindings - static bool merge_bindings(const std::vector& in_bindings, const std::string& inp_base_path, Bindings& out_bindings, ErrMsg& out_error); + static Bindings merge_bindings(const std::vector& in_bindings, const std::string& inp_base_path, ErrMsg& out_error); }; } // namespace reflection diff --git a/src/shdc/types/gen/gen_input.h b/src/shdc/types/gen/gen_input.h new file mode 100644 index 00000000..5ab7b61a --- /dev/null +++ b/src/shdc/types/gen/gen_input.h @@ -0,0 +1,37 @@ +#pragma once +#include "args.h" +#include "input.h" +#include "spirvcross.h" +#include "bytecode.h" +#include "types/reflection/bindings.h" + +namespace shdc::gen { + +struct GenInput { + const Args& args; + const Input& inp; + const std::array& spirvcross; + const std::array& bytecode; + const refl::Bindings& merged_bindings; + + GenInput(const Args& args, + const Input& inp, + const std::array& spirvcross, + const std::array& bytecode, + const refl::Bindings& merged_bindings); +}; + +inline GenInput::GenInput( + const Args& _args, + const Input& _inp, + const std::array& _spirvcross, + const std::array& _bytecode, + const refl::Bindings& _merged_bindings): +args(_args), +inp(_inp), +spirvcross(_spirvcross), +bytecode(_bytecode), +merged_bindings(_merged_bindings) +{ }; + +} // namespace \ No newline at end of file