diff options
Diffstat (limited to 'bindgen/ocaml/bindings')
-rw-r--r-- | bindgen/ocaml/bindings/bindings_sys.ml | 49 | ||||
-rw-r--r-- | bindgen/ocaml/bindings/caml_bindings.c | 132 | ||||
-rw-r--r-- | bindgen/ocaml/bindings/celeritas.h | 21 | ||||
-rw-r--r-- | bindgen/ocaml/bindings/dune | 13 |
4 files changed, 215 insertions, 0 deletions
diff --git a/bindgen/ocaml/bindings/bindings_sys.ml b/bindgen/ocaml/bindings/bindings_sys.ml new file mode 100644 index 0000000..1c100e9 --- /dev/null +++ b/bindgen/ocaml/bindings/bindings_sys.ml @@ -0,0 +1,49 @@ +(* automatically generated by ocaml-bindgen 0.0.1 *) + +type lifetime = + | Function + (** The value can live for the lifetime of the function call, which upon return will signal that the + value can be dropped (finalizer?) *) + | Ocaml (** The value is managed by the OCaml runtime *) + | C + (** The value is allocated and passed to C which is then in charge of cleaning it up *) + +type 'a cptr = { lifetime : lifetime; addr : nativeint } + +external bindgen_alloc : size:int -> nativeint = "bindgen_alloc" +external bindgen_free : nativeint -> unit = "bindgen_free" +external bindgen_alloc_string : string -> nativeint = "bindgen_alloc_string" + +let sizeof _ = 4 (* TODO: how to handle different types? *) + +let create_ptr (value : 'a) : 'a cptr = + let addr = bindgen_alloc ~size:(sizeof value) in + print_endline ("Addr: " ^ Nativeint.to_string addr); + Gc.finalise bindgen_free addr; + { lifetime = Ocaml; addr } + +let make_cstr (s: string) : char cptr = + let addr = bindgen_alloc_string s in + { lifetime = Ocaml; addr } + +type nonrec core +type nonrec glfwwindow +external get_global_core : unit -> core cptr = "caml_get_global_core" +external core_Bringup : + optional_window:unit cptr -> unit = "caml_core_Bringup" +external frame_Begin : unit -> unit = "caml_frame_Begin" +external frame_Draw : unit -> unit = "caml_frame_Draw" +external frame_End : unit -> unit = "caml_frame_End" +type nonrec vec2 = { + x: float ; + y: float } +type nonrec vec3 = { + x: float ; + y: float ; + z: float } +type nonrec vec4 = { + x: float ; + y: float ; + z: float ; + w: float } +external vec3_add : b:vec3 -> a:vec3 -> vec3 = "caml_vec3_add" diff --git a/bindgen/ocaml/bindings/caml_bindings.c b/bindgen/ocaml/bindings/caml_bindings.c new file mode 100644 index 0000000..4a7dc70 --- /dev/null +++ b/bindgen/ocaml/bindings/caml_bindings.c @@ -0,0 +1,132 @@ +/* automatically generated by ocaml-bindgen 0.0.1 */ + +#include "celeritas.h" +#include <caml/alloc.h> +#include <caml/callback.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/mlvalues.h> +#include <caml/unixsupport.h> +Core* caml_get_global_core() { + CAMLparam0(); + CAMLlocal1(result); + result = get_global_core(); + CAMLreturn(result); +} + +void caml_core_Bringup(value caml_optional_window) { + CAMLparam1(caml_optional_window); + void* optional_window = Nativeint_val(Field(caml_optional_window, 1)); + core_Bringup(optional_window); + CAMLreturn0; +} + +void caml_frame_Begin() { + CAMLparam0(); + frame_Begin(); + CAMLreturn0; +} + +void caml_frame_Draw() { + CAMLparam0(); + frame_Draw(); + CAMLreturn0; +} + +void caml_frame_End() { + CAMLparam0(); + frame_End(); + CAMLreturn0; +} + +Vec2* caml_Vec2_of_value(value caml_x) { + Vec2* x = malloc(sizeof(struct Vec2)); + x->x = Double_val(Field(caml_x, 0)); + x->y = Double_val(Field(caml_x, 1)); + return x; +} + +value caml_Vec2_to_value(struct Vec2* x) { + CAMLparam0(); + CAMLlocal1(caml_x); + caml_x = caml_alloc_tuple(2); + Store_field(caml_x, 0, caml_copy_double(x->x)); + Store_field(caml_x, 1, caml_copy_double(x->y)); + CAMLreturn(caml_x); +} + +Vec3* caml_Vec3_of_value(value caml_x) { + Vec3* x = malloc(sizeof(struct Vec3)); + x->x = Double_val(Field(caml_x, 0)); + x->y = Double_val(Field(caml_x, 1)); + x->z = Double_val(Field(caml_x, 2)); + return x; +} + +value caml_Vec3_to_value(struct Vec3* x) { + CAMLparam0(); + CAMLlocal1(caml_x); + caml_x = caml_alloc_tuple(3); + Store_field(caml_x, 0, caml_copy_double(x->x)); + Store_field(caml_x, 1, caml_copy_double(x->y)); + Store_field(caml_x, 2, caml_copy_double(x->z)); + CAMLreturn(caml_x); +} + +Vec4* caml_Vec4_of_value(value caml_x) { + Vec4* x = malloc(sizeof(struct Vec4)); + x->x = Double_val(Field(caml_x, 0)); + x->y = Double_val(Field(caml_x, 1)); + x->z = Double_val(Field(caml_x, 2)); + x->w = Double_val(Field(caml_x, 3)); + return x; +} + +value caml_Vec4_to_value(struct Vec4* x) { + CAMLparam0(); + CAMLlocal1(caml_x); + caml_x = caml_alloc_tuple(4); + Store_field(caml_x, 0, caml_copy_double(x->x)); + Store_field(caml_x, 1, caml_copy_double(x->y)); + Store_field(caml_x, 2, caml_copy_double(x->z)); + Store_field(caml_x, 3, caml_copy_double(x->w)); + CAMLreturn(caml_x); +} + +Vec3 caml_vec3_add(value caml_a, value caml_b) { + CAMLparam2(caml_a, caml_b); + CAMLlocal1(result); + Vec3 a = caml_Vec3_of_value(caml_a); + Vec3 b = caml_Vec3_of_value(caml_b); + result = vec3_add(a, b); + CAMLreturn(result); +} + + +#include <stdlib.h> +value bindgen_alloc(value caml_size) { + CAMLparam1(caml_size); + + // Convert OCaml integer to C size + size_t size = Int_val(caml_size); + printf("Allocated size %ld \n", size); + + void* ptr = malloc(sizeof(size)); + if (ptr == NULL) { + // TODO: handle allocation failure + CAMLreturn(Val_unit); + } + + // Wrap the pointer as an OCaml value + CAMLreturn(caml_copy_nativeint(ptr)); +} + +void bindgen_free(value caml_addr) { + free(Nativeint_val(caml_addr)); +} + +value bindgen_alloc_string(value caml_string) { + CAMLparam1(caml_string); + char* str = String_val(caml_string); + CAMLreturn(caml_copy_nativeint((intnat)str)); +} diff --git a/bindgen/ocaml/bindings/celeritas.h b/bindgen/ocaml/bindings/celeritas.h new file mode 100644 index 0000000..fce4d62 --- /dev/null +++ b/bindgen/ocaml/bindings/celeritas.h @@ -0,0 +1,21 @@ +/* The Goal of this file is to test ocaml-bindgen on it to start moving development over into OCaml */ + +// #include <stdbool.h> +// #include <stdint.h> + +typedef struct Core Core; +typedef struct GLFWwindow GLFWwindow; + +Core* get_global_core(); +void core_Bringup(void* optional_window); + +void frame_Begin(); +void frame_Draw(); +void frame_End(); + + +struct Vec2 { float x; float y; }; +typedef struct Vec3 { float x; float y; float z; } Vec3; +struct Vec4 { float x; float y; float z; float w; }; + +Vec3 vec3_add(Vec3 a, Vec3 b);
\ No newline at end of file diff --git a/bindgen/ocaml/bindings/dune b/bindgen/ocaml/bindings/dune new file mode 100644 index 0000000..673491d --- /dev/null +++ b/bindgen/ocaml/bindings/dune @@ -0,0 +1,13 @@ +(library + (name bindings) + (libraries bindgen)) + +(rule + (alias gen_bindings) + (deps celeritas.h) + (targets bindings_sys.ml caml_bindings.c) + (action + (run + %{bin:ocaml-bindgen} celeritas.h bindings) + ) + (mode (promote (until-clean))))
\ No newline at end of file |