/* * 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); }
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); }
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); }
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); }