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/common \
 | ||||
| 	-I$(top_srcdir)/hw/xfree86/dri \
 | ||||
| 	-I$(top_srcdir)/mi | ||||
| 	-I$(top_srcdir)/mi \
 | ||||
| 	-I$(top_srcdir)/present | ||||
| 
 | ||||
| if DRI2_AIGLX | ||||
| AM_CPPFLAGS += -I$(top_srcdir)/hw/xfree86/dri2 | ||||
|  |  | |||
|  | @ -2468,3 +2468,64 @@ __glXDisp_ClientInfo(__GLXclientState * cl, GLbyte * pc) | |||
| 
 | ||||
|     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) | ||||
| { | ||||
|     __GLXdrawable *drawable = data; | ||||
|     xGLXBufferSwapComplete2 wire =  { | ||||
|         .type = __glXEventBase + GLX_BufferSwapComplete | ||||
|     }; | ||||
| 
 | ||||
|     if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) | ||||
|         return; | ||||
| 
 | ||||
|     int glx_type; | ||||
|     switch (type) { | ||||
|     case DRI2_EXCHANGE_COMPLETE: | ||||
|         wire.event_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; | ||||
|         glx_type = GLX_EXCHANGE_COMPLETE_INTEL; | ||||
|         break; | ||||
|     default: | ||||
|         /* unknown swap completion type */ | ||||
|         wire.event_type = 0; | ||||
|         /* unknown swap completion type,
 | ||||
|          * 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; | ||||
|     } | ||||
|     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); | ||||
|      | ||||
|     __glXsendSwapEvent(drawable, glx_type, ust, msc, sbc); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  |  | |||
|  | @ -399,6 +399,9 @@ GlxExtensionInit(void) | |||
| 
 | ||||
|     __glXErrorBase = extEntry->errorBase; | ||||
|     __glXEventBase = extEntry->eventBase; | ||||
| #if PRESENT | ||||
|     __glXregisterPresentCompleteNotify(); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /************************************************************************/ | ||||
|  |  | |||
|  | @ -120,6 +120,15 @@ void glxResumeClients(void); | |||
| void __glXsetGetProcAddress(void (*(*get_proc_address) (const char *)) (void)); | ||||
| 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. | ||||
| */ | ||||
|  |  | |||
|  | @ -115,4 +115,13 @@ present_event_abandon(RRCrtcPtr crtc); | |||
| extern _X_EXPORT Bool | ||||
| 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_ */ | ||||
|  |  | |||
|  | @ -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 | ||||
| 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 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue