use named semaphore for update lock for drm engine

This commit is contained in:
Vincent Wei
2021-05-05 19:35:18 +08:00
parent 736193d355
commit ccbccc2020
3 changed files with 32 additions and 19 deletions

View File

@@ -59,10 +59,6 @@
#include <sys/time.h>
#include <sys/termios.h>
#ifdef _MGSCHEMA_SHAREDFB
#include <semaphore.h>
#endif
#include "constants.h"
enum {
@@ -112,9 +108,6 @@ typedef struct tagG_RES {
char video_exdriver [LEN_EXDRIVER_NAME + 1];
Uint32 video_drm_format;
Uint32 video_dbl_buff:1;
#ifdef _MGSCHEMA_SHAREDFB
sem_t video_update_lock; /* the semaphore used for sync update */
#endif
#endif
int nr_layers;
@@ -191,9 +184,6 @@ typedef G_RES* PG_RES;
#define SHAREDRES_VIDEO_EXDRIVER (((PG_RES)mgSharedRes)->video_exdriver)
#define SHAREDRES_VIDEO_DRM_FORMAT (((PG_RES)mgSharedRes)->video_drm_format)
#define SHAREDRES_VIDEO_DBL_BUFF (((PG_RES)mgSharedRes)->video_dbl_buff)
#ifdef _MGSCHEMA_SHAREDFB
#define SHAREDRES_VIDEO_UPDATE_LOCK (&((PG_RES)mgSharedRes)->video_update_lock)
#endif
#endif
#define SHAREDRES_TIMER_COUNTER (((PG_RES)mgSharedRes)->timer_counter)

View File

@@ -1251,8 +1251,11 @@ static GAL_VideoDevice *DRM_CreateDevice(int devindex)
#ifdef _MGSCHEMA_SHAREDFB
if (device->hidden->dbl_buff) {
if (sem_init (SHAREDRES_VIDEO_UPDATE_LOCK, 1, 0)) {
_WRN_PRINTF ("Failed to create update lock\n");
sem_unlink (SEM_UPDATE_LOCK);
device->hidden->update_lock = sem_open (SEM_UPDATE_LOCK,
O_CREAT | O_RDWR | O_EXCL, 0666, 1);
if (device->hidden->update_lock == NULL) {
_WRN_PRINTF ("Failed to create update lock: %s\n", strerror (errno));
device->hidden->dbl_buff = 0;
}
}
@@ -1261,6 +1264,15 @@ static GAL_VideoDevice *DRM_CreateDevice(int devindex)
#ifdef _MGRM_PROCESSES
else {
device->hidden->dbl_buff = SHAREDRES_VIDEO_DBL_BUFF;
#ifdef _MGSCHEMA_SHAREDFB
if (device->hidden->dbl_buff) {
device->hidden->update_lock = sem_open (SEM_UPDATE_LOCK, O_RDWR);
if (device->hidden->update_lock == NULL) {
_WRN_PRINTF ("Failed to open update lock: %s\n", strerror (errno));
return NULL;
}
}
#endif
}
#endif /* defined _MGRM_PROCESSES */
@@ -1661,8 +1673,9 @@ static void DRM_VideoQuit(_THIS)
#if defined (_MGRM_PROCESSES) && defined (_MGSCHEMA_SHAREDFB)
if (mgIsServer && this->hidden->dbl_buff) {
if (sem_destroy (SHAREDRES_VIDEO_UPDATE_LOCK)) {
_ERR_PRINTF ("Failed to destroy the update lock\n");
if (sem_unlink (SEM_UPDATE_LOCK)) {
_ERR_PRINTF ("Failed to unlink the update lock semaphore: %s\n",
strerror (errno));
}
}
#endif
@@ -3220,7 +3233,7 @@ static void DRM_UpdateRects (_THIS, int numrects, GAL_Rect *rects)
#if IS_SHAREDFB_SCHEMA_PROCS
if (this->hidden->dbl_buff) {
sem_wait (SHAREDRES_VIDEO_UPDATE_LOCK);
sem_wait (this->hidden->update_lock);
}
GAL_ShadowSurfaceHeader* hdr;
@@ -3257,7 +3270,7 @@ static void DRM_UpdateRects (_THIS, int numrects, GAL_Rect *rects)
#if IS_SHAREDFB_SCHEMA_PROCS
if (this->hidden->dbl_buff) {
sem_post (SHAREDRES_VIDEO_UPDATE_LOCK);
sem_post (this->hidden->update_lock);
}
#endif
}
@@ -3270,7 +3283,7 @@ static BOOL DRM_SyncUpdate (_THIS)
#if IS_SHAREDFB_SCHEMA_PROCS
if (this->hidden->dbl_buff) {
sem_wait (SHAREDRES_VIDEO_UPDATE_LOCK);
sem_wait (this->hidden->update_lock);
}
GAL_ShadowSurfaceHeader* hdr;
@@ -3379,7 +3392,7 @@ static BOOL DRM_SyncUpdate (_THIS)
ret:
#if IS_SHAREDFB_SCHEMA_PROCS
if (this->hidden->dbl_buff) {
sem_post (SHAREDRES_VIDEO_UPDATE_LOCK);
sem_post (this->hidden->update_lock);
}
#endif

View File

@@ -50,6 +50,14 @@
#include "sysvideo.h"
#if IS_SHAREDFB_SCHEMA_PROCS
#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
#define SEM_UPDATE_LOCK "mginit-drm-update"
#endif
/* Hidden "this" pointer for the video functions */
#define _THIS GAL_VideoDevice *this
@@ -86,7 +94,9 @@ typedef struct GAL_PrivateVideoData {
uint32_t real_name, shadow_name;
#endif /* not defined _MGSCHEMA_COMPOSITING */
#if !IS_SHAREDFB_SCHEMA_PROCS
#if IS_SHAREDFB_SCHEMA_PROCS
sem_t *update_lock;
#else
RECT dirty_rc;
#endif