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);
}
Exemple #3
0
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;
}
Exemple #7
0
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);
                }
            }
Exemple #8
0
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
}