static struct vivante_dri_wait * new_wait_info(ClientPtr client, DrawablePtr draw, enum event_type type) { struct vivante_dri_wait *wait = calloc(1, sizeof *wait); if (wait) { wait->drawable_id = draw->id; wait->client = client; wait->type = type; xorg_list_init(&wait->client_list); xorg_list_init(&wait->drawable_list); if (!add_reslist(wait_drawable_restype, draw->id, &wait->drawable_list) || !add_reslist(wait_client_restype, client_id(client), &wait->client_list)) { xorg_list_del(&wait->client_list); xorg_list_del(&wait->drawable_list); free(wait); wait = NULL; } } return wait; }
static void del_wait_info(struct vivante_dri_wait *wait) { xorg_list_del(&wait->client_list); xorg_list_del(&wait->drawable_list); vivante_dri2_DestroyBuffer(NULL, wait->front); vivante_dri2_DestroyBuffer(NULL, wait->back); free(wait); }
void glamor_fbo_expire(glamor_screen_private *glamor_priv) { struct xorg_list *cache; glamor_pixmap_fbo *fbo_entry, *tmp; int i, j, k; for (i = 0; i < CACHE_FORMAT_COUNT; i++) for (j = 0; j < CACHE_BUCKET_WCOUNT; j++) for (k = 0; k < CACHE_BUCKET_HCOUNT; k++) { cache = &glamor_priv->fbo_cache[i][j][k]; xorg_list_for_each_entry_safe_reverse(fbo_entry, tmp, cache, list) { if (GLAMOR_TICK_AFTER(fbo_entry->expire, glamor_priv->tick)) { break; } glamor_priv->fbo_cache_watermark -= fbo_entry->width * fbo_entry->height; xorg_list_del(&fbo_entry->list); DEBUGF("cache %p fbo %p expired %d current %d \n", cache, fbo_entry, fbo_entry->expire, glamor_priv->tick); glamor_purge_fbo(glamor_priv, fbo_entry); } } }
void armsoc_bo_do_pending_deletions(void) { struct armsoc_bo *bo; xorg_list_for_each_entry(bo, &pending_deletions, entry) armsoc_bo_del(bo); /* set list to empty */ xorg_list_del(&pending_deletions); }
static int vivante_dri2_drawable_gone(void *data, XID id) { struct xorg_list *list = data; while (!xorg_list_is_empty(list)) { struct vivante_dri_wait *wait; wait = xorg_list_first_entry(list, struct vivante_dri_wait, drawable_list); xorg_list_del(&wait->drawable_list); wait->drawable_id = None; } free(list); return Success; }
static int vivante_dri2_client_gone(void *data, XID id) { struct xorg_list *list = data; while (!xorg_list_is_empty(list)) { struct vivante_dri_wait *wait; wait = xorg_list_first_entry(list, struct vivante_dri_wait, client_list); xorg_list_del(&wait->client_list); wait->client = NULL; } free(list); return Success; }
void glamor_fini_pixmap_fbo(ScreenPtr screen) { struct xorg_list *cache; glamor_screen_private *glamor_priv; glamor_pixmap_fbo *fbo_entry, *tmp; int i, j, k; glamor_priv = glamor_get_screen_private(screen); for (i = 0; i < CACHE_FORMAT_COUNT; i++) for (j = 0; j < CACHE_BUCKET_WCOUNT; j++) for (k = 0; k < CACHE_BUCKET_HCOUNT; k++) { cache = &glamor_priv->fbo_cache[i][j][k]; xorg_list_for_each_entry_safe_reverse(fbo_entry, tmp, cache, list) { xorg_list_del(&fbo_entry->list); glamor_purge_fbo(glamor_priv, fbo_entry); } }
static glamor_pixmap_fbo * glamor_pixmap_fbo_cache_get(glamor_screen_private *glamor_priv, int w, int h, GLenum format) { struct xorg_list *cache; glamor_pixmap_fbo *fbo_entry, *ret_fbo = NULL; int n_format; #ifdef NO_FBO_CACHE return NULL; #else n_format = cache_format(format); if (n_format == -1) return NULL; cache = &glamor_priv->fbo_cache[n_format] [cache_wbucket(w)] [cache_hbucket(h)]; xorg_list_for_each_entry(fbo_entry, cache, list) { if (fbo_entry->width == w && fbo_entry->height == h) { DEBUGF("Request w %d h %d format %x \n", w, h, format); DEBUGF("got cache entry %p w %d h %d fbo %d tex %d format %x\n", fbo_entry, fbo_entry->width, fbo_entry->height, fbo_entry->fb, fbo_entry->tex, fbo_entry->format); assert(format == fbo_entry->format); xorg_list_del(&fbo_entry->list); ret_fbo = fbo_entry; break; } } if (ret_fbo) glamor_priv->fbo_cache_watermark -= ret_fbo->width * ret_fbo->height; assert(glamor_priv->fbo_cache_watermark >= 0); return ret_fbo; #endif }