diff options
Diffstat (limited to 'src/mesa/drivers/dri/i965/intel_resolve_map.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_resolve_map.c | 60 |
1 files changed, 22 insertions, 38 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_resolve_map.c b/src/mesa/drivers/dri/i965/intel_resolve_map.c index 04b5c94..a37afa6 100644 --- a/src/mesa/drivers/dri/i965/intel_resolve_map.c +++ b/src/mesa/drivers/dri/i965/intel_resolve_map.c @@ -33,50 +33,42 @@ * changed to the given value of \c need. */ void -intel_resolve_map_set(struct intel_resolve_map *head, +intel_resolve_map_set(struct exec_list *resolve_map, uint32_t level, uint32_t layer, enum gen6_hiz_op need) { - struct intel_resolve_map **tail = &head->next; - struct intel_resolve_map *prev = head; - - while (*tail) { - if ((*tail)->level == level && (*tail)->layer == layer) { - (*tail)->need = need; + foreach_list_typed(struct intel_resolve_map, map, link, resolve_map) { + if (map->level == level && map->layer == layer) { + map->need = need; return; } - prev = *tail; - tail = &(*tail)->next; } - *tail = malloc(sizeof(**tail)); - (*tail)->prev = prev; - (*tail)->next = NULL; - (*tail)->level = level; - (*tail)->layer = layer; - (*tail)->need = need; + struct intel_resolve_map *m = malloc(sizeof(struct intel_resolve_map)); + exec_node_init(&m->link); + m->level = level; + m->layer = layer; + m->need = need; + + exec_list_push_tail(resolve_map, &m->link); } /** * \brief Get an element from the map. * \return null if element is not contained in map. */ -struct intel_resolve_map* -intel_resolve_map_get(struct intel_resolve_map *head, +struct intel_resolve_map * +intel_resolve_map_get(struct exec_list *resolve_map, uint32_t level, uint32_t layer) { - struct intel_resolve_map *item = head->next; - - while (item) { - if (item->level == level && item->layer == layer) - break; - else - item = item->next; + foreach_list_typed(struct intel_resolve_map, map, link, resolve_map) { + if (map->level == level && map->layer == layer) + return map; } - return item; + return NULL; } /** @@ -85,10 +77,7 @@ intel_resolve_map_get(struct intel_resolve_map *head, void intel_resolve_map_remove(struct intel_resolve_map *elem) { - if (elem->prev) - elem->prev->next = elem->next; - if (elem->next) - elem->next->prev = elem->prev; + exec_node_remove(&elem->link); free(elem); } @@ -96,16 +85,11 @@ intel_resolve_map_remove(struct intel_resolve_map *elem) * \brief Remove and free all elements of the map. */ void -intel_resolve_map_clear(struct intel_resolve_map *head) +intel_resolve_map_clear(struct exec_list *resolve_map) { - struct intel_resolve_map *next = head->next; - struct intel_resolve_map *trash; - - while (next) { - trash = next; - next = next->next; - free(trash); + foreach_list_safe(node, resolve_map) { + free(node); } - head->next = NULL; + exec_list_make_empty(resolve_map); } |