orca/src/runtime_memory.c

152 lines
4.2 KiB
C
Raw Normal View History

2023-09-07 12:51:48 +00:00
/*************************************************************************
*
2023-09-07 12:51:48 +00:00
* Orca
* Copyright 2023 Martin Fouilleul and the Orca project contributors
* See LICENSE.txt for licensing information
*
2023-09-07 12:51:48 +00:00
**************************************************************************/
2023-08-19 12:49:23 +00:00
#include "runtime.h"
#include "runtime_memory.h"
void* oc_wasm_memory_resize_callback(void* p, unsigned long size, void* userData)
{
oc_wasm_memory* memory = (oc_wasm_memory*)userData;
2023-08-19 12:49:23 +00:00
if(memory->committed >= size)
{
return (memory->ptr);
}
else if(memory->committed < memory->reserved)
{
u32 commitSize = size - memory->committed;
2023-08-19 12:49:23 +00:00
oc_base_allocator* allocator = oc_base_allocator_default();
oc_base_commit(allocator, memory->ptr + memory->committed, commitSize);
memory->committed += commitSize;
return (memory->ptr);
}
else
{
OC_ABORT("Out of memory");
return (0);
}
}
void oc_wasm_memory_free_callback(void* p, void* userData)
{
oc_wasm_memory* memory = (oc_wasm_memory*)userData;
2023-08-19 12:49:23 +00:00
oc_base_allocator* allocator = oc_base_allocator_default();
oc_base_release(allocator, memory->ptr, memory->reserved);
memset(memory, 0, sizeof(oc_wasm_memory));
}
extern u32 oc_mem_grow(u64 size)
{
oc_wasm_env* env = oc_runtime_get_env();
oc_wasm_memory* memory = &env->wasmMemory;
2023-08-19 12:49:23 +00:00
size = oc_align_up_pow2(size, d_m3MemPageSize);
u64 totalSize = size + m3_GetMemorySize(env->m3Runtime);
2023-08-19 12:49:23 +00:00
u32 addr = memory->committed;
2023-08-19 12:49:23 +00:00
//NOTE: call resize memory, which will call our custom resize callback... this is a bit involved because
// wasm3 doesn't allow resizing the memory directly
M3Result res = ResizeMemory(env->m3Runtime, totalSize / d_m3MemPageSize);
2023-08-19 12:49:23 +00:00
return (addr);
}
2023-07-14 04:38:32 +00:00
void* oc_wasm_address_to_ptr(oc_wasm_addr addr, oc_wasm_size size)
2023-07-14 04:38:32 +00:00
{
oc_str8 mem = oc_runtime_get_wasm_memory();
OC_ASSERT(addr + size < mem.len, "Object overflows wasm memory");
void* ptr = (addr == 0) ? 0 : mem.ptr + addr;
return (ptr);
}
oc_wasm_addr oc_wasm_address_from_ptr(void* ptr, oc_wasm_size size)
{
oc_wasm_addr addr = 0;
if(ptr != 0)
{
oc_str8 mem = oc_runtime_get_wasm_memory();
OC_ASSERT((char*)ptr > mem.ptr && (((char*)ptr - mem.ptr) + size < mem.len), "Object overflows wasm memory");
addr = (char*)ptr - mem.ptr;
}
return (addr);
}
//------------------------------------------------------------------------------------
// oc_wasm_list helpers
//------------------------------------------------------------------------------------
void oc_wasm_list_push(oc_wasm_list* list, oc_wasm_list_elt* elt)
{
elt->next = list->first;
elt->prev = 0;
oc_wasm_addr eltAddr = oc_wasm_address_from_ptr(elt, sizeof(oc_wasm_list_elt));
if(list->first)
{
oc_wasm_list_elt* first = oc_wasm_address_to_ptr(list->first, sizeof(oc_wasm_list_elt));
first->prev = eltAddr;
}
else
{
list->last = eltAddr;
}
list->first = eltAddr;
}
void oc_wasm_list_push_back(oc_wasm_list* list, oc_wasm_list_elt* elt)
{
elt->prev = list->last;
elt->next = 0;
oc_wasm_addr eltAddr = oc_wasm_address_from_ptr(elt, sizeof(oc_wasm_list_elt));
if(list->last)
{
oc_wasm_list_elt* last = oc_wasm_address_to_ptr(list->last, sizeof(oc_wasm_list_elt));
last->next = eltAddr;
}
else
{
list->first = eltAddr;
}
list->last = eltAddr;
}
//------------------------------------------------------------------------------------
// Wasm arenas helpers
//------------------------------------------------------------------------------------
2023-09-11 08:59:23 +00:00
oc_wasm_addr oc_wasm_arena_push(oc_wasm_addr arena, u64 size)
{
oc_wasm_env* env = oc_runtime_get_env();
oc_wasm_addr retValues[1] = { 0 };
const void* retPointers[1] = { (void*)&retValues[0] };
const void* args[2] = { &arena, &size };
M3Result res = m3_Call(env->exports[OC_EXPORT_ARENA_PUSH], 2, args);
if(res)
{
ORCA_WASM3_ABORT(env->m3Runtime, res, "Runtime error");
}
res = m3_GetResults(env->exports[OC_EXPORT_ARENA_PUSH], 1, retPointers);
if(res)
{
ORCA_WASM3_ABORT(env->m3Runtime, res, "Runtime error");
}
2023-09-11 08:59:23 +00:00
return (retValues[0]);
This commit restructures the codebase to melt the milepost platform layer into the main orca codebase. Here's a list of commits squashed in this update: - move angle files to ext/ and pull includes/libs from there when needed - remove milepost/ext/angle_headers - Collapsed milepost/ext into ext - Collapse milepost/scripts into scripts/ - collapse milepost/resources into resources/. WARN: this temporarily breaks milepost's native examples - collapse milepost/test into test/ - renamed test/ to tests/ - build milepost directly into build/bin - remove unused GLES and KHR folders from sdk/ - reorganizing milepost directory tree into app, graphics, platfrom, ui, util - collapse milepost/src to src/ - Move all native examples to sketches/ and remove milepost repo - Moving sketches resources into their own shared folder separate from the runtime's resource folder - Moving all binding code to src/wasmbind - Moving all binding code to src/wasmbind - pong: fix typo in error log - fixing log parameter order - add error logs to mg_image_create_* - Fix build scripts on windows - fixed include mistake after rebase - collapsing milepost.{h|c|m} to orca.{h|c|m} and moving from sdk/ to src/ - rename orca_app.h/main.c to runtime.h/c - collapsed sdk/ to src/ - put old sdk files into their respective dirs - renamed canvas_api.json to surface_api.json - moved all stb headers in ext/stb/ - remove unused OpenSansLatinSubset.ttf font - moving cstdlib to src/wasmlibc and removing some duplicates with src/platform - move libc stdarg and string functions from platform/ to wasmlibc/ - rename wasmlibc to libc-shim to reflect non-completeness - Expose abort/assert variadic functions and macros to orca apps, and forward libc-shim abort/assert to these - move Orca API runtime implementations to runtime_xxx - fix missing math constants when including math.h with msvc in graphics_common.c - Change name of runtime to orca_runtime. When bundling on Windows, change name of runtime executable to the name of the app.
2023-08-09 11:06:32 +00:00
}