mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-24 21:50:15 +01:00
Add proper check for MIT-SHM extension support.
This commit is contained in:
parent
1cc2a117a6
commit
025dade50f
4 changed files with 57 additions and 13 deletions
|
|
@ -1886,13 +1886,13 @@ dmxAttachScreen (int idx,
|
|||
}
|
||||
|
||||
#ifdef MITSHM
|
||||
dmxScreen->beShm = FALSE;
|
||||
|
||||
XLIB_PROLOGUE (dmxScreen);
|
||||
dmxScreen->beShm = XShmQueryExtension (dmxScreen->beDisplay);
|
||||
dmxScreen->beShm = dmxShmInit (pScreen);
|
||||
if (dmxScreen->beShm)
|
||||
dmxScreen->beShmEventBase = XShmGetEventBase (dmxScreen->beDisplay);
|
||||
XLIB_EPILOGUE (dmxScreen);
|
||||
{
|
||||
dmxScreen->beShmEventBase =
|
||||
XShmGetEventBase (dmxScreen->beDisplay);
|
||||
dmxLogOutput (dmxScreen, "Using MIT-SHM extension\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef RANDR
|
||||
|
|
|
|||
|
|
@ -1045,14 +1045,12 @@ Bool dmxScreenInit(int idx, ScreenPtr pScreen, int argc, char *argv[])
|
|||
|
||||
#ifdef MITSHM
|
||||
ShmRegisterDmxFuncs (pScreen);
|
||||
if (dmxScreen->beDisplay)
|
||||
dmxScreen->beShm = dmxShmInit (pScreen);
|
||||
if (dmxScreen->beShm)
|
||||
{
|
||||
XLIB_PROLOGUE (dmxScreen);
|
||||
dmxScreen->beShm = XShmQueryExtension (dmxScreen->beDisplay);
|
||||
if (dmxScreen->beShm)
|
||||
dmxScreen->beShmEventBase =
|
||||
XShmGetEventBase (dmxScreen->beDisplay);
|
||||
XLIB_EPILOGUE (dmxScreen);
|
||||
dmxScreen->beShmEventBase =
|
||||
XShmGetEventBase (dmxScreen->beDisplay);
|
||||
dmxLogOutput (dmxScreen, "Using MIT-SHM extension\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -604,6 +604,50 @@ dmxProcShmPutImage (ClientPtr client)
|
|||
return (client->noClientException);
|
||||
}
|
||||
|
||||
Bool
|
||||
dmxShmInit (ScreenPtr pScreen)
|
||||
{
|
||||
DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
|
||||
xcb_generic_error_t *error;
|
||||
xcb_shm_seg_t shmseg;
|
||||
uint32_t shmid;
|
||||
char *shmaddr;
|
||||
|
||||
if (!dmxScreen->beDisplay)
|
||||
return FALSE;
|
||||
|
||||
shmid = shmget (IPC_PRIVATE, 32, IPC_CREAT | 0600);
|
||||
if (shmid == -1)
|
||||
return FALSE;
|
||||
|
||||
shmaddr = shmat (shmid, NULL, 0);
|
||||
if (shmaddr == (char *) -1)
|
||||
{
|
||||
shmctl (shmid, IPC_RMID, NULL);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
shmseg = xcb_generate_id (dmxScreen->connection);
|
||||
error = xcb_request_check (dmxScreen->connection,
|
||||
xcb_shm_attach_checked (dmxScreen->connection,
|
||||
shmseg,
|
||||
shmid,
|
||||
FALSE));
|
||||
if (error)
|
||||
{
|
||||
free (error);
|
||||
shmdt (shmaddr);
|
||||
shmctl (shmid, IPC_RMID, NULL);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xcb_shm_detach (dmxScreen->connection, shmseg);
|
||||
shmdt (shmaddr);
|
||||
shmctl (shmid, IPC_RMID, NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void dmxInitShm (void)
|
||||
{
|
||||
int i;
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@ extern void dmxBEDetachShmSeg (DMXScreenInfo *dmxScreen,
|
|||
extern Bool dmxScreenEventCheckShm (ScreenPtr pScreen,
|
||||
xcb_generic_event_t *event);
|
||||
|
||||
extern Bool dmxShmInit (ScreenPtr pScreen);
|
||||
|
||||
extern void dmxInitShm (void);
|
||||
extern void dmxResetShm (void);
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue