Commit 5fb326b4 authored by Austin Yuan's avatar Austin Yuan

va-android: same as X11, also always create a new VA display on android

Previously a VA display will be shared if a native display is shared by multiple threads,
it will casue some thread safety issue in a multi-threaded program.

Remove the global VADisplayContextP pDisplayContexts which is not thread safe
Signed-off-by: default avatarAustin Yuan <shengquan.yuan@gmail.com>
parent 3c1b6875
...@@ -45,8 +45,6 @@ ...@@ -45,8 +45,6 @@
#define CHECK_SYMBOL(func) { if (!func) printf("func %s not found\n", #func); return VA_STATUS_ERROR_UNKNOWN; } #define CHECK_SYMBOL(func) { if (!func) printf("func %s not found\n", #func); return VA_STATUS_ERROR_UNKNOWN; }
#define DEVICE_NAME "/dev/card0" #define DEVICE_NAME "/dev/card0"
static VADisplayContextP pDisplayContexts = NULL;
static int open_device (char *dev_name) static int open_device (char *dev_name)
{ {
struct stat st; struct stat st;
...@@ -81,34 +79,23 @@ static int va_DisplayContextIsValid ( ...@@ -81,34 +79,23 @@ static int va_DisplayContextIsValid (
VADisplayContextP pDisplayContext VADisplayContextP pDisplayContext
) )
{ {
VADisplayContextP ctx = pDisplayContexts; return (pDisplayContext != NULL &&
pDisplayContext->pDriverContext != NULL);
while (ctx)
{
if (ctx == pDisplayContext && pDisplayContext->pDriverContext)
return 1;
ctx = ctx->pNext;
}
return 0;
} }
static void va_DisplayContextDestroy ( static void va_DisplayContextDestroy (
VADisplayContextP pDisplayContext VADisplayContextP pDisplayContext
) )
{ {
VADisplayContextP *ctx = &pDisplayContexts; struct dri_state *dri_state;
if (pDisplayContext == NULL)
return;
/* close the open-ed DRM fd */
dri_state = (struct dri_state *)pDisplayContext->pDriverContext->dri_state;
close(dri_state->fd);
/* Throw away pDisplayContext */
while (*ctx)
{
if (*ctx == pDisplayContext)
{
*ctx = pDisplayContext->pNext;
pDisplayContext->pNext = NULL;
break;
}
ctx = &((*ctx)->pNext);
}
free(pDisplayContext->pDriverContext->dri_state); free(pDisplayContext->pDriverContext->dri_state);
free(pDisplayContext->pDriverContext); free(pDisplayContext->pDriverContext);
free(pDisplayContext); free(pDisplayContext);
...@@ -214,23 +201,11 @@ VADisplay vaGetDisplay ( ...@@ -214,23 +201,11 @@ VADisplay vaGetDisplay (
) )
{ {
VADisplay dpy = NULL; VADisplay dpy = NULL;
VADisplayContextP pDisplayContext = pDisplayContexts; VADisplayContextP pDisplayContext;
if (!native_dpy) if (!native_dpy)
return NULL; return NULL;
while (pDisplayContext)
{
if (pDisplayContext->pDriverContext &&
pDisplayContext->pDriverContext->native_dpy == (void *)native_dpy)
{
dpy = (VADisplay)pDisplayContext;
break;
}
pDisplayContext = pDisplayContext->pNext;
}
if (!dpy) if (!dpy)
{ {
/* create new entry */ /* create new entry */
...@@ -244,12 +219,10 @@ VADisplay vaGetDisplay ( ...@@ -244,12 +219,10 @@ VADisplay vaGetDisplay (
pDisplayContext->vadpy_magic = VA_DISPLAY_MAGIC; pDisplayContext->vadpy_magic = VA_DISPLAY_MAGIC;
pDriverContext->native_dpy = (void *)native_dpy; pDriverContext->native_dpy = (void *)native_dpy;
pDisplayContext->pNext = pDisplayContexts;
pDisplayContext->pDriverContext = pDriverContext; pDisplayContext->pDriverContext = pDriverContext;
pDisplayContext->vaIsValid = va_DisplayContextIsValid; pDisplayContext->vaIsValid = va_DisplayContextIsValid;
pDisplayContext->vaDestroy = va_DisplayContextDestroy; pDisplayContext->vaDestroy = va_DisplayContextDestroy;
pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName; pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName;
pDisplayContexts = pDisplayContext;
pDriverContext->dri_state = dri_state; pDriverContext->dri_state = dri_state;
dpy = (VADisplay)pDisplayContext; dpy = (VADisplay)pDisplayContext;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment