shithub: gpufs

Download patch

ref: 4974f11f7c2e917de605d02d5c07ad87c241ff80
parent: 747cddf7870c548043f44adec04b62440e5abd21
author: sirjofri <[email protected]>
date: Thu Feb 15 12:56:33 EST 2024

more filesystem stuff

--- a/gpufs.c
+++ b/gpufs.c
@@ -3,6 +3,7 @@
 #include <fcall.h>
 #include <thread.h>
 #include <9p.h>
+#include <String.h>
 #include "vm.h"
 
 void
@@ -52,6 +53,7 @@
 struct Gpuobject {
 	Ref;
 	int type;
+	int id;
 };
 
 typedef struct Gpufid Gpufid;
@@ -64,9 +66,11 @@
 static int nobjects = 0;
 
 #define OBJECTID(c) ((int)(((Gpuobject*)(c)) - objects))
+#define GO(c) ((Gpuobject*)(c))
 
+String *fsqueue = nil;
+
 int debug = 0;
-int compile = 0;
 
 static char *user;
 static long time0;
@@ -122,14 +126,24 @@
 	
 	switch (level) {
 	case Qobject:
-		snprint(buf, sizeof(buf), "%d", OBJECTID(aux));
+		snprint(buf, sizeof(buf), "%d", GO(aux)->id);
 		d->name = estrdup(buf);
 		break;
 	case Qrctl:
 	case Qctl:
+		d->mode = 0666;
+		d->name = estrdup(nametab[level]);
+		break;
 	case Qbuffer:
+		d->length = getbufferlength(GO(aux)->id);
+		d->mode = 0666;
+		d->name = estrdup(nametab[level]);
+		break;
 	case Qshader:
+		d->length = getshaderlength(GO(aux)->id);
 		d->mode = 0666;
+		d->name = estrdup(nametab[level]);
+		break;
 	default:
 		d->name = estrdup(nametab[level]);
 	}
@@ -158,12 +172,19 @@
 	fsmkdir(d, i, aux);
 	
 	// Qshader is last file in list
-	if (i == Qshader)
+	if (i >= Qshader)
 		return -1;
 	return 0;
 }
 
 static void
+readrctl(Req *r)
+{
+	readstr(r, s_to_c(fsqueue));
+	s_reset(fsqueue);
+}
+
+static void
 fsread(Req *r)
 {
 	//char buf[1024];
@@ -180,6 +201,7 @@
 		respond(r, nil);
 		return;
 	case Qrctl:
+		readrctl(r);
 		respond(r, nil);
 		return;
 	}
@@ -189,6 +211,7 @@
 static void
 fsstart(Srv*)
 {
+	fsqueue = s_new();
 }
 
 static void
@@ -279,43 +302,77 @@
 static int
 newshader(void)
 {
+	int id = genshader();
+	if (id < 0) {
+		return -1;
+	}
 	Gpuobject *o = &objects[nobjects];
 	memset(o, 0, sizeof(*o));
 	o->type = Qshader;
-	return nobjects++;
+	o->id = id;
+	
+	char *s = smprint("s %d\n", o->id);
+	s_append(fsqueue, s);
+	free(s);
+	
+	nobjects++;
+	return o->id;
 }
 
 static int
-newbuffer(void)
+newbuffer(long len)
 {
+	int id = genbuffer(len);
+	if (id < 0) {
+		return -1;
+	}
 	Gpuobject *o = &objects[nobjects];
 	memset(o, 0, sizeof(*o));
 	o->type = Qbuffer;
-	return nobjects++;
+	o->id = id;
+	
+	char *s = smprint("b %d\n", o->id);
+	s_append(fsqueue, s);
+	free(s);
+	
+	nobjects++;
+	return o->id;
 }
 
 static void
-procrootcommand(int argc, char **argv)
+procrootcommand(Req *r, int argc, char **argv)
 {
 	// n(ew) s(hader)
-	// n(ew) b(uffer)
+	// n(ew) b(uffer) <len>
 	
-	if (argc == 2) {
-		if (strcmp(argv[0], "n") == 0) {
+	if (strcmp(argv[0], "n") == 0) {
+		switch (argc) {
+		case 2:
 			if (strcmp(argv[1], "s") == 0) {
-				newshader();
+				if (newshader() < 0)
+					respond(r, "error creating shader!");
+				else
+					respond(r, nil);
 				return;
 			}
+			break;
+		case 3:
 			if (strcmp(argv[1], "b") == 0) {
-				newbuffer();
+				long len = atol(argv[2]);
+				if (newbuffer(len) < 0)
+					respond(r, "error creating buffer!");
+				else
+					respond(r, nil);
 				return;
 			}
 		}
 	}
+	
+	respond(r, "error: bad command!");
 }
 
 static void
-rootcommand(char *cmd)
+rootcommand(Req *r, char *cmd)
 {
 	char *lines[10];
 	int linec;
@@ -325,7 +382,7 @@
 	for (int i = 0; i < linec; i++) {
 		char *c[10];
 		int num = getfields(lines[i], c, 10, 1, " \t");
-		procrootcommand(num, c);
+		procrootcommand(r, num, c);
 	}
 }
 
@@ -342,8 +399,7 @@
 		n = r->ofcall.count = r->ifcall.count;
 		s = emalloc(n+1);
 		memmove(s, r->ifcall.data, n);
-		rootcommand(s);
-		respond(r, nil);
+		rootcommand(r, s);
 		return;
 	}
 	respond(r, "not implemented");
--- a/vm.c
+++ b/vm.c
@@ -2,6 +2,7 @@
 #include <libc.h>
 #include "vm.h"
 #include "ops.h"
+#include "objects.h"
 
 extern int debug;
 
@@ -65,4 +66,87 @@
 {
 	stack = nil; // TODO clean stack
 	runstack(ptr);
+}
+
+int compile = 0;
+
+enum {
+	SHADER,
+	BUFFER,
+};
+
+typedef struct Object Object;
+struct Object {
+	int id;
+	char type;
+	union {
+		Shader s;
+		Buffer b;
+	};
+};
+
+Object objects[256];
+int numobjects = 0;
+
+int
+genshader(void)
+{
+	int id;
+	if (numobjects >= 256) {
+		werrstr("not enough free objects!");
+		return -1;
+	}
+	id = numobjects++;
+	objects[id].id = id;
+	objects[id].type = SHADER;
+	objects[id].s.buffer = nil;
+	objects[id].s.len = -1;
+	return id;
+}
+
+int
+genbuffer(long size)
+{
+	int id;
+	if (numobjects >= 256) {
+		werrstr("not enough free objects!");
+		return -1;
+	}
+	id = numobjects;
+	objects[id].id = id;
+	objects[id].type = BUFFER;
+	objects[id].b.len = size;
+	objects[id].b.buffer = malloc(size);
+	if (!objects[id].b.buffer) {
+		werrstr("cannot allocate memory: %r");
+		return -1;
+	}
+	numobjects++;
+	return id;
+}
+
+int
+getnumobjects()
+{
+	return numobjects;
+}
+
+long
+getbufferlength(int id)
+{
+	if (objects[id].type != BUFFER) {
+		werrstr("invalid object type!");
+		return -1;
+	}
+	return objects[id].b.len;
+}
+
+long
+getshaderlength(int id)
+{
+	if (objects[id].type != SHADER) {
+		werrstr("invalid object type!");
+		return -1;
+	}
+	return objects[id].s.len;
 }
--- a/vm.h
+++ b/vm.h
@@ -1,3 +1,10 @@
 void vmrun(u32int *ptr);
 void runstack(u32int *ptr);
 void retstack(void);
+
+int genshader(void);
+int genbuffer(long size);
+
+int getnumobjects(void);
+long getshaderlength(int id);
+long getbufferlength(int id);