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; }
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; }