webgpu-app/memory.cpp

72 lines
1.5 KiB
C++

#include <stddef.h>
#include "directxmath/directxmath.h"
//size_t __builtin_wasm_memory_grow(int, size_t);
//size_t __builtin_wasm_memory_size(int);
extern char __heap_base[];
extern char __heap_end[];
static size_t heap_pages = 0;
static size_t alloc_index = 0;
extern "C" {
size_t mem_size();
size_t mem_alloc(size_t length);
size_t node_alloc(int count);
void node_init_translation(size_t handle, int index, float x, float y, float z);
};
static inline size_t memory_heap_base()
{
return (size_t)&__heap_base[0];
}
static inline size_t align(size_t n, size_t m)
{
return (n + (m - 1)) & (~(m - 1));
}
static inline void memory_grow(size_t npages)
{
__builtin_wasm_memory_grow(0, npages);
}
size_t mem_size()
{
return __builtin_wasm_memory_size(0);
}
size_t mem_alloc(size_t length)
{
size_t base = memory_heap_base();
size_t heap_end = (heap_pages << 16);
size_t address = alloc_index;
alloc_index += align(length, 16);
if (heap_end < alloc_index) {
size_t npages = align(alloc_index - heap_end, 65536) >> 16;
memory_grow(npages);
heap_pages += npages;
}
return base + address;
}
size_t node_alloc(int count)
{
return mem_alloc((sizeof (XMFLOAT4X4)) * count);
}
void node_init_translation(size_t handle, int index, float x, float y, float z)
{
XMFLOAT4X4 * nodes = reinterpret_cast<XMFLOAT4X4 *>(handle);
//XMMATRIX XMLoadFloat4x4(&nodes[index]);
XMMATRIX mat = XMMatrixTranslation(x, y, z);
XMStoreFloat4x4(&nodes[index], mat);
}