Skip to content

Commit

Permalink
generator code cleanup wip
Browse files Browse the repository at this point in the history
  • Loading branch information
floooh committed Mar 18, 2024
1 parent 3bff749 commit 91b8299
Show file tree
Hide file tree
Showing 30 changed files with 279 additions and 290 deletions.
2 changes: 1 addition & 1 deletion src/shdc/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
18 changes: 0 additions & 18 deletions src/shdc/formats/bare.h

This file was deleted.

18 changes: 0 additions & 18 deletions src/shdc/formats/sokol.h

This file was deleted.

18 changes: 0 additions & 18 deletions src/shdc/formats/sokolnim.h

This file was deleted.

18 changes: 0 additions & 18 deletions src/shdc/formats/sokolodin.h

This file was deleted.

18 changes: 0 additions & 18 deletions src/shdc/formats/sokolrust.h

This file was deleted.

18 changes: 0 additions & 18 deletions src/shdc/formats/sokolzig.h

This file was deleted.

18 changes: 0 additions & 18 deletions src/shdc/formats/yaml.h

This file was deleted.

14 changes: 7 additions & 7 deletions src/shdc/formats/bare.cc → src/shdc/generators/bare.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
#include "pystring.h"
#include <stdio.h>

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");
Expand Down Expand Up @@ -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,Slang::NUM>& spirvcross, const std::array<Bytecode,Slang::NUM>& 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;
}
Expand Down
8 changes: 8 additions & 0 deletions src/shdc/generators/bare.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#pragma once
#include "types/gen/gen_input.h"

namespace shdc::gen::bare {

ErrMsg generate(const GenInput& gen);

}
35 changes: 35 additions & 0 deletions src/shdc/generators/generate.cc
Original file line number Diff line number Diff line change
@@ -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
10 changes: 10 additions & 0 deletions src/shdc/generators/generate.h
Original file line number Diff line number Diff line change
@@ -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);

}
56 changes: 28 additions & 28 deletions src/shdc/formats/sokol.cc → src/shdc/generators/sokol.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include "pystring.h"
#include <stdio.h>

namespace shdc::formats::sokol {
namespace shdc::gen::sokol {

using namespace util;
using namespace refl;
Expand Down Expand Up @@ -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,Slang::NUM>& spirvcross, const std::array<Bytecode,Slang::NUM>& 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();
Expand All @@ -789,71 +789,71 @@ ErrMsg gen(const Args& args, const Input& inp, const std::array<Spirvcross,Slang
bool guard_written = false;
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;
}
if (!comment_header_written) {
comment_header_written = true;
write_header(args, inp, spirvcross[i], merged_bindings);
write_header(gen.args, gen.inp, gen.spirvcross[i], gen.merged_bindings);
}
if (!common_decls_written) {
common_decls_written = true;
write_common_decls(slang, args, inp, spirvcross[i], merged_bindings);
write_common_decls(slang, gen.args, gen.inp, gen.spirvcross[i], gen.merged_bindings);
}
if (!guard_written) {
guard_written = true;
if (args.output_format == Format::SOKOL_DECL) {
if (gen.args.output_format == Format::SOKOL_DECL) {
L("#if !defined(SOKOL_SHDC_DECL)\n");
} else if (args.output_format == Format::SOKOL_IMPL) {
} else if (gen.args.output_format == Format::SOKOL_IMPL) {
L("#if defined(SOKOL_SHDC_IMPL)\n");
}
}
if (args.ifdef) {
if (gen.args.ifdef) {
L("#if defined({})\n", sokol_define(slang));
}
write_shader_sources_and_blobs(inp, spirvcross[i], bytecode[i], slang);
if (args.ifdef) {
write_shader_sources_and_blobs(gen.inp, gen.spirvcross[i], gen.bytecode[i], slang);
if (gen.args.ifdef) {
L("#endif /* {} */\n", sokol_define(slang));
}
}
}

// write access functions which return sg_shader_desc pointers
if (args.output_format != Format::SOKOL_IMPL) {
if (gen.args.output_format != Format::SOKOL_IMPL) {
L("#if !defined(SOKOL_GFX_INCLUDED)\n");
L(" #error \"Please include sokol_gfx.h before {}\"\n", pystring::os::path::basename(args.output));
L(" #error \"Please include sokol_gfx.h before {}\"\n", pystring::os::path::basename(gen.args.output));
L("#endif\n");
}
for (const auto& item: inp.programs) {
for (const auto& item: gen.inp.programs) {
const Program& prog = item.second;
write_shader_desc_func(prog, args, inp, spirvcross, bytecode);
if (args.reflection) {
int slang_index = (int)Slang::first_valid(args.slang);
write_shader_desc_func(prog, gen.args, gen.inp, gen.spirvcross, gen.bytecode);
if (gen.args.reflection) {
int slang_index = (int)Slang::first_valid(gen.args.slang);
assert((slang_index >= 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);
Expand Down
8 changes: 8 additions & 0 deletions src/shdc/generators/sokol.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#pragma once
#include "types/gen/gen_input.h"

namespace shdc::gen::sokol {

ErrMsg generate(const GenInput& gen);

}
Loading

0 comments on commit 91b8299

Please # to comment.