present: Send GLX_BufferSwapComplete events from present extension
This allows GL to support the GLX_INTEL_swap_event extension. v2: Return GLX_BLIT_COMPLETE_INTEL for unknown swap types Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
		
							parent
							
								
									cde86e68fc
								
							
						
					
					
						commit
						3dd5bfe540
					
				|  | @ -20,7 +20,8 @@ AM_CPPFLAGS = \ | ||||||
| 	-I$(top_srcdir)/hw/xfree86/os-support/bus \
 | 	-I$(top_srcdir)/hw/xfree86/os-support/bus \
 | ||||||
| 	-I$(top_srcdir)/hw/xfree86/common \
 | 	-I$(top_srcdir)/hw/xfree86/common \
 | ||||||
| 	-I$(top_srcdir)/hw/xfree86/dri \
 | 	-I$(top_srcdir)/hw/xfree86/dri \
 | ||||||
| 	-I$(top_srcdir)/mi | 	-I$(top_srcdir)/mi \
 | ||||||
|  | 	-I$(top_srcdir)/present | ||||||
| 
 | 
 | ||||||
| if DRI2_AIGLX | if DRI2_AIGLX | ||||||
| AM_CPPFLAGS += -I$(top_srcdir)/hw/xfree86/dri2 | AM_CPPFLAGS += -I$(top_srcdir)/hw/xfree86/dri2 | ||||||
|  |  | ||||||
|  | @ -2468,3 +2468,64 @@ __glXDisp_ClientInfo(__GLXclientState * cl, GLbyte * pc) | ||||||
| 
 | 
 | ||||||
|     return Success; |     return Success; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #include <GL/glxtokens.h> | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | __glXsendSwapEvent(__GLXdrawable *drawable, int type, CARD64 ust, | ||||||
|  |                    CARD64 msc, CARD32 sbc) | ||||||
|  | { | ||||||
|  |     ClientPtr client = clients[CLIENT_ID(drawable->drawId)]; | ||||||
|  | 
 | ||||||
|  |     xGLXBufferSwapComplete2 wire =  { | ||||||
|  |         .type = __glXEventBase + GLX_BufferSwapComplete | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     if (!client) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     wire.event_type = type; | ||||||
|  |     wire.drawable = drawable->drawId; | ||||||
|  |     wire.ust_hi = ust >> 32; | ||||||
|  |     wire.ust_lo = ust & 0xffffffff; | ||||||
|  |     wire.msc_hi = msc >> 32; | ||||||
|  |     wire.msc_lo = msc & 0xffffffff; | ||||||
|  |     wire.sbc = sbc; | ||||||
|  | 
 | ||||||
|  |     WriteEventsToClient(client, 1, (xEvent *) &wire); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #if PRESENT | ||||||
|  | static void | ||||||
|  | __glXpresentCompleteNotify(WindowPtr window, CARD8 present_mode, CARD32 serial, | ||||||
|  |                            uint64_t ust, uint64_t msc) | ||||||
|  | { | ||||||
|  |     __GLXdrawable *drawable; | ||||||
|  |     int glx_type; | ||||||
|  |     int rc; | ||||||
|  | 
 | ||||||
|  |     rc = dixLookupResourceByType((pointer *) &drawable, window->drawable.id, | ||||||
|  |                                  __glXDrawableRes, serverClient, DixGetAttrAccess); | ||||||
|  | 
 | ||||||
|  |     if (rc != Success) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     if (present_mode == PresentCompleteModeFlip) | ||||||
|  |         glx_type = GLX_FLIP_COMPLETE_INTEL; | ||||||
|  |     else | ||||||
|  |         glx_type = GLX_BLIT_COMPLETE_INTEL; | ||||||
|  |          | ||||||
|  |     __glXsendSwapEvent(drawable, glx_type, ust, msc, serial); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #include <present.h> | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | __glXregisterPresentCompleteNotify(void) | ||||||
|  | { | ||||||
|  |     present_register_complete_notify(__glXpresentCompleteNotify); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | @ -177,36 +177,25 @@ __glXdriSwapEvent(ClientPtr client, void *data, int type, CARD64 ust, | ||||||
|                   CARD64 msc, CARD32 sbc) |                   CARD64 msc, CARD32 sbc) | ||||||
| { | { | ||||||
|     __GLXdrawable *drawable = data; |     __GLXdrawable *drawable = data; | ||||||
|     xGLXBufferSwapComplete2 wire =  { |     int glx_type; | ||||||
|         .type = __glXEventBase + GLX_BufferSwapComplete |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) |  | ||||||
|         return; |  | ||||||
| 
 |  | ||||||
|     switch (type) { |     switch (type) { | ||||||
|     case DRI2_EXCHANGE_COMPLETE: |     case DRI2_EXCHANGE_COMPLETE: | ||||||
|         wire.event_type = GLX_EXCHANGE_COMPLETE_INTEL; |         glx_type = GLX_EXCHANGE_COMPLETE_INTEL; | ||||||
|         break; |  | ||||||
|     case DRI2_BLIT_COMPLETE: |  | ||||||
|         wire.event_type = GLX_BLIT_COMPLETE_INTEL; |  | ||||||
|         break; |  | ||||||
|     case DRI2_FLIP_COMPLETE: |  | ||||||
|         wire.event_type = GLX_FLIP_COMPLETE_INTEL; |  | ||||||
|         break; |         break; | ||||||
|     default: |     default: | ||||||
|         /* unknown swap completion type */ |         /* unknown swap completion type,
 | ||||||
|         wire.event_type = 0; |          * BLIT is a reasonable default, so | ||||||
|  |          * fall through ... | ||||||
|  |          */ | ||||||
|  |     case DRI2_BLIT_COMPLETE: | ||||||
|  |         glx_type = GLX_BLIT_COMPLETE_INTEL; | ||||||
|  |         break; | ||||||
|  |     case DRI2_FLIP_COMPLETE: | ||||||
|  |         glx_type = GLX_FLIP_COMPLETE_INTEL; | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|     wire.drawable = drawable->drawId; |      | ||||||
|     wire.ust_hi = ust >> 32; |     __glXsendSwapEvent(drawable, glx_type, ust, msc, sbc); | ||||||
|     wire.ust_lo = ust & 0xffffffff; |  | ||||||
|     wire.msc_hi = msc >> 32; |  | ||||||
|     wire.msc_lo = msc & 0xffffffff; |  | ||||||
|     wire.sbc = sbc; |  | ||||||
| 
 |  | ||||||
|     WriteEventsToClient(client, 1, (xEvent *) &wire); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
|  | @ -399,6 +399,9 @@ GlxExtensionInit(void) | ||||||
| 
 | 
 | ||||||
|     __glXErrorBase = extEntry->errorBase; |     __glXErrorBase = extEntry->errorBase; | ||||||
|     __glXEventBase = extEntry->eventBase; |     __glXEventBase = extEntry->eventBase; | ||||||
|  | #if PRESENT | ||||||
|  |     __glXregisterPresentCompleteNotify(); | ||||||
|  | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /************************************************************************/ | /************************************************************************/ | ||||||
|  |  | ||||||
|  | @ -120,6 +120,15 @@ void glxResumeClients(void); | ||||||
| void __glXsetGetProcAddress(void (*(*get_proc_address) (const char *)) (void)); | void __glXsetGetProcAddress(void (*(*get_proc_address) (const char *)) (void)); | ||||||
| void *__glGetProcAddress(const char *); | void *__glGetProcAddress(const char *); | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | __glXsendSwapEvent(__GLXdrawable *drawable, int type, CARD64 ust, | ||||||
|  |                    CARD64 msc, CARD32 sbc); | ||||||
|  | 
 | ||||||
|  | #if PRESENT | ||||||
|  | void | ||||||
|  | __glXregisterPresentCompleteNotify(void); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
| ** State kept per client. | ** State kept per client. | ||||||
| */ | */ | ||||||
|  |  | ||||||
|  | @ -115,4 +115,13 @@ present_event_abandon(RRCrtcPtr crtc); | ||||||
| extern _X_EXPORT Bool | extern _X_EXPORT Bool | ||||||
| present_screen_init(ScreenPtr screen, present_screen_info_ptr info); | present_screen_init(ScreenPtr screen, present_screen_info_ptr info); | ||||||
| 
 | 
 | ||||||
|  | typedef void (*present_complete_notify_proc)(WindowPtr window, | ||||||
|  |                                              CARD8 mode, | ||||||
|  |                                              CARD32 serial, | ||||||
|  |                                              uint64_t ust, | ||||||
|  |                                              uint64_t msc); | ||||||
|  | 
 | ||||||
|  | extern _X_EXPORT void | ||||||
|  | present_register_complete_notify(present_complete_notify_proc proc); | ||||||
|  | 
 | ||||||
| #endif /* _PRESENT_H_ */ | #endif /* _PRESENT_H_ */ | ||||||
|  |  | ||||||
|  | @ -137,6 +137,14 @@ present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static present_complete_notify_proc complete_notify; | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | present_register_complete_notify(present_complete_notify_proc proc) | ||||||
|  | { | ||||||
|  |     complete_notify = proc; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc) | present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc) | ||||||
| { | { | ||||||
|  | @ -165,6 +173,8 @@ present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 se | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     if (complete_notify) | ||||||
|  |         (*complete_notify)(window, mode, serial, ust, msc); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue