allocator.odin 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. package sokol_helpers
  2. // Use native odin allocators in sokol allocator interface
  3. import sapp "../app"
  4. import sg "../gfx"
  5. import "base:runtime"
  6. import "core:c"
  7. Allocator :: struct {
  8. alloc_fn: proc "c" (size: c.size_t, user_data: rawptr) -> rawptr,
  9. free_fn: proc "c" (ptr: rawptr, user_data: rawptr),
  10. user_data: rawptr,
  11. }
  12. // context_ptr: a pointer to a context which persists during the lifetime of the program.
  13. // Note: you can transmute() this into a logger for any specific sokol library.
  14. allocator :: proc(context_ptr: ^runtime.Context) -> Allocator {
  15. return {
  16. alloc_fn = allocator_alloc_proc,
  17. free_fn = allocator_free_proc,
  18. user_data = cast(rawptr)context_ptr,
  19. }
  20. }
  21. allocator_alloc_proc :: proc "c" (size: c.size_t, user_data: rawptr) -> rawptr {
  22. context = (cast(^runtime.Context)user_data)^
  23. bytes, err := runtime.mem_alloc(size = int(size))
  24. if err != nil {
  25. return nil
  26. }
  27. return raw_data(bytes)
  28. }
  29. allocator_free_proc :: proc "c" (ptr: rawptr, user_data: rawptr) {
  30. context = (cast(^runtime.Context)user_data)^
  31. runtime.mem_free(ptr)
  32. }