Add proper check for MIT-SHM extension support.

This commit is contained in:
David Reveman 2008-08-05 05:42:41 -04:00
parent 1cc2a117a6
commit 025dade50f
4 changed files with 57 additions and 13 deletions

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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