Ejemplo n.º 1
0
/*
 * pipe_screen
 */
static void si_destroy_screen(struct pipe_screen* pscreen)
{
	struct si_screen *sscreen = (struct si_screen *)pscreen;
	struct si_shader_part *parts[] = {
		sscreen->vs_prologs,
		sscreen->tcs_epilogs,
		sscreen->gs_prologs,
		sscreen->ps_prologs,
		sscreen->ps_epilogs
	};
	unsigned i;

	if (!sscreen->ws->unref(sscreen->ws))
		return;

	mtx_destroy(&sscreen->aux_context_lock);

	struct u_log_context *aux_log = ((struct si_context *)sscreen->aux_context)->log;
	if (aux_log) {
		sscreen->aux_context->set_log_context(sscreen->aux_context, NULL);
		u_log_context_destroy(aux_log);
		FREE(aux_log);
	}

	sscreen->aux_context->destroy(sscreen->aux_context);

	util_queue_destroy(&sscreen->shader_compiler_queue);
	util_queue_destroy(&sscreen->shader_compiler_queue_low_priority);

	for (i = 0; i < ARRAY_SIZE(sscreen->compiler); i++)
		si_destroy_compiler(&sscreen->compiler[i]);

	for (i = 0; i < ARRAY_SIZE(sscreen->compiler_lowp); i++)
		si_destroy_compiler(&sscreen->compiler_lowp[i]);

	/* Free shader parts. */
	for (i = 0; i < ARRAY_SIZE(parts); i++) {
		while (parts[i]) {
			struct si_shader_part *part = parts[i];

			parts[i] = part->next;
			ac_shader_binary_clean(&part->binary);
			FREE(part);
		}
	}
	mtx_destroy(&sscreen->shader_parts_mutex);
	si_destroy_shader_cache(sscreen);

	si_destroy_perfcounters(sscreen);
	si_gpu_load_kill_thread(sscreen);

	mtx_destroy(&sscreen->gpu_load_mutex);

	slab_destroy_parent(&sscreen->pool_transfers);

	disk_cache_destroy(sscreen->disk_shader_cache);
	sscreen->ws->destroy(sscreen->ws);
	FREE(sscreen);
}
Ejemplo n.º 2
0
static void
virgl_destroy_screen(struct pipe_screen *screen)
{
   struct virgl_screen *vscreen = virgl_screen(screen);
   struct virgl_winsys *vws = vscreen->vws;

   slab_destroy_parent(&vscreen->texture_transfer_pool);

   if (vws)
      vws->destroy(vws);
   FREE(vscreen);
}
Ejemplo n.º 3
0
static void r300_destroy_screen(struct pipe_screen* pscreen)
{
    struct r300_screen* r300screen = r300_screen(pscreen);
    struct radeon_winsys *rws = radeon_winsys(pscreen);

    if (rws && !rws->unref(rws))
      return;

    pipe_mutex_destroy(r300screen->cmask_mutex);
    slab_destroy_parent(&r300screen->pool_transfers);

    if (rws)
      rws->destroy(rws);

    FREE(r300screen);
}
Ejemplo n.º 4
0
static void
fd_screen_destroy(struct pipe_screen *pscreen)
{
	struct fd_screen *screen = fd_screen(pscreen);

	if (screen->pipe)
		fd_pipe_del(screen->pipe);

	if (screen->dev)
		fd_device_del(screen->dev);

	fd_bc_fini(&screen->batch_cache);

	slab_destroy_parent(&screen->transfer_pool);

	mtx_destroy(&screen->lock);

	ralloc_free(screen->compiler);

	free(screen);
}