Skip to content

Commit

Permalink
convert Zig generator to new style
Browse files Browse the repository at this point in the history
  • Loading branch information
floooh committed Mar 25, 2024
1 parent ff88c9e commit 679306c
Show file tree
Hide file tree
Showing 6 changed files with 357 additions and 437 deletions.
26 changes: 19 additions & 7 deletions src/shdc/generators/generator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,26 @@ Generator::ShaderStageArrayInfo Generator::shader_stage_array_info(const GenInpu
// default behaviour of begin is to clear the generated content string, and check for error in GenInput
ErrMsg Generator::begin(const GenInput& gen) {
content.clear();
mod_prefix = util::mod_prefix(gen.inp);
return check_errors(gen);
}

// for anything written at the top of the file
void Generator::gen_prolog(const GenInput& gen) {
// empty
}

// for anything written at the end of the file
void Generator::gen_epilog(const GenInput& gen) {
// emptu
}

// create a default comment header
void Generator::gen_header(const GenInput& gen) {
cbl_start();
cbl("#version:{} (machine generated, don't edit!)\n\n", gen.args.gen_version);
cbl("Generated by sokol-shdc (https://github.com/floooh/sokol-tools)\n\n");
cbl("#version:{} (machine generated, don't edit!)\n", gen.args.gen_version);
cbl("\n");
cbl("Generated by sokol-shdc (https://github.com/floooh/sokol-tools)\n");
cbl("\n");
cbl_open("Cmdline:\n");
cbl("{}\n", gen.args.cmdline);
cbl_close("\n");
Expand All @@ -72,7 +83,11 @@ void Generator::gen_header(const GenInput& gen) {
cbl_close();
}
cbl_end();
l("\n");
}

// written after the comment header
void Generator::gen_prerequisites(const GenInput& gen) {
// empty
}

void Generator::gen_vertex_shader_info(const GenInput& gen, const ProgramReflection& prog) {
Expand Down Expand Up @@ -137,15 +152,12 @@ void Generator::gen_bind_slot_consts(const GenInput& gen) {
for (const UniformBlock& ub: gen.refl.bindings.uniform_blocks) {
l("{}\n", uniform_block_bind_slot_definition(ub));
}
l("\n");
for (const Image& img: gen.refl.bindings.images) {
l("{}\n", image_bind_slot_definition(img));
}
l("\n");
for (const Sampler& smp: gen.refl.bindings.samplers) {
l("{}\n", sampler_bind_slot_definition(smp));
}
l("\n");
}

void Generator::gen_uniformblock_decls(const GenInput& gen) {
Expand Down
18 changes: 9 additions & 9 deletions src/shdc/generators/generator.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,19 @@ class Generator {
virtual ErrMsg generate(const GenInput& gen);

protected:
// the current module prefix, initialized by begin()
std::string mod_prefix;

// called directly by generate() in this order
virtual ErrMsg begin(const GenInput& gen);
virtual void gen_prolog(const GenInput& gen) { assert(false && "implement me"); };
virtual void gen_prolog(const GenInput& gen);
virtual void gen_header(const GenInput& gen);
virtual void gen_prerequisites(const GenInput& gen) { assert(false && "implement me"); };
virtual void gen_prerequisites(const GenInput& gen);
virtual void gen_vertex_attr_consts(const GenInput& gen);
virtual void gen_bind_slot_consts(const GenInput& gen);
virtual void gen_uniformblock_decls(const GenInput& gen);
virtual void gen_stb_impl_start(const GenInput& gen) { };
virtual void gen_shader_arrays(const GenInput& gen);
virtual void gen_shader_desc_funcs(const GenInput& gen);
virtual void gen_reflection_funcs(const GenInput& gen);
virtual void gen_epilog(const GenInput& gen) { assert(false && "implement me"); };
virtual void gen_epilog(const GenInput& gen);
virtual void gen_stb_impl_end(const GenInput& gen) { };
virtual ErrMsg end(const GenInput& gen);

Expand Down Expand Up @@ -93,9 +90,12 @@ class Generator {
ShaderStageArrayInfo shader_stage_array_info(const GenInput& gen, const refl::ProgramReflection& prog, refl::ShaderStage::Enum stage, Slang::Enum slang);

// line output
void reset_indent() { indentation = ""; };
template<typename... T> void l(fmt::format_string<T...> fmt, T&&... args) {
const std::string str = fmt::format("{}{}", indentation, fmt::vformat(fmt, fmt::make_format_args(args...)));
const std::string str = fmt::format("{}{}", indentation, fmt::format(fmt, args...));
content.append(str);
}
template<typename... T> void l_append(fmt::format_string<T...> fmt, T&&... args) {
const std::string str = fmt::format(fmt, args...);
content.append(str);
}
template<typename... T> void l_open(fmt::format_string<T...> fmt, T&&... args) {
Expand All @@ -111,7 +111,7 @@ class Generator {
l_open("{}\n", comment_block_start());
}
template<typename... T> void cbl(fmt::format_string<T...> fmt, T&&... args) {
const std::string str = fmt::format("{}{}{}", comment_block_line_prefix(), indentation, fmt::vformat(fmt, fmt::make_format_args(args...)));
const std::string str = fmt::format("{}{}{}", comment_block_line_prefix(), indentation, fmt::format(fmt, args...));
content.append(str);
}
template<typename... T> void cbl_open(fmt::format_string<T...> fmt, T&&... args) {
Expand Down
35 changes: 19 additions & 16 deletions src/shdc/generators/sokol.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,21 @@ static const char* sokol_define(Slang::Enum slang) {
}
}

static std::string func_prefix(const Args& args) {
if (args.output_format != Format::SOKOL_IMPL) {
return std::string("static inline ");
} else {
return std::string();
ErrMsg SokolGenerator::begin(const GenInput& gen) {
if (!gen.inp.module.empty()) {
mod_prefix = fmt::format("{}_", gen.inp.module);
}
if (gen.args.output_format != Format::SOKOL_IMPL) {
func_prefix = "static inline ";
}
return Generator::begin(gen);
}

void SokolGenerator::gen_prolog(const GenInput& gen) {
l("#pragma once\n");
for (const auto& header: gen.inp.headers) {
l("{}\n", header);
}
}

void SokolGenerator::gen_epilog(const GenInput& gen) {
Expand Down Expand Up @@ -72,7 +77,6 @@ void SokolGenerator::gen_prerequisites(const GenInput& gen) {
}

void SokolGenerator::gen_uniformblock_decl(const GenInput &gen, const UniformBlock& ub) {
reset_indent();
l("#pragma pack(push,1)\n");
int cur_offset = 0;
l_open("SOKOL_SHDC_ALIGN(16) typedef struct {} {{\n", struct_name(ub.struct_name));
Expand Down Expand Up @@ -125,8 +129,7 @@ void SokolGenerator::gen_uniformblock_decl(const GenInput &gen, const UniformBlo
}

void SokolGenerator::gen_shader_desc_func(const GenInput& gen, const ProgramReflection& prog) {
reset_indent();
l_open("{}const sg_shader_desc* {}{}_shader_desc(sg_backend backend) {{\n", func_prefix(gen.args), mod_prefix, prog.name);
l_open("{}const sg_shader_desc* {}{}_shader_desc(sg_backend backend) {{\n", func_prefix, mod_prefix, prog.name);
for (int i = 0; i < Slang::Num; i++) {
Slang::Enum slang = Slang::from_index(i);
if (gen.args.slang & Slang::bit(slang)) {
Expand All @@ -152,7 +155,7 @@ void SokolGenerator::gen_shader_desc_func(const GenInput& gen, const ProgramRefl
for (int stage_index = 0; stage_index < ShaderStage::Num; stage_index++) {
const ShaderStageArrayInfo& info = shader_stage_array_info(gen, prog, ShaderStage::from_index(stage_index), slang);
const StageReflection& refl = prog.stages[stage_index];
const std::string dsn = fmt::format("desc.{}", refl.stage_name);
const std::string dsn = fmt::format("desc.{}", pystring::lower(refl.stage_name));
if (info.has_bytecode) {
l("{}.bytecode.ptr = {};\n", dsn, info.bytecode_array_name);
l("{}.bytecode.size = {};\n", dsn, info.bytecode_array_size);
Expand Down Expand Up @@ -237,7 +240,7 @@ void SokolGenerator::gen_shader_desc_func(const GenInput& gen, const ProgramRefl
}

void SokolGenerator::gen_attr_slot_refl_func(const GenInput& gen, const ProgramReflection& prog) {
l_open("{}int {}{}_attr_slot(const char* attr_name) {{\n", func_prefix(gen.args), mod_prefix, prog.name);
l_open("{}int {}{}_attr_slot(const char* attr_name) {{\n", func_prefix, mod_prefix, prog.name);
l("(void)attr_name;\n");
for (const StageAttr& attr: prog.vs().inputs) {
if (attr.slot >= 0) {
Expand All @@ -251,7 +254,7 @@ void SokolGenerator::gen_attr_slot_refl_func(const GenInput& gen, const ProgramR
}

void SokolGenerator::gen_image_slot_refl_func(const GenInput& gen, const ProgramReflection& prog) {
l_open("{}int {}{}_image_slot(sg_shader_stage stage, const char* img_name) {{\n", func_prefix(gen.args), mod_prefix, prog.name);
l_open("{}int {}{}_image_slot(sg_shader_stage stage, const char* img_name) {{\n", func_prefix, mod_prefix, prog.name);
l("(void)stage; (void)img_name;\n");
for (const StageReflection& refl: prog.stages) {
if (!refl.bindings.images.empty()) {
Expand All @@ -271,7 +274,7 @@ void SokolGenerator::gen_image_slot_refl_func(const GenInput& gen, const Program
}

void SokolGenerator::gen_sampler_slot_refl_func(const GenInput& gen, const ProgramReflection& prog) {
l_open("{}int {}{}_sampler_slot(sg_shader_stage stage, const char* smp_name) {{\n", func_prefix(gen.args), mod_prefix, prog.name);
l_open("{}int {}{}_sampler_slot(sg_shader_stage stage, const char* smp_name) {{\n", func_prefix, mod_prefix, prog.name);
l("(void)stage; (void)smp_name;\n");
for (const StageReflection& refl: prog.stages) {
if (!refl.bindings.samplers.empty()) {
Expand All @@ -291,7 +294,7 @@ void SokolGenerator::gen_sampler_slot_refl_func(const GenInput& gen, const Progr
}

void SokolGenerator::gen_uniformblock_slot_refl_func(const GenInput& gen, const ProgramReflection& prog) {
l_open("{}int {}{}_uniformblock_slot(sg_shader_stage stage, const char* ub_name) {{\n", func_prefix(gen.args), mod_prefix, prog.name);
l_open("{}int {}{}_uniformblock_slot(sg_shader_stage stage, const char* ub_name) {{\n", func_prefix, mod_prefix, prog.name);
l("(void)stage; (void)ub_name;\n");
for (const StageReflection& refl: prog.stages) {
if (!refl.bindings.uniform_blocks.empty()) {
Expand All @@ -311,7 +314,7 @@ void SokolGenerator::gen_uniformblock_slot_refl_func(const GenInput& gen, const
}

void SokolGenerator::gen_uniformblock_size_refl_func(const GenInput& gen, const ProgramReflection& prog) {
l_open("{}size_t {}{}_uniformblock_size(sg_shader_stage stage, const char* ub_name) {{\n", func_prefix(gen.args), mod_prefix, prog.name);
l_open("{}size_t {}{}_uniformblock_size(sg_shader_stage stage, const char* ub_name) {{\n", func_prefix, mod_prefix, prog.name);
l("(void)stage; (void)ub_name;\n");
for (const StageReflection& refl: prog.stages) {
if (!refl.bindings.uniform_blocks.empty()) {
Expand All @@ -331,7 +334,7 @@ void SokolGenerator::gen_uniformblock_size_refl_func(const GenInput& gen, const
}

void SokolGenerator::gen_uniform_offset_refl_func(const GenInput& gen, const ProgramReflection& prog) {
l_open("{}int {}{}_uniform_offset(sg_shader_stage stage, const char* ub_name, const char* u_name) {{\n", func_prefix(gen.args), mod_prefix, prog.name);
l_open("{}int {}{}_uniform_offset(sg_shader_stage stage, const char* ub_name, const char* u_name) {{\n", func_prefix, mod_prefix, prog.name);
l("(void)stage; (void)ub_name; (void)u_name;\n");
for (const StageReflection& refl: prog.stages) {
if (!refl.bindings.uniform_blocks.empty()) {
Expand All @@ -355,7 +358,7 @@ void SokolGenerator::gen_uniform_offset_refl_func(const GenInput& gen, const Pro
}

void SokolGenerator::gen_uniform_desc_refl_func(const GenInput& gen, const ProgramReflection& prog) {
l_open("{}sg_shader_uniform_desc {}{}_uniform_desc(sg_shader_stage stage, const char* ub_name, const char* u_name) {{\n", func_prefix(gen.args), mod_prefix, prog.name);
l_open("{}sg_shader_uniform_desc {}{}_uniform_desc(sg_shader_stage stage, const char* ub_name, const char* u_name) {{\n", func_prefix, mod_prefix, prog.name);
l("(void)stage; (void)ub_name; (void)u_name;\n");
l("#if defined(__cplusplus)\n");
l("sg_shader_uniform_desc desc = {{}};\n");
Expand Down
3 changes: 3 additions & 0 deletions src/shdc/generators/sokol.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
namespace shdc::gen {

class SokolGenerator: public Generator {
std::string mod_prefix;
std::string func_prefix;
protected:
virtual ErrMsg begin(const GenInput& gen);
virtual void gen_prolog(const GenInput& gen);
virtual void gen_epilog(const GenInput& gen);
virtual void gen_prerequisites(const GenInput& gen);
Expand Down
Loading

0 comments on commit 679306c

Please # to comment.