nyaa
This commit is contained in:
parent
44b0181dbb
commit
39ee7c8c8a
10 changed files with 174 additions and 70 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,5 +1,5 @@
|
||||||
*.frag
|
*.spv
|
||||||
*.vert
|
|
||||||
nob
|
nob
|
||||||
build/*
|
build/*
|
||||||
nob.old
|
nob.old
|
||||||
|
main
|
||||||
|
|
173
nob.c
173
nob.c
|
@ -5,103 +5,166 @@
|
||||||
|
|
||||||
#define BUILD_FOLDER "build/"
|
#define BUILD_FOLDER "build/"
|
||||||
#define SRC_FOLDER "src/"
|
#define SRC_FOLDER "src/"
|
||||||
|
#define RES_FOLDER "res/"
|
||||||
|
|
||||||
#define len NOB_ARRAY_LEN
|
#define len NOB_ARRAY_LEN
|
||||||
|
|
||||||
const char *sources[] = {
|
|
||||||
"comp", "wayland",
|
|
||||||
"glfw", "vulkan",
|
|
||||||
"kitty", "string",
|
|
||||||
"gpu_allocator", "hashmap",
|
|
||||||
"util", "io",
|
|
||||||
"matrix", "paw_da",
|
|
||||||
"image", "types",
|
|
||||||
"paw_allocator", "paw_log",
|
|
||||||
"paw_object", "register",
|
|
||||||
"lang/ast", "lang/vstack",
|
|
||||||
"lang/ast_disc", "lang/functable",
|
|
||||||
"lang/glue", "Wayland/xdg-shell-protocol",
|
|
||||||
};
|
|
||||||
const char *cflags[] = {"-g", "-rdynamic", "-lm", "-lwayland-client",
|
const char *cflags[] = {"-g", "-rdynamic", "-lm", "-lwayland-client",
|
||||||
"-lxkbcommon", "-lvulkan", "-lglfw"};
|
"-lxkbcommon", "-lvulkan", "-lglfw"};
|
||||||
|
const char *blacklist[] = {"parser.c"};
|
||||||
|
const char *comp = "cc";
|
||||||
|
const char *scomp = "glslc";
|
||||||
|
|
||||||
bool discover_build() {
|
Nob_File_Paths src_cpaths = {0};
|
||||||
|
Procs procs = {0};
|
||||||
|
Cmd cmd = {0};
|
||||||
|
|
||||||
|
bool process_res(char *res_base) {
|
||||||
|
printf("reading %s\n", res_base);
|
||||||
|
Nob_File_Paths res_paths = {0};
|
||||||
|
if (!read_entire_dir(res_base, &res_paths)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < res_paths.count; i++) {
|
||||||
|
if (*res_paths.items[i] == '.') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
char *path = (char *)res_paths.items[i];
|
||||||
|
switch (get_file_type(temp_sprintf("%s%s", res_base, path))) {
|
||||||
|
case NOB_FILE_REGULAR:;
|
||||||
|
bool blacklisted = false;
|
||||||
|
for (int i = 0; i < len(blacklist); i++) {
|
||||||
|
if (strcmp(path, blacklist[i]) == 0) {
|
||||||
|
printf("skipping %s\n", path);
|
||||||
|
blacklisted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!blacklisted) {
|
||||||
|
char *tmp = path;
|
||||||
|
while (*tmp != '.') {
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
if (memcmp(tmp + 1, "vert", strlen("vert")) == 0 ||
|
||||||
|
memcmp(tmp + 1, "frag", strlen("frag")) == 0) {
|
||||||
|
*tmp = 0x0;
|
||||||
|
// path now looks like meooow 0x0 glsl
|
||||||
|
cmd_append(&cmd, scomp, "-c");
|
||||||
|
cmd_append(&cmd, "-o", temp_sprintf("%s%s%s", res_base, path, ".spv"),
|
||||||
|
temp_sprintf("%s%s.%s", res_base, path, tmp + 1));
|
||||||
|
da_append(&procs, cmd_run_async_and_reset(&cmd));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case NOB_FILE_DIRECTORY:;
|
||||||
|
char *folder_path = temp_sprintf("%s%s", res_base, res_paths.items[i]);
|
||||||
|
if (!mkdir_if_not_exists(folder_path)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!process_res(
|
||||||
|
temp_sprintf("%s%s%c", res_base, res_paths.items[i], '/'))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NOB_FILE_SYMLINK:
|
||||||
|
nob_log(ERROR, "symlink");
|
||||||
|
return false;
|
||||||
|
case NOB_FILE_OTHER:
|
||||||
|
nob_log(ERROR, "other");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// base is assumed to be .mew/meooow/nyaa/ or something, note the slashes
|
||||||
|
bool discover_build(char *src_base, char *build_base) {
|
||||||
Nob_File_Paths src_paths = {0};
|
Nob_File_Paths src_paths = {0};
|
||||||
if (!read_entire_dir(SRC_FOLDER, &src_paths)) {
|
if (!read_entire_dir(src_base, &src_paths)) {
|
||||||
exit(1);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < src_paths.count; i++) {
|
for (int i = 0; i < src_paths.count; i++) {
|
||||||
if (*src_paths.items[i] == '.') {
|
if (*src_paths.items[i] == '.') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
char *path = temp_sprintf("%s%s", SRC_FOLDER, src_paths.items[i]);
|
char *path = (char *)src_paths.items[i];
|
||||||
printf("%s\n", path);
|
switch (get_file_type(temp_sprintf("%s%s", src_base, path))) {
|
||||||
switch (get_file_type(path)) {
|
case NOB_FILE_REGULAR:;
|
||||||
case NOB_FILE_REGULAR:
|
bool blacklisted = false;
|
||||||
|
for (int i = 0; i < len(blacklist); i++) {
|
||||||
|
if (strcmp(path, blacklist[i]) == 0) {
|
||||||
|
printf("skipping %s\n", path);
|
||||||
|
blacklisted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!blacklisted) {
|
||||||
|
char *tmp = path;
|
||||||
|
while (*tmp != '.') {
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
if (*(tmp + 1) == 'c') {
|
||||||
|
*tmp = 0x0;
|
||||||
|
// path now looks like meooow 0x0 c
|
||||||
|
cmd_append(&cmd, comp, "-c");
|
||||||
|
for (int j = 0; j < len(cflags); j++) {
|
||||||
|
cmd_append(&cmd, cflags[j]);
|
||||||
|
}
|
||||||
|
cmd_append(&cmd, "-o", temp_sprintf("%s%s%s", build_base, path, ".o"),
|
||||||
|
temp_sprintf("%s%s%s", src_base, path, ".c"));
|
||||||
|
da_append(&procs, cmd_run_async_and_reset(&cmd));
|
||||||
|
da_append(&src_cpaths,
|
||||||
|
temp_sprintf("%s%s%s", build_base, path, ".o"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case NOB_FILE_DIRECTORY:;
|
case NOB_FILE_DIRECTORY:;
|
||||||
if (!mkdir_if_not_exists(
|
char *folder_path = temp_sprintf("%s%s", build_base, src_paths.items[i]);
|
||||||
temp_sprintf("%s%s", BUILD_FOLDER, src_paths.items[i]))) {
|
if (!mkdir_if_not_exists(folder_path)) {
|
||||||
return 1;
|
return false;
|
||||||
|
}
|
||||||
|
if (!discover_build(
|
||||||
|
temp_sprintf("%s%s%c", src_base, src_paths.items[i], '/'),
|
||||||
|
temp_sprintf("%s%s%c", build_base, src_paths.items[i], '/'))) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NOB_FILE_SYMLINK:
|
case NOB_FILE_SYMLINK:
|
||||||
nob_log(ERROR, "symlink");
|
nob_log(ERROR, "symlink");
|
||||||
exit(1);
|
return false;
|
||||||
case NOB_FILE_OTHER:
|
case NOB_FILE_OTHER:
|
||||||
nob_log(ERROR, "other");
|
nob_log(ERROR, "other");
|
||||||
return 1;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
NOB_GO_REBUILD_URSELF(argc, argv);
|
NOB_GO_REBUILD_URSELF(argc, argv);
|
||||||
|
|
||||||
/* if (!discover_build()) { */
|
|
||||||
/* return 1; */
|
|
||||||
/* } */
|
|
||||||
/* return 0; */
|
|
||||||
|
|
||||||
if (!mkdir_if_not_exists(BUILD_FOLDER)) {
|
if (!mkdir_if_not_exists(BUILD_FOLDER)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if (!discover_build(SRC_FOLDER, BUILD_FOLDER)) {
|
||||||
if (!mkdir_if_not_exists(BUILD_FOLDER "lang/")) {
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (!mkdir_if_not_exists(BUILD_FOLDER "Wayland/")) {
|
if (!process_res(RES_FOLDER)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Procs procs = {0};
|
|
||||||
Cmd cmd = {0};
|
|
||||||
|
|
||||||
for (int i = 0; i < len(sources); i++) {
|
|
||||||
cmd_append(&cmd, "cc", "-c");
|
|
||||||
for (int j = 0; j < len(cflags); j++) {
|
|
||||||
cmd_append(&cmd, cflags[j]);
|
|
||||||
}
|
|
||||||
cmd_append(&cmd, "-o",
|
|
||||||
temp_sprintf("%s%s%s", BUILD_FOLDER, sources[i], ".o"),
|
|
||||||
temp_sprintf("%s%s%s", SRC_FOLDER, sources[i], ".c"));
|
|
||||||
da_append(&procs, cmd_run_async_and_reset(&cmd));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!procs_wait_and_reset(&procs)) {
|
if (!procs_wait_and_reset(&procs)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
cmd_append(&cmd, comp);
|
||||||
cmd_append(&cmd, "cc");
|
|
||||||
for (int j = 0; j < len(cflags); j++) {
|
for (int j = 0; j < len(cflags); j++) {
|
||||||
cmd_append(&cmd, cflags[j]);
|
cmd_append(&cmd, cflags[j]);
|
||||||
}
|
}
|
||||||
cmd_append(&cmd, "-o", BUILD_FOLDER "main", "main.c");
|
cmd_append(&cmd, "-o", "main", "main.c");
|
||||||
for (int i = 0; i < len(sources); i++) {
|
for (int i = 0; i < src_cpaths.count; i++) {
|
||||||
cmd_append(&cmd, temp_sprintf("%s%s%s", BUILD_FOLDER, sources[i], ".o"));
|
cmd_append(&cmd, src_cpaths.items[i]);
|
||||||
}
|
}
|
||||||
cmd_run_sync_and_reset(&cmd);
|
cmd_run_sync_and_reset(&cmd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
11
res/shaders/frag.frag
Normal file
11
res/shaders/frag.frag
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#version 450
|
||||||
|
layout(location = 0) in vec3 fragColor;
|
||||||
|
layout(location = 1) in vec2 fragUV;
|
||||||
|
layout(location = 0) out vec4 outColor;
|
||||||
|
|
||||||
|
layout(binding = 2) uniform sampler2D texSampler;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
outColor = texture(texSampler, fragUV) * vec4(fragColor, 1.0);
|
||||||
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
23
res/shaders/vert.vert
Normal file
23
res/shaders/vert.vert
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 inPosition;
|
||||||
|
layout(location = 1) in vec3 inColor;
|
||||||
|
layout(location = 2) in uint index;
|
||||||
|
|
||||||
|
layout(set = 0, binding = 0) uniform UBO {
|
||||||
|
mat3 view;
|
||||||
|
mat3 proj;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
layout(set = 0, binding = 1) uniform UBO_INST {
|
||||||
|
mat3 model[1000];
|
||||||
|
} ubo_inst;
|
||||||
|
|
||||||
|
layout(location = 0) out vec3 fragColor;
|
||||||
|
layout(location = 1) out vec2 fragUV;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = vec4(ubo.proj * ubo.view * ubo_inst.model[index] * vec3(inPosition, 1.0), 1.0);
|
||||||
|
fragColor = inColor;
|
||||||
|
fragUV = inPosition + vec2(0.5, 0.5);
|
||||||
|
}
|
|
@ -8,7 +8,7 @@
|
||||||
#include "paw_allocator.h"
|
#include "paw_allocator.h"
|
||||||
#include "paw_da.h"
|
#include "paw_da.h"
|
||||||
#include "vulkan.h"
|
#include "vulkan.h"
|
||||||
#include "vulkan_helpers.c"
|
#include "vulkan_helpers.h"
|
||||||
|
|
||||||
struct Kitty *kitty_make(struct PawMem *mem) {
|
struct Kitty *kitty_make(struct PawMem *mem) {
|
||||||
struct Kitty *kitty;
|
struct Kitty *kitty;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "../allocator.h"
|
|
||||||
#include "../io.h"
|
#include "../io.h"
|
||||||
#include "../log.h"
|
#include "../paw_allocator.h"
|
||||||
|
#include "../paw_log.h"
|
||||||
#include "../string.h"
|
#include "../string.h"
|
||||||
#include "../util.h"
|
#include "../util.h"
|
||||||
#include "ast.h"
|
#include "ast.h"
|
||||||
|
@ -86,17 +86,17 @@ struct PawStackVal parse_stack_val(char *start, struct StringTable *vars,
|
||||||
struct PawParseVal combine_val_ctrls(struct PawParseVal base,
|
struct PawParseVal combine_val_ctrls(struct PawParseVal base,
|
||||||
struct PawParseVal additions) {
|
struct PawParseVal additions) {
|
||||||
for (int i = 0; i < additions.pre.count; i++) {
|
for (int i = 0; i < additions.pre.count; i++) {
|
||||||
dyn_array_append(&base.pre, additions.pre.items[i]);
|
paw_da_append(&base.pre, additions.pre.items[i]);
|
||||||
}
|
}
|
||||||
base.num_pops += additions.num_pops;
|
base.num_pops += additions.num_pops;
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PawParseVal parse_val(int offset, struct StringTable *vars,
|
struct PawParseVal parse_val(int offset, struct StringTable *vars,
|
||||||
struct Mem *tmp, struct Mem *pem, char *start,
|
struct PawMem *tmp, struct PawMem *pem,
|
||||||
char *end) {
|
char *start, char *end) {
|
||||||
struct PawParseVal val = {0};
|
struct PawParseVal val = {0};
|
||||||
dyn_array_create_inplace_mem(&val.pre, tmp);
|
paw_da_make_inplace_mem(&val.pre, tmp);
|
||||||
|
|
||||||
meow("parsing a val");
|
meow("parsing a val");
|
||||||
start = trim_start(start);
|
start = trim_start(start);
|
||||||
|
@ -174,7 +174,7 @@ struct PawParseVal parse_val(int offset, struct StringTable *vars,
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum PawCtrl *parse_block(struct Mem *tmp, struct Mem *pem, int offset,
|
enum PawCtrl *parse_block(struct PawMem *tmp, struct PawMem *pem, int offset,
|
||||||
struct StringTable *vars, char *start) {
|
struct StringTable *vars, char *start) {
|
||||||
meow("parsing a block");
|
meow("parsing a block");
|
||||||
enum PawCtrl *body = make_pawctrl_seq(pem);
|
enum PawCtrl *body = make_pawctrl_seq(pem);
|
||||||
|
@ -346,8 +346,8 @@ struct PawAST *parse(char *path) {
|
||||||
char *contents = read_text_file(path);
|
char *contents = read_text_file(path);
|
||||||
struct PawAST *ast = ast_make();
|
struct PawAST *ast = ast_make();
|
||||||
|
|
||||||
struct Mem *tmp = make_mem(4096); // temporary memory
|
struct PawMem *tmp = paw_memmake(4096); // temporary memory
|
||||||
struct Mem *pem =
|
struct PawMem *pem =
|
||||||
ast->mem; // permanent memory, will be present once ast is evaled
|
ast->mem; // permanent memory, will be present once ast is evaled
|
||||||
|
|
||||||
struct StringTable *methods = st_make(tmp);
|
struct StringTable *methods = st_make(tmp);
|
||||||
|
@ -382,7 +382,7 @@ struct PawAST *parse(char *path) {
|
||||||
tmp, pem, 0, st_make(tmp),
|
tmp, pem, 0, st_make(tmp),
|
||||||
skip_to_char(st_get(methods, st_get_nth_key(methods, i)), '{')));
|
skip_to_char(st_get(methods, st_get_nth_key(methods, i)), '{')));
|
||||||
}
|
}
|
||||||
uninit_mem(tmp);
|
paw_memunmake(tmp);
|
||||||
|
|
||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
|
#include "vulkan_helpers.h"
|
||||||
#include "paw_log.h"
|
#include "paw_log.h"
|
||||||
|
|
||||||
#include <vulkan/vulkan.h>
|
|
||||||
|
|
||||||
int get_size_of_format(enum VkFormat format) {
|
int get_size_of_format(enum VkFormat format) {
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case VK_FORMAT_R32_UINT:
|
case VK_FORMAT_R32_UINT:
|
||||||
|
|
8
src/vulkan_helpers.h
Normal file
8
src/vulkan_helpers.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef INCLUDE_SRC_VULKAN_HELPERS_H_
|
||||||
|
#define INCLUDE_SRC_VULKAN_HELPERS_H_
|
||||||
|
|
||||||
|
#include <vulkan/vulkan.h>
|
||||||
|
|
||||||
|
int get_size_of_format(enum VkFormat format);
|
||||||
|
|
||||||
|
#endif // INCLUDE_SRC_VULKAN_HELPERS_H_
|
Loading…
Add table
Add a link
Reference in a new issue