Skip to content

Commit 5ae81d1

Browse files
committed
hw/nxagent: Backport latest devPrivates ABI from X.org.
1 parent 56e01e8 commit 5ae81d1

File tree

32 files changed

+368
-441
lines changed

32 files changed

+368
-441
lines changed

nx-X11/programs/Xserver/Xext/shm.c

Lines changed: 102 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ in this Software without prior written authorization from The Open Group.
5050
#include "gcstruct.h"
5151
#include "extnsionst.h"
5252
#include "servermd.h"
53+
#include "shmint.h"
5354
#define _XSHM_SERVER_
54-
#include <X11/extensions/shmstr.h>
5555
#include <nx-X11/Xfuncproto.h>
5656

5757
#include "protocol-versions.h"
@@ -61,14 +61,11 @@ in this Software without prior written authorization from The Open Group.
6161
#include "panoramiXsrv.h"
6262
#endif
6363

64-
typedef struct _ShmDesc {
65-
struct _ShmDesc *next;
66-
int shmid;
67-
int refcnt;
68-
char *addr;
69-
Bool writable;
70-
unsigned long size;
71-
} ShmDescRec, *ShmDescPtr;
64+
typedef struct _ShmScrPrivateRec {
65+
CloseScreenProcPtr CloseScreen;
66+
ShmFuncsPtr shmFuncs;
67+
DestroyPixmapProcPtr destroyPixmap;
68+
} ShmScrPrivateRec;
7269

7370
static void miShmPutImage(XSHM_PUT_IMAGE_ARGS);
7471
static void fbShmPutImage(XSHM_PUT_IMAGE_ARGS);
@@ -108,15 +105,16 @@ int BadShmSegCode;
108105
RESTYPE ShmSegType;
109106
static ShmDescPtr Shmsegs;
110107
static Bool sharedPixmaps;
111-
static int pixmapFormat;
112-
static int shmPixFormat[MAXSCREENS];
113-
static ShmFuncsPtr shmFuncs[MAXSCREENS];
114-
static DestroyPixmapProcPtr destroyPixmap[MAXSCREENS];
115-
#ifdef PIXPRIV
116-
static int shmPixmapPrivate;
117-
#endif
118-
static ShmFuncs miFuncs = {NULL, miShmPutImage};
119-
static ShmFuncs fbFuncs = {fbShmCreatePixmap, fbShmPutImage};
108+
static DevPrivateKeyRec shmScrPrivateKeyRec;
109+
110+
#define shmScrPrivateKey (&shmScrPrivateKeyRec)
111+
static DevPrivateKeyRec shmPixmapPrivateKeyRec;
112+
113+
#define shmPixmapPrivateKey (&shmPixmapPrivateKeyRec)
114+
static ShmFuncs miFuncs = { NULL, miShmPutImage };
115+
static ShmFuncs fbFuncs = { fbShmCreatePixmap, fbShmPutImage };
116+
117+
#define ShmGetScreenPriv(s) ((ShmScrPrivateRec *)dixLookupPrivate(&(s)->devPrivates, shmScrPrivateKey))
120118

121119
#define VERIFY_SHMSEG(shmseg,shmdesc,client) \
122120
{ \
@@ -204,42 +202,28 @@ ShmExtensionInit(void)
204202
}
205203
#endif
206204

205+
if (!ShmRegisterPrivates())
206+
return;
207+
207208
sharedPixmaps = xFalse;
208-
pixmapFormat = 0;
209209
{
210-
sharedPixmaps = xTrue;
211-
pixmapFormat = shmPixFormat[0];
212-
for (i = 0; i < screenInfo.numScreens; i++)
213-
{
214-
if (!shmFuncs[i])
215-
shmFuncs[i] = &miFuncs;
216-
if (!shmFuncs[i]->CreatePixmap)
217-
sharedPixmaps = xFalse;
218-
if (shmPixFormat[i] && (shmPixFormat[i] != pixmapFormat))
219-
{
220-
sharedPixmaps = xFalse;
221-
pixmapFormat = 0;
210+
sharedPixmaps = xTrue;
211+
for (i = 0; i < screenInfo.numScreens; i++) {
212+
ShmScrPrivateRec *screen_priv =
213+
ShmInitScreenPriv(screenInfo.screens[i]);
214+
if (!screen_priv->shmFuncs)
215+
screen_priv->shmFuncs = &miFuncs;
216+
if (!screen_priv->shmFuncs->CreatePixmap)
217+
sharedPixmaps = xFalse;
222218
}
223-
}
224-
if (!pixmapFormat)
225-
pixmapFormat = ZPixmap;
226-
if (sharedPixmaps)
227-
{
228-
for (i = 0; i < screenInfo.numScreens; i++)
229-
{
230-
destroyPixmap[i] = screenInfo.screens[i]->DestroyPixmap;
231-
screenInfo.screens[i]->DestroyPixmap = ShmDestroyPixmap;
232-
}
233-
#ifdef PIXPRIV
234-
shmPixmapPrivate = AllocatePixmapPrivateIndex();
235-
for (i = 0; i < screenInfo.numScreens; i++)
236-
{
237-
if (!AllocatePixmapPrivate(screenInfo.screens[i],
238-
shmPixmapPrivate, 0))
239-
return;
240-
}
241-
#endif
242-
}
219+
if (sharedPixmaps)
220+
for (i = 0; i < screenInfo.numScreens; i++) {
221+
ShmScrPrivateRec *screen_priv =
222+
ShmGetScreenPriv(screenInfo.screens[i]);
223+
screen_priv->destroyPixmap =
224+
screenInfo.screens[i]->DestroyPixmap;
225+
screenInfo.screens[i]->DestroyPixmap = ShmDestroyPixmap;
226+
}
243227
}
244228
ShmSegType = CreateNewResourceType(ShmDetachSegment);
245229
if (ShmSegType &&
@@ -255,76 +239,87 @@ ShmExtensionInit(void)
255239
}
256240
#endif /* NXAGENT_SERVER */
257241

258-
/*ARGSUSED*/
259-
static void
260-
ShmResetProc (extEntry)
261-
ExtensionEntry *extEntry;
242+
static Bool
243+
ShmCloseScreen(ScreenPtr pScreen)
262244
{
263-
int i;
245+
ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
264246

265-
for (i = 0; i < MAXSCREENS; i++)
266-
{
267-
shmFuncs[i] = (ShmFuncsPtr)NULL;
268-
shmPixFormat[i] = 0;
247+
pScreen->CloseScreen = screen_priv->CloseScreen;
248+
dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, NULL);
249+
free(screen_priv);
250+
return (*pScreen->CloseScreen) (pScreen);
251+
}
252+
253+
static ShmScrPrivateRec *
254+
ShmInitScreenPriv(ScreenPtr pScreen)
255+
{
256+
ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
257+
258+
if (!screen_priv) {
259+
screen_priv = calloc(1, sizeof(ShmScrPrivateRec));
260+
screen_priv->CloseScreen = pScreen->CloseScreen;
261+
dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, screen_priv);
262+
pScreen->CloseScreen = ShmCloseScreen;
269263
}
264+
return screen_priv;
270265
}
271266

272-
void
273-
ShmRegisterFuncs(
274-
ScreenPtr pScreen,
275-
ShmFuncsPtr funcs)
267+
static Bool
268+
ShmRegisterPrivates(void)
276269
{
277-
shmFuncs[pScreen->myNum] = funcs;
270+
if (!dixRegisterPrivateKey(&shmScrPrivateKeyRec, PRIVATE_SCREEN, 0))
271+
return FALSE;
272+
if (!dixRegisterPrivateKey(&shmPixmapPrivateKeyRec, PRIVATE_PIXMAP, 0))
273+
return FALSE;
274+
return TRUE;
275+
}
276+
277+
/*ARGSUSED*/ static void
278+
ShmResetProc(ExtensionEntry * extEntry)
279+
{
280+
int i;
281+
282+
for (i = 0; i < screenInfo.numScreens; i++)
283+
ShmRegisterFuncs(screenInfo.screens[i], NULL);
278284
}
279285

280286
void
281-
ShmSetPixmapFormat(
287+
ShmRegisterFuncs(
282288
ScreenPtr pScreen,
283-
int format)
289+
ShmFuncsPtr funcs)
284290
{
285-
shmPixFormat[pScreen->myNum] = format;
291+
if (!ShmRegisterPrivates())
292+
return;
293+
ShmInitScreenPriv(pScreen)->shmFuncs = funcs;
286294
}
287295

288296
static Bool
289297
ShmDestroyPixmap (PixmapPtr pPixmap)
290298
{
291299
ScreenPtr pScreen = pPixmap->drawable.pScreen;
300+
ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
301+
void *shmdesc = NULL;
292302
Bool ret;
303+
293304
if (pPixmap->refcnt == 1)
294-
{
295-
ShmDescPtr shmdesc;
296-
#ifdef PIXPRIV
297-
shmdesc = (ShmDescPtr) pPixmap->devPrivates[shmPixmapPrivate].ptr;
298-
#else
299-
char *base = (char *) pPixmap->devPrivate.ptr;
300-
301-
if (base != (void *) (pPixmap + 1))
302-
{
303-
for (shmdesc = Shmsegs; shmdesc; shmdesc = shmdesc->next)
304-
{
305-
if (shmdesc->addr <= base && base <= shmdesc->addr + shmdesc->size)
306-
break;
307-
}
308-
}
309-
else
310-
shmdesc = 0;
311-
#endif
312-
if (shmdesc)
313-
ShmDetachSegment ((void *) shmdesc, pPixmap->drawable.id);
314-
}
315-
316-
pScreen->DestroyPixmap = destroyPixmap[pScreen->myNum];
305+
shmdesc = dixLookupPrivate(&pPixmap->devPrivates, shmPixmapPrivateKey);
306+
307+
pScreen->DestroyPixmap = screen_priv->destroyPixmap;
317308
ret = (*pScreen->DestroyPixmap) (pPixmap);
318-
destroyPixmap[pScreen->myNum] = pScreen->DestroyPixmap;
309+
screen_priv->destroyPixmap = pScreen->DestroyPixmap;
319310
pScreen->DestroyPixmap = ShmDestroyPixmap;
311+
312+
if (shmdesc)
313+
ShmDetachSegment ((void *) shmdesc, pPixmap->drawable.id);
314+
320315
return ret;
321316
}
322317

323318
void
324319
ShmRegisterFbFuncs(pScreen)
325320
ScreenPtr pScreen;
326321
{
327-
shmFuncs[pScreen->myNum] = &fbFuncs;
322+
ShmRegisterFuncs(pScreen, &fbFuncs);
328323
}
329324

330325
static int
@@ -339,7 +334,6 @@ ProcShmQueryVersion(client)
339334
rep.length = 0;
340335
rep.sequenceNumber = client->sequence;
341336
rep.sharedPixmaps = sharedPixmaps;
342-
rep.pixmapFormat = pixmapFormat;
343337
rep.majorVersion = SERVER_SHM_MAJOR_VERSION;
344338
rep.minorVersion = SERVER_SHM_MINOR_VERSION;
345339
rep.uid = geteuid();
@@ -777,16 +771,17 @@ ProcPanoramiXShmCreatePixmap(
777771
result = (client->noClientException);
778772

779773
FOR_NSCREENS(j) {
774+
ShmScrPrivateRec *screen_priv;
775+
780776
pScreen = screenInfo.screens[j];
781777

782-
pMap = (*shmFuncs[j]->CreatePixmap)(pScreen,
778+
screen_priv = ShmGetScreenPriv(pScreen);
779+
pMap = (*screen_priv->shmFuncs->CreatePixmap)(pScreen,
783780
stuff->width, stuff->height, stuff->depth,
784781
shmdesc->addr + stuff->offset);
785782

786783
if (pMap) {
787-
#ifdef PIXPRIV
788-
pMap->devPrivates[shmPixmapPrivate].ptr = (void *) shmdesc;
789-
#endif
784+
dixSetPrivate(&pMap->devPrivates, shmPixmapPrivateKey, shmdesc);
790785
shmdesc->refcnt++;
791786
pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
792787
pMap->drawable.id = newPix->info[j].id;
@@ -824,8 +819,9 @@ ProcShmPutImage(client)
824819
register DrawablePtr pDraw;
825820
long length;
826821
ShmDescPtr shmdesc;
827-
REQUEST(xShmPutImageReq);
822+
ShmScrPrivateRec *screen_priv;
828823

824+
REQUEST(xShmPutImageReq);
829825
REQUEST_SIZE_MATCH(xShmPutImageReq);
830826
VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
831827
VERIFY_SHMPTR(stuff->shmseg, stuff->offset, FALSE, shmdesc, client);
@@ -902,7 +898,8 @@ ProcShmPutImage(client)
902898
shmdesc->addr + stuff->offset +
903899
(stuff->srcY * length));
904900
else
905-
(*shmFuncs[pDraw->pScreen->myNum]->PutImage)(
901+
screen_priv = ShmGetScreenPriv(pDraw->pScreen);
902+
(*screen_priv->shmFuncs->PutImage)(
906903
pDraw, pGC, stuff->depth, stuff->format,
907904
stuff->totalWidth, stuff->totalHeight,
908905
stuff->srcX, stuff->srcY,
@@ -1074,6 +1071,8 @@ ProcShmCreatePixmap(client)
10741071
DepthPtr pDepth;
10751072
register int i;
10761073
ShmDescPtr shmdesc;
1074+
ShmScrPrivateRec *screen_priv;
1075+
10771076
REQUEST(xShmCreatePixmapReq);
10781077
unsigned int width, height, depth;
10791078
unsigned long size;
@@ -1118,15 +1117,14 @@ ProcShmCreatePixmap(client)
11181117
}
11191118

11201119
VERIFY_SHMSIZE(shmdesc, stuff->offset, size, client);
1121-
pMap = (*shmFuncs[pDraw->pScreen->myNum]->CreatePixmap)(
1120+
screen_priv = ShmGetScreenPriv(pDraw->pScreen);
1121+
pMap = (*screen_priv->shmFuncs->CreatePixmap)(
11221122
pDraw->pScreen, stuff->width,
11231123
stuff->height, stuff->depth,
11241124
shmdesc->addr + stuff->offset);
11251125
if (pMap)
11261126
{
1127-
#ifdef PIXPRIV
1128-
pMap->devPrivates[shmPixmapPrivate].ptr = (void *) shmdesc;
1129-
#endif
1127+
dixSetPrivate(&pMap->devPrivates, shmPixmapPrivateKey, shmdesc);
11301128
shmdesc->refcnt++;
11311129
pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
11321130
pMap->drawable.id = stuff->pid;

nx-X11/programs/Xserver/Xext/shmint.h

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,54 @@
2525
#ifndef _SHMINT_H_
2626
#define _SHMINT_H_
2727

28-
#define _XSHM_SERVER_
29-
#include <X11/extensions/shmstr.h>
28+
#include <X11/extensions/shmproto.h>
3029

3130
#include "screenint.h"
3231
#include "pixmap.h"
3332
#include "gc.h"
3433

35-
void
36-
ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs);
34+
#define XSHM_PUT_IMAGE_ARGS \
35+
DrawablePtr /* dst */, \
36+
GCPtr /* pGC */, \
37+
int /* depth */, \
38+
unsigned int /* format */, \
39+
int /* w */, \
40+
int /* h */, \
41+
int /* sx */, \
42+
int /* sy */, \
43+
int /* sw */, \
44+
int /* sh */, \
45+
int /* dx */, \
46+
int /* dy */, \
47+
char * /* data */
48+
49+
#define XSHM_CREATE_PIXMAP_ARGS \
50+
ScreenPtr /* pScreen */, \
51+
int /* width */, \
52+
int /* height */, \
53+
int /* depth */, \
54+
char * /* addr */
55+
56+
typedef struct _ShmFuncs {
57+
PixmapPtr (*CreatePixmap) (XSHM_CREATE_PIXMAP_ARGS);
58+
void (*PutImage) (XSHM_PUT_IMAGE_ARGS);
59+
} ShmFuncs, *ShmFuncsPtr;
60+
61+
typedef struct _ShmDesc {
62+
struct _ShmDesc *next;
63+
int shmid;
64+
int refcnt;
65+
char *addr;
66+
Bool writable;
67+
unsigned long size;
68+
} ShmDescRec, *ShmDescPtr;
3769

3870
void
39-
ShmSetPixmapFormat(ScreenPtr pScreen, int format);
71+
ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs);
4072

4173
void
4274
ShmRegisterFbFuncs(ScreenPtr pScreen);
4375

76+
77+
4478
#endif /* _SHMINT_H_ */

0 commit comments

Comments
 (0)