ref: 2456c5671629b47378665485801e73aea7234856
parent: a66be92f63ec59c1811403eb7b95fa72588beee6
author: sirjofri <sirjofri@sirjofri.de>
date: Fri Feb 16 12:29:26 EST 2024
adds missing objects.h, adds backend descriptor pools, sets, uniform binding, shader binding (untestet)
--- /dev/null
+++ b/objects.h
@@ -1,0 +1,24 @@
+typedef struct Buffer Buffer;
+struct Buffer {+ char *buffer;
+ long len;
+};
+
+typedef struct Shader Shader;
+struct Shader {+ u32int *buffer;
+ long len;
+ int descpool;
+};
+
+typedef struct DescSet DescSet;
+struct DescSet {+ vlong *bindings; // id of buffer
+ int numbindings;
+};
+
+typedef struct DescPool DescPool;
+struct DescPool {+ DescSet *sets;
+ int numsets;
+};
--- a/vm.c
+++ b/vm.c
@@ -85,6 +85,9 @@
Object objects[256];
int numobjects = 0;
+DescPool descpools[8];
+int numdescpools = 0;
+
vlong
genshader(void)
{@@ -292,4 +295,89 @@
buf = &objects[id].b.buffer[offset];
memcpy(data, buf, n);
return n;
+}
+
+int
+gendescpool(int numsets)
+{+ int id;
+ if (numdescpools >= 8) {+ werrstr("not enough pools reserved");+ return -1;
+ }
+
+ id = numdescpools++;
+ descpools[id].sets = malloc(sizeof(DescSet)*numsets);
+ if (!descpools[id].sets) {+ sysfatal("out of memory");+ return -1;
+ }
+ descpools[id].numsets = numsets;
+ memset(descpools[id].sets, 0, sizeof(DescSet)*numsets);
+
+ return id;
+}
+
+int
+allocdescset(int pool, int set, int numbindings)
+{+ if (pool >= numdescpools) {+ werrstr("invalid pool id %d", pool);+ return 0;
+ }
+
+ if (set >= descpools[pool].numsets) {+ werrstr("invalid set id %d", pool);+ return 0;
+ }
+
+ descpools[pool].sets[set].bindings = malloc(sizeof(vlong)*numbindings);
+ if (!descpools[pool].sets[set].bindings) {+ sysfatal("out of memory");+ return 0;
+ }
+ for (int i = 0; i < numbindings; i++) {+ descpools[pool].sets[set].bindings[i] = -1;
+ }
+ descpools[pool].sets[set].numbindings = numbindings;
+ return 1;
+}
+
+int
+binduniform(vlong id, int pool, int set, int binding)
+{+ if (pool >= numdescpools) {+ werrstr("invalid pool id %d", pool);+ return 0;
+ }
+
+ if (set >= descpools[pool].numsets) {+ werrstr("pool has not enough sets");+ return 0;
+ }
+
+ if (binding >= descpools[pool].sets[set].numbindings) {+ werrstr("set has not enough bindings");+ return 0;
+ }
+
+ descpools[pool].sets[set].bindings[binding] = id;
+ return 1;
+}
+
+int
+bindshader(vlong id, int pool)
+{+ if (!IDVALID(id)) {+ werrstr("invalid id %lld", id);+ return 0;
+ }
+
+ if (objects[id].type != SHADER) {+ werrstr("invalid object type: %lld != SHADER", id);+ return 0;
+ }
+
+ objects[id].s.descpool = pool;
+ return 1;
}
--- a/vm.h
+++ b/vm.h
@@ -25,3 +25,9 @@
// length data written
int readshader(vlong id, void *data, long n, long offset);
int readbuffer(vlong id, void *data, long n, long offset);
+
+// descriptor sets
+int gendescpool(int numsets);
+int allocdescset(int pool, int set, int numbindings);
+int binduniform(vlong id, int pool, int set, int binding);
+int bindshader(vlong id, int pool);
--
⑨