Xext: xv: use PixmapDestroy hook
Wrapping ScreenRec's function pointers is problematic for many reasons, so use the new pixmap destroy notify hook instead. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
		
							parent
							
								
									63485bcc02
								
							
						
					
					
						commit
						8264e0ae21
					
				|  | @ -173,7 +173,6 @@ typedef struct { | ||||||
|     int version, revision; |     int version, revision; | ||||||
|     int nAdaptors; |     int nAdaptors; | ||||||
|     XvAdaptorPtr pAdaptors; |     XvAdaptorPtr pAdaptors; | ||||||
|     DestroyPixmapProcPtr DestroyPixmap; |  | ||||||
| } XvScreenRec, *XvScreenPtr; | } XvScreenRec, *XvScreenPtr; | ||||||
| 
 | 
 | ||||||
| extern _X_EXPORT int XvScreenInit(ScreenPtr); | extern _X_EXPORT int XvScreenInit(ScreenPtr); | ||||||
|  |  | ||||||
|  | @ -143,7 +143,6 @@ static void WriteSwappedPortNotifyEvent(xvEvent *, xvEvent *); | ||||||
| static Bool CreateResourceTypes(void); | static Bool CreateResourceTypes(void); | ||||||
| 
 | 
 | ||||||
| static void XvScreenClose(CallbackListPtr *pcbl, ScreenPtr, void *arg); | static void XvScreenClose(CallbackListPtr *pcbl, ScreenPtr, void *arg); | ||||||
| static Bool XvDestroyPixmap(PixmapPtr); |  | ||||||
| static void XvResetProc(ExtensionEntry *); | static void XvResetProc(ExtensionEntry *); | ||||||
| static int XvdiDestroyGrab(void *, XID); | static int XvdiDestroyGrab(void *, XID); | ||||||
| static int XvdiDestroyEncoding(void *, XID); | static int XvdiDestroyEncoding(void *, XID); | ||||||
|  | @ -263,6 +262,11 @@ static void XvWindowDestroy(CallbackListPtr *pcbl, ScreenPtr pScreen, WindowPtr | ||||||
|     XvStopAdaptors(&pWin->drawable); |     XvStopAdaptors(&pWin->drawable); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void XvPixmapDestroy(CallbackListPtr *pcbl, ScreenPtr pScreen, PixmapPtr pPixmap) | ||||||
|  | { | ||||||
|  |     XvStopAdaptors(&pPixmap->drawable); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int | int | ||||||
| XvScreenInit(ScreenPtr pScreen) | XvScreenInit(ScreenPtr pScreen) | ||||||
| { | { | ||||||
|  | @ -296,12 +300,9 @@ XvScreenInit(ScreenPtr pScreen) | ||||||
| 
 | 
 | ||||||
|     dixSetPrivate(&pScreen->devPrivates, XvScreenKey, pxvs); |     dixSetPrivate(&pScreen->devPrivates, XvScreenKey, pxvs); | ||||||
| 
 | 
 | ||||||
|     pxvs->DestroyPixmap = pScreen->DestroyPixmap; |  | ||||||
| 
 |  | ||||||
|     dixScreenHookWindowDestroy(pScreen, XvWindowDestroy); |     dixScreenHookWindowDestroy(pScreen, XvWindowDestroy); | ||||||
|     dixScreenHookClose(pScreen, XvScreenClose); |     dixScreenHookClose(pScreen, XvScreenClose); | ||||||
| 
 |     dixScreenHookPixmapDestroy(pScreen, XvPixmapDestroy); | ||||||
|     pScreen->DestroyPixmap = XvDestroyPixmap; |  | ||||||
| 
 | 
 | ||||||
|     return Success; |     return Success; | ||||||
| } | } | ||||||
|  | @ -314,8 +315,7 @@ static void XvScreenClose(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused | ||||||
| 
 | 
 | ||||||
|     dixScreenUnhookWindowDestroy(pScreen, XvWindowDestroy); |     dixScreenUnhookWindowDestroy(pScreen, XvWindowDestroy); | ||||||
|     dixScreenUnhookClose(pScreen, XvScreenClose); |     dixScreenUnhookClose(pScreen, XvScreenClose); | ||||||
| 
 |     dixScreenUnhookPixmapDestroy(pScreen, XvPixmapDestroy); | ||||||
|     pScreen->DestroyPixmap = pxvs->DestroyPixmap; |  | ||||||
| 
 | 
 | ||||||
|     free(pxvs); |     free(pxvs); | ||||||
| 
 | 
 | ||||||
|  | @ -369,25 +369,6 @@ XvStopAdaptors(DrawablePtr pDrawable) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Bool |  | ||||||
| XvDestroyPixmap(PixmapPtr pPix) |  | ||||||
| { |  | ||||||
|     ScreenPtr pScreen = pPix->drawable.pScreen; |  | ||||||
|     Bool status = TRUE; |  | ||||||
| 
 |  | ||||||
|     if (pPix->refcnt == 1) |  | ||||||
|         XvStopAdaptors(&pPix->drawable); |  | ||||||
| 
 |  | ||||||
|     SCREEN_PROLOGUE(pScreen, DestroyPixmap); |  | ||||||
|     if (pScreen->DestroyPixmap) |  | ||||||
|         status = pScreen->DestroyPixmap(pPix); |  | ||||||
|     SCREEN_EPILOGUE(pScreen, DestroyPixmap, XvDestroyPixmap); |  | ||||||
| 
 |  | ||||||
|     return status; |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| static int | static int | ||||||
| XvdiDestroyPort(void *pPort, XID id) | XvdiDestroyPort(void *pPort, XID id) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue