Esempio n. 1
0
int
render_buffer_initialize(void) {
	memory_context_push(HASH_RENDER);
	_render_map_buffer = objectmap_allocate(_render_config.buffer_max);
	memory_context_pop();
	return 0;
}
Esempio n. 2
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;
}
Esempio n. 3
0
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;
}