72 lines
1.5 KiB
C++
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);
|
|
}
|