void vlDestroyHTAB(void) { #ifdef VL_HANDLES pipe_mutex_lock(htab_lock); if (htab && !handle_table_get_first_handle(htab)) { handle_table_destroy(htab); htab = NULL; } pipe_mutex_unlock(htab_lock); #endif }
void stw_cleanup(void) { DHGLRC dhglrc; debug_printf("%s\n", __FUNCTION__); if (!stw_dev) return; /* * Abort cleanup if there are still active contexts. In some situations * this DLL may be unloaded before the DLL that is using GL contexts is. */ stw_lock_contexts(stw_dev); dhglrc = handle_table_get_first_handle(stw_dev->ctx_table); stw_unlock_contexts(stw_dev); if (dhglrc) { debug_printf("%s: contexts still active -- cleanup aborted\n", __FUNCTION__); stw_dev = NULL; return; } handle_table_destroy(stw_dev->ctx_table); stw_framebuffer_cleanup(); DeleteCriticalSection(&stw_dev->fb_mutex); DeleteCriticalSection(&stw_dev->ctx_mutex); if (stw_dev->smapi->destroy) stw_dev->smapi->destroy(stw_dev->smapi); FREE(stw_dev->smapi); stw_dev->stapi->destroy(stw_dev->stapi); stw_dev->screen->destroy(stw_dev->screen); /* glapi is statically linked: we can call the local destroy function. */ #ifdef _GLAPI_NO_EXPORTS _glapi_destroy_multithread(); #endif #ifdef DEBUG debug_memory_end(stw_dev->memdbg_no); #endif stw_tls_cleanup(); stw_dev = NULL; }
VAStatus vlVaTerminate(VADriverContextP ctx) { vlVaDriver *drv; if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; drv = ctx->pDriverData; vl_compositor_cleanup_state(&drv->cstate); vl_compositor_cleanup(&drv->compositor); drv->pipe->destroy(drv->pipe); drv->vscreen->destroy(drv->vscreen); handle_table_destroy(drv->htab); FREE(drv); return VA_STATUS_SUCCESS; }
void stw_cleanup(void) { unsigned i; debug_printf("%s\n", __FUNCTION__); if (!stw_dev) return; pipe_mutex_lock( stw_dev->ctx_mutex ); { /* Ensure all contexts are destroyed */ i = handle_table_get_first_handle(stw_dev->ctx_table); while (i) { stw_delete_context(i); i = handle_table_get_next_handle(stw_dev->ctx_table, i); } handle_table_destroy(stw_dev->ctx_table); } pipe_mutex_unlock( stw_dev->ctx_mutex ); stw_framebuffer_cleanup(); pipe_mutex_destroy( stw_dev->fb_mutex ); pipe_mutex_destroy( stw_dev->ctx_mutex ); stw_dev->screen->destroy(stw_dev->screen); #ifdef WIN32_THREADS _glthread_DESTROY_MUTEX(OneTimeLock); FreeAllTSD(); #endif #ifdef DEBUG debug_memory_end(stw_dev->memdbg_no); #endif stw_tls_cleanup(); stw_dev = NULL; }
PUBLIC VAStatus VA_DRIVER_INIT_FUNC(VADriverContextP ctx) { vlVaDriver *drv; struct drm_state *drm_info; if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; drv = CALLOC(1, sizeof(vlVaDriver)); if (!drv) return VA_STATUS_ERROR_ALLOCATION_FAILED; switch (ctx->display_type) { case VA_DISPLAY_ANDROID: FREE(drv); return VA_STATUS_ERROR_UNIMPLEMENTED; case VA_DISPLAY_GLX: case VA_DISPLAY_X11: #if defined(HAVE_DRI3) drv->vscreen = vl_dri3_screen_create(ctx->native_dpy, ctx->x11_screen); #endif if (!drv->vscreen) drv->vscreen = vl_dri2_screen_create(ctx->native_dpy, ctx->x11_screen); if (!drv->vscreen) goto error_screen; break; case VA_DISPLAY_WAYLAND: case VA_DISPLAY_DRM: case VA_DISPLAY_DRM_RENDERNODES: { drm_info = (struct drm_state *) ctx->drm_state; if (!drm_info || drm_info->fd < 0) { FREE(drv); return VA_STATUS_ERROR_INVALID_PARAMETER; } drv->vscreen = vl_drm_screen_create(drm_info->fd); if (!drv->vscreen) goto error_screen; } break; default: FREE(drv); return VA_STATUS_ERROR_INVALID_DISPLAY; } drv->pipe = drv->vscreen->pscreen->context_create(drv->vscreen->pscreen, drv->vscreen, 0); if (!drv->pipe) goto error_pipe; drv->htab = handle_table_create(); if (!drv->htab) goto error_htab; if (!vl_compositor_init(&drv->compositor, drv->pipe)) goto error_compositor; if (!vl_compositor_init_state(&drv->cstate, drv->pipe)) goto error_compositor_state; vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_BT_601, NULL, true, &drv->csc); if (!vl_compositor_set_csc_matrix(&drv->cstate, (const vl_csc_matrix *)&drv->csc, 1.0f, 0.0f)) goto error_csc_matrix; pipe_mutex_init(drv->mutex); ctx->pDriverData = (void *)drv; ctx->version_major = 0; ctx->version_minor = 1; *ctx->vtable = vtable; *ctx->vtable_vpp = vtable_vpp; ctx->max_profiles = PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH - PIPE_VIDEO_PROFILE_UNKNOWN; ctx->max_entrypoints = 1; ctx->max_attributes = 1; ctx->max_image_formats = VL_VA_MAX_IMAGE_FORMATS; ctx->max_subpic_formats = 1; ctx->max_display_attributes = 1; ctx->str_vendor = "mesa gallium vaapi"; return VA_STATUS_SUCCESS; error_csc_matrix: vl_compositor_cleanup_state(&drv->cstate); error_compositor_state: vl_compositor_cleanup(&drv->compositor); error_compositor: handle_table_destroy(drv->htab); error_htab: drv->pipe->destroy(drv->pipe); error_pipe: drv->vscreen->destroy(drv->vscreen); error_screen: FREE(drv); return VA_STATUS_ERROR_ALLOCATION_FAILED; }