mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-22 12:50:35 +01:00
st/omx: add headless support
This will allow dec/enc/transcode without X
v2: use env override even with X,
use loader_open_device instead of open
v3: clean up
Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
This commit is contained in:
parent
25526d77b1
commit
519502d08f
1 changed files with 35 additions and 10 deletions
|
|
@ -38,6 +38,7 @@
|
|||
|
||||
#include "os/os_thread.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "loader/loader.h"
|
||||
|
||||
#include "entrypoint.h"
|
||||
#include "vid_dec.h"
|
||||
|
|
@ -47,6 +48,8 @@ pipe_static_mutex(omx_lock);
|
|||
static Display *omx_display = NULL;
|
||||
static struct vl_screen *omx_screen = NULL;
|
||||
static unsigned omx_usecount = 0;
|
||||
static const char *omx_render_node = NULL;
|
||||
static int drm_fd;
|
||||
|
||||
int omx_component_library_Setup(stLoaderComponentType **stComponents)
|
||||
{
|
||||
|
|
@ -73,18 +76,30 @@ struct vl_screen *omx_get_screen(void)
|
|||
pipe_mutex_lock(omx_lock);
|
||||
|
||||
if (!omx_display) {
|
||||
omx_display = XOpenDisplay(NULL);
|
||||
if (!omx_display) {
|
||||
pipe_mutex_unlock(omx_lock);
|
||||
return NULL;
|
||||
omx_render_node = debug_get_option("OMX_RENDER_NODE", NULL);
|
||||
if (!omx_render_node) {
|
||||
omx_display = XOpenDisplay(NULL);
|
||||
if (!omx_display)
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (!omx_screen) {
|
||||
omx_screen = vl_screen_create(omx_display, 0);
|
||||
if (!omx_screen) {
|
||||
pipe_mutex_unlock(omx_lock);
|
||||
return NULL;
|
||||
if (omx_render_node) {
|
||||
drm_fd = loader_open_device(omx_render_node);
|
||||
if (drm_fd < 0)
|
||||
goto error;
|
||||
omx_screen = vl_drm_screen_create(drm_fd);
|
||||
if (!omx_screen) {
|
||||
close(drm_fd);
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
omx_screen = vl_screen_create(omx_display, 0);
|
||||
if (!omx_screen) {
|
||||
XCloseDisplay(omx_display);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -92,14 +107,24 @@ struct vl_screen *omx_get_screen(void)
|
|||
|
||||
pipe_mutex_unlock(omx_lock);
|
||||
return omx_screen;
|
||||
|
||||
error:
|
||||
pipe_mutex_unlock(omx_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void omx_put_screen(void)
|
||||
{
|
||||
pipe_mutex_lock(omx_lock);
|
||||
if ((--omx_usecount) == 0) {
|
||||
vl_screen_destroy(omx_screen);
|
||||
XCloseDisplay(omx_display);
|
||||
if (!omx_render_node) {
|
||||
vl_screen_destroy(omx_screen);
|
||||
if (omx_display)
|
||||
XCloseDisplay(omx_display);
|
||||
} else {
|
||||
close(drm_fd);
|
||||
vl_drm_screen_destroy(omx_screen);
|
||||
}
|
||||
omx_screen = NULL;
|
||||
omx_display = NULL;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue