Beispiel #1
0
static GFX_Task _gfx_thread_pool_pop(

		GFX_Pool* pool)
{
	GFX_Task* et = pool->tasks.begin;
	GFX_Task ret = *et;

	/* Override root and remove element */
	size_t size = gfx_vector_get_size(&pool->tasks) - 1;

	*et = *(GFX_Task*)gfx_vector_at(&pool->tasks, size);
	gfx_vector_erase_at(&pool->tasks, size);

	/* Heapify the root */
	size_t elem = 0;

	while(1)
	{
		GFX_Task* bt = et;
		size_t b = elem;

		/* Get child with largest priority */
		size_t l = (elem << 1) + 1;
		size_t r = (elem << 1) + 2;

		GFX_Task* lt = gfx_vector_at(&pool->tasks, l);
		GFX_Task* rt = gfx_vector_at(&pool->tasks, r);

		if(l < size && lt->priority < bt->priority)
			bt = lt, b = l;
		if(r < size && rt->priority < bt->priority)
			bt = rt, b = r;

		if(b == elem)
			break;

		/* Swap */
		GFX_Task temp = *bt;
		*bt = *et;
		*et = temp;

		elem = b;
		et = bt;
	}

	return ret;
}
Beispiel #2
0
static int _gfx_lod_map_remove_at(

		GFX_LodMap*        map,
		GFXVectorIterator  level,
		unsigned int       index)
{
	/* Get boundaries */
	unsigned int begin;
	unsigned int end;
	_gfx_lod_map_get_boundaries(
		map,
		level,
		&begin,
		&end
	);

	unsigned int size = end - begin;
	if(index >= size) return 0;

	/* Erase the data */
	gfx_vector_erase_at(&map->data, begin + index);
	if(size == 1)
	{
		level = gfx_vector_erase(&map->levels, level);
		--map->map.levels;
	}

	/* Decrease upper bounds */
	while(level != map->levels.end)
	{
		--(*(unsigned int*)level);
		level = gfx_vector_next(&map->levels, level);
	}

	return 1;
}