int render_buffer_initialize(void) { memory_context_push(HASH_RENDER); _render_map_buffer = objectmap_allocate(_render_config.buffer_max); memory_context_pop(); return 0; }
render_context_t* render_context_allocate(size_t commands) { render_context_t* context; FOUNDATION_ASSERT(commands < (radixsort_index_t) - 1); memory_context_push(HASH_RENDER); context = memory_allocate(HASH_RENDER, sizeof(render_context_t), 0, MEMORY_PERSISTENT | MEMORY_ZERO_INITIALIZED); context->allocated = (int32_t)commands; context->commands = memory_allocate(HASH_RENDER, sizeof(render_command_t) * commands, 0, MEMORY_PERSISTENT); context->keys = memory_allocate(HASH_RENDER, sizeof(uint64_t) * commands, 0, MEMORY_PERSISTENT); context->sort = radixsort_allocate(RADIXSORT_UINT64, (radixsort_index_t)commands); memory_context_pop(); return context; }
object_t render_vertexbuffer_create(render_backend_t* backend, render_usage_t usage, size_t vertices, const render_vertex_decl_t* decl, const void* data) { object_t id = objectmap_reserve(_render_map_buffer); if (!id) { log_error(HASH_RENDER, ERROR_OUT_OF_MEMORY, STRING_CONST("Unable to allocate vertex buffer, out of slots in object map")); return 0; } memory_context_push(HASH_RENDER); render_vertexbuffer_t* buffer = memory_allocate(HASH_RENDER, sizeof(render_vertexbuffer_t), 0, MEMORY_PERSISTENT | MEMORY_ZERO_INITIALIZED); buffer->id = id; buffer->backend = backend; buffer->usage = usage; buffer->buffertype = RENDERBUFFER_VERTEX; buffer->policy = RENDERBUFFER_UPLOAD_ONDISPATCH; buffer->size = decl->size; memcpy(&buffer->decl, decl, sizeof(render_vertex_decl_t)); atomic_store32(&buffer->ref, 1); objectmap_set(_render_map_buffer, id, buffer); if (vertices) { buffer->allocated = vertices; buffer->used = vertices; buffer->store = backend->vtable.allocate_buffer(backend, (render_buffer_t*)buffer); if (data) { memcpy(buffer->store, data, vertices * buffer->size); buffer->flags |= RENDERBUFFER_DIRTY; } } memory_context_pop(); return id; }