presentproto.txt revision 68872e7f
1			The Present Extension
2			     Version 1.3
3			      2023-06-13
4      
5			    Keith Packard
6			  keithp@keithp.com
7			  Intel Corporation
8
91. Introduction
10
11The Present extension provides a way for applications to update their
12window contents from a pixmap in a well defined fashion, synchronizing
13with the display refresh and potentially using a more efficient
14mechanism than copying the contents of the source pixmap.
15
161.1. Future Present extension versions
17
18This document includes speculation about future 'redirect' support
19within the Present extension. All such information is subject to
20change and is provided only as an aid to further Present development.
21
221.2. Acknowledgments
23
24Eric Anholt <eric@anholt.net>
25Owen Taylor <otaylor@redhat.com>
26James Jones <jajones@nvidia.com>
27Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
28
29			     ❄ ❄ ❄  ❄  ❄ ❄ ❄ 
30
312. Data Types
32
33PRESENTEVENTID { XID }
34
35	Defines a unique event delivery target for Present
36	events. Multiple event IDs can be allocated to provide
37	multiple distinct event delivery contexts.
38
39PRESENTNOTIFY {
40	window: WINDOW
41	serial: CARD32
42	}
43
44	A list of these is passed to PresentPixmap; when the indicated
45	PresentPixmap completes, PresentCompletNotify events will be
46	delivered both to the PresentPixmap window/serial parameter as
47	well as each of the entries in the list of PRESENTNOTIFY parameter.
48
49PRESENTEVENTTYPE { PresentConfigureNotify,
50		   PresentCompleteNotify,
51		   PresentIdleNotify }
52
53PRESENTEVENTMASK { PresentConfigureNotifyMask,
54		   PresentCompleteNotifyMask,
55		   PresentIdleNotifyMask }
56
57PRESENTOPTION { PresentOptionAsync,
58                PresentOptionCopy,
59		PresentOptionUST,
60		PresentOptionSuboptimal,
61		PresentOptionAsyncMayTear }
62
63PRESENTCAPABILITY { PresentCapabilityAsync,
64		    PresentCapabilityFence,
65		    PresentCapabilityUST,
66		    PresentCapabilityAsyncMayTear }
67
68PRESENTCOMPLETEKIND { PresentCompleteKindPixmap,
69		      PresentCompleteKindMSCNotify }
70
71PRESENTCOMPLETEMODE { PresentCompleteModeCopy,
72		      PresentCompleteModeFlip,
73		      PresentCompleteModeSkip,
74		      PresentCompleteModeSuboptimalCopy }
75
76The Present extension also uses the Sync extension Fence data type to
77provide synchronization for pixmaps.
78
792.1. Data Types proposed for a later Present extension version
80
81PRESENTEVENTTYPE { ...
82		   PresentRedirectNotify }
83
84PRESENTEVENTMASK { ...
85		   PresentSubredirectNotifyMask }
86
87			     ❄ ❄ ❄  ❄  ❄ ❄ ❄ 
88
893. Errors
90
91EventID
92	A value for an EventID argument does not name a defined EventID
93
94			     ❄ ❄ ❄  ❄  ❄ ❄ ❄ 
95
965. Events
97
98ConfigureNotify events inform clients about window configuration
99changes which can affect the allocation of window-related buffers.
100
101CompleteNotify events inform clients about the completion of a pending
102PresentPixmap request.
103
104IdleNotify events inform clients when pixmaps are available for re-use.
105
1065.1. Events proposed for a later Present extension version
107
108RedirectNotify events inform clients about other clients PresentPixmap
109requests.
110
111			     ❄ ❄ ❄  ❄  ❄ ❄ ❄ 
112
1136. Extension Initialization
114
115The name of this extension is "Present"
116
117┌───
118    PresentQueryVersion
119	client-major-version:	CARD32
120	client-minor-version:	CARD32
121122	major-version:		CARD32
123	minor-version:		CARD32
124└───
125
126	The client sends the highest supported version to the server
127	and the server sends the highest version it supports, but no
128	higher than the requested version. Major versions changes can
129	introduce incompatibilities in existing functionality, minor
130	version changes introduce only backward compatible changes.
131	It is the clients responsibility to ensure that the server
132	supports a version which is compatible with its expectations.
133
134	Backwards compatible changes include addition of new
135	requests.
136
137			     ❄ ❄ ❄  ❄  ❄ ❄ ❄ 
138
1397. Extension Requests
140
141┌───
142    PresentPixmap
143	window: WINDOW
144	pixmap: PIXMAP
145	serial: CARD32
146	valid-area: REGION or None
147	update-area: REGION or None
148	x-off, y-off: INT16
149	target-crtc: CRTC or None
150	wait-fence: FENCE
151	idle-fence: FENCE
152	options: SETofPRESENTOPTION
153	target-msc: CARD64
154	divisor: CARD64
155	remainder: CARD64
156	notifies: LISTofPRESENTNOTIFY
157└───
158	Errors: Window, Pixmap, Match
159
160	Provides new content for the specified window, to be made
161	visible at the specified time (defined by 'target-msc', 'divisor'
162	and 'remainder'). If the depth of 'pixmap' and 'window' do not
163	match, a Match error will be generated.
164
165	'serial' is an arbitrary client-specified value which will
166	be returned in the associated PresentCompleteNotify event so
167	that the client can associate the event and request.
168
169	'valid-area' defines the portion of 'pixmap' which contains
170	valid window contents, or None if the pixmap contains valid
171	contents for the whole window.
172
173	'update-area' defines the subset of the window to be updated,
174	or None if the whole window is to be updated.
175
176	PresentPixmap may use any region of 'pixmap' which contains
177	'update-area' and which is contained by 'valid-area'. In other
178	words, areas inside 'update-area' will be presented from
179	'pixmap', areas outside 'valid-area' will not be presented
180	from 'pixmap' and areas inside 'valid-area' but outside
181	'update-area' may or may not be presented at the discretion of
182	the X server.
183
184	'x-off' and 'y-off' define the location in the window where
185	the 0,0 location of the pixmap will be presented. valid-area
186	and update-area are relative to the pixmap.
187
188	PresentPixmap will block until 'wait-fence' is triggered.
189	
190	When the X server has finished using 'pixmap' for this
191	operation, it will send a PresentIdleNotify event and arrange
192	for any 'idle-fence' to be triggered. This may be at any time
193	following the PresentPixmap request -- the contents may be
194	immediately copied to another buffer, copied just in time for
195	the vblank interrupt or the pixmap may be used directly for
196	display (in which case it will be busy until some future
197	PresentPixmap operation).
198
199	If 'idle-fence' is not None, then the client guarantees to the
200	X server that it will wait for that fence to be signalled
201	before it uses the pixmap again. If 'idle-fence' is None, then
202	the X server must arrange for the pixmap to be re-usable by
203	the client as soon as the PresentIdleNotify event has been
204	received. Note that if PresentCapabilityFence is set for the
205	associated CRTC, then clients should use fences to improve
206	overall system performance. If PresentCapabilityFence is not
207	set, then using fences offers no benefit, but also no cost.
208
209	If 'target-msc' is greater than the current msc for 'window',
210	the presentation will occur at (or after) the 'target-msc'
211	field. Otherwise, the presentation will occur after the next
212	field where msc % 'divisor' == 'remainder'.
213	
214	If 'target-crtc' is None, then the X server will choose a
215	suitable CRTC for synchronization.
216	
217	If 'options' contains PresentOptionAsync, and the 'target-msc'
218	is less than or equal to the current msc for 'window', then
219	the operation will be performed as soon as possible, not
220	necessarily waiting for the next vertical blank interval. If
221	the target-crtc does not support PresentCapabilityAsyncMayTear,
222	this may result in tearing.
223
224	If the target-crtc supports PresentCapabilityAsyncMayTear,
225	'options' contains PresentOptionAsyncMayTear, and the 'target-msc'
226	is less than or equal to the current msc for 'window', then
227	the operation will be performed as soon as possible, not
228	necessarily waiting for the next vertical blank interval, and
229	possibly resulting in tearing.
230
231	If 'options' contains PresentOptionCopy, then 'pixmap' will be
232	idle, and 'idle-fence' triggered as soon as the operation occurs.
233
234	If 'options' contains PresentOptionUST, then target-msc,
235	divisor and remainder will all be interpreted as UST values
236	instead of MSC values and the frame update will be scheduled
237	for the specified UST time, If the target-crtc supports
238	PresentCapabilityUST, then the swap time will be as close to
239	the target time as the driver can manage. Otherwise, the
240	server will take the target UST time and convert it to a
241	suitable target MSC value.
242
243	If 'options' contains PresentOptionSuboptimal, then the
244	PresentCompleteNotify event can have mode
245	PresentCompleteModeSuboptimalCopy as the client supports it.
246
247	After the presentation occurs, a PresentCompleteNotify event
248	with kind PresentCompleteKindPixmap will be generated, both to
249	'window' as well as all members of 'notifies'.
250
251	If 'window' is destroyed before the presentation occurs, then
252	the presentation action will not be completed.
253
254	PresentPixmap holds a reference to 'pixmap' until the
255	presentation occurs, so 'pixmap' may be immediately freed
256	after the request executes, even if that is before the
257	presentation occurs.
258
259	If 'idle-fence' is destroyed before the presentation occurs,
260	then idle-fence will not be signaled but the presentation will
261	occur normally.
262
263	If 'wait-fence' is destroyed before it becomes triggered, then
264	the presentation operation will no longer wait for it and will
265	occur when the other conditions are satisfied.
266
267┌───
268    PresentNotifyMSC
269	window: WINDOW
270	serial: CARD32
271	target-msc: CARD64
272	divisor: CARD64
273	remainder: CARD64
274└───
275	Errors: Window
276
277	Delivers a PresentCompleteNotifyEvent with kind
278	PresentCompleteKindNotifyMSC after the time specified by
279	'target-msc', 'divisor' and 'remainder'.
280
281	'serial' is an arbitrary client-specified value which will be
282	returned in the event so that the client can associate the
283	event and request.
284
285	If 'target-msc' is greater than the current msc for 'window',
286	the event will be delivered at (or after) the 'target-msc'
287	field. Otherwise, the event delivery will occur after the next
288	field where msc % 'divisor' == 'remainder'.
289	
290	If 'window' is destroyed before the event is delivered, then
291	the event delivery will not be completed.
292
293┌───
294    PresentSelectInput
295	event-id: PRESENTEVENTID
296	window: WINDOW
297	eventMask: SETofPRESENTEVENT
298└───
299	Errors: Window, Value, Match, IDchoice, Access
300
301	Selects the set of Present events to be delivered for the
302	specified window and event context. PresentSelectInput can
303	create, modify, or delete event contexts. An event context is
304	associated with a specific window; using an existing event
305	context with a different window generates a Match error.
306
307	If eventContext specifies an existing event context, then if
308	eventMask is empty, PresentSelectInput deletes the specified
309	context, otherwise the specified event context is changed to
310	select a different set of events.
311
312	If eventContext is an unused XID, then if eventMask is empty
313	no operation is performed. Otherwise, a new event context is
314	created selecting the specified events.
315
316┌───
317    PresentQueryCapabilities
318	target:			CRTC or WINDOW
319320	capabilities:		SETofPRESENTCAPABILITY
321└───
322	Errors: Window, CRTC
323
324	Returns the supported capabilities for the target CRTC.  If
325	'target' is a CRTC, then it is used as the target CRTC.  If
326	'target' is a WINDOW, then the target CRTC is selected by the
327	X server from among the CRTCs on the screen specified by the window.
328
329	PresentCapabilityAsyncMayTear means that the target device may be
330	able to flip the scanout buffer mid-frame instead of waiting for
331	a vertical blank interval. The precise latency between the flip
332	request and the actual scanout transition is not defined by this
333	specification, but is intended to be no more than a few
334	scanlines.
335
336	If PresentCapabilityAsyncMayTear is not supported,
337	PresentCapabilityAsync means the same as
338	PresentCapabilityAsyncMayTear described above.
339
340	If PresentCapabilityAsyncMayTear is supported,
341	PresentCapabilityAsync means that even if there is already a flip
342	pending in the target device, it may be possible to replace that
343	flip before the next vertical blank interval. The scanout buffer
344	does not change mid-frame though, i.e. there is no tearing.
345
346	PresentCapabilityFence means that the target device can take
347	advantage of SyncFences in the Present operations to improve
348	GPU throughput. The driver must operate correctly in the
349	absence of fences, but may have reduced performance. Using
350	fences for drivers not advertising this capability should have
351	no performance impact.
352
353	PresentCapabilityUST means that the target device can scanout
354	the image at an arbitrary UST time value, and is not driven by
355	a periodic scanout timer. Applications specifying UST times
356	for PresentPixmap can expect that their image will appear to
357	the user within a short amount of time from that specified in
358	the request. The precise accuracy of the scanout time is not
359	defined by the extension, but is expected to be on the order
360	of milliseconds or less.
361
362
3637.1 Requests proposed for a later Present extension version
364
365	These are not part of the standard and represent future plans
366	for the Present extension.
367
368┌───
369    PresentSelectInput
370    ...
371└───
372	...
373
374	Specifying PresentSubredirectNotify Mask causes PresentPixmap
375	requests on any child of 'window' from other clients to
376	generate PresentRedirectNotify events to 'window' instead of
377	actually performing the operation. However, only one client at
378	a time can select for PresentRedirect on a window. An attempt
379	to violate this restriction results in an Access error.
380
381			     ❄ ❄ ❄  ❄  ❄ ❄ ❄ 
382
3838. Extension Events
384
385┌───
386    PresentConfigureNotify
387	type: CARD8			XGE event type (35)
388	extension: CARD8		Present extension request number
389	sequence-number: CARD16
390	length: CARD32			2
391	evtype: CARD16			Present_ConfigureNotify
392	eventID: PRESENTEVENTID
393	window: WINDOW
394	x: INT16
395	y: INT16
396	width: CARD16
397	height: CARD16
398	off_x: INT16
399	off_y: INT16
400	pixmap_width: CARD16
401	pixmap_height: CARD16
402	pixmap_flags: CARD32
403└───
404
405	PresentConfigureNotify events are sent when the window
406	configuration changes if PresentSelectInput has requested
407	it. PresentConfigureNotify events are XGE events and so do not
408	have a unique event type.
409
410	'x' and 'y' are the parent-relative location of 'window'. 
411
412┌───
413    PresentCompleteNotify
414	type: CARD8			XGE event type (35)
415	extension: CARD8		Present extension request number
416	sequence-number: CARD16
417	length: CARD32			2
418	evtype: PRESENTEVENTTYPE	PresentCompleteNotify
419	eventID: PRESENTEVENTID
420	window: WINDOW
421	kind: PRESENTCOMPLETEKIND
422	mode: PRESENTCOMPLETEMODE
423	serial: CARD32
424	ust: CARD64
425	msc: CARD64
426└───
427
428	CompleteNotify events are delivered when a PresentPixmap or
429	PresentNotifyMSC operation has completed.
430
431	'kind' is PresentCompleteKindPixmap when generated by a
432	PresentPixmap operation completion or
433	PresentCompleteKindNotifyMsc when generated by a
434	PresentNotifyMSC operation completion.
435
436	'mode' is PresentCompleteModeCopy when the source pixmap
437	contents are taken from the pixmap and the pixmap is idle
438	immediately after the presentation completes. 'mode' is
439	PresentCompleteModeSuboptimalCopy when the source pixmap
440	contents are copied but it would be possible to flip the
441	pixmap if the buffer format/modifier was different (options
442	given to PresentPixmap must contain PresentOptionSuboptimal).
443	'mode' is PresentCompleteModeFlip when the pixmap remains in-use
444	even after the presentation completes. It will become idle no
445	later than when the next PresentPixmap operation targeting the
446	same window by any client completes. If the presentation
447	operation was skipped because some later operation made it
448	irrelevant, then 'mode' will be PresentCompleteModeSkip.
449
450	'serial' is the value provided in the generating PresentPixmap
451	request.
452
453	'msc' and 'ust' indicate the frame count and system time when
454	the presentation actually occurred.
455
456┌───
457    PresentIdleNotify
458	type: CARD8			XGE event type (35)
459	extension: CARD8		Present extension request number
460	sequence-number: CARD16
461	length: CARD32			0
462	evtype: PRESENTEVENTTYPE	PresentIdleNotify
463	eventID: PRESENTEVENTID
464	window: WINDOW
465	serial: CARD32
466	pixmap: PIXMAP
467	idle-fence: FENCE
468└───
469
470	IdleNotify events are delivered when a pixmap used in a
471	PresentPixmap operation may be re-used by the client.
472
473	'window' is the window from the PresentPixmap to which this
474	event is delivered.
475
476	'serial' is the value provided in the associated PresentPixmap
477	request.
478
479	'pixmap' is the pixmap which is ready for re-use.
480
481	'idle-fence' is the fence which was provided in the
482	originating PresentPixmap request and is used to synchronize
483	rendering between the client and the X server's use of the
484	buffer. If not None, then the client must wait for the fence
485	to be signaled before using the pixmap.
486
4878.1. Extension Events proposed for a later Present extension version
488
489┌───
490    PresentRedirectNotify
491	type: CARD8			XGE event type (35)
492	extension: CARD8		Present extension request number
493	sequence-number: CARD16
494	length: CARD32			17 + 2 n
495	evtype: CARD16			Present_RedirectNotify
496	update-window: BOOL
497
498	eventID: PRESENTEVENTID
499	event-window: WINDOW
500	window: WINDOW
501	pixmap: PIXMAP
502	serial: CARD32
503
504	valid-area: REGION
505	update-area: REGION
506	valid-rect: RECTANGLE
507	update-rect: RECTANGLE
508	x-off, y-off: INT16
509	target-crtc: CRTC
510	wait-fence: FENCE
511	idle-fence: FENCE
512	options: SETofPRESENTOPTION
513	target-msc: CARD64
514	divisor: CARD64
515	remainder: CARD64
516	notifies: LISTofPRESENTNOTIFY
517└───
518
519	RedirectNotify events are delivered when the client has
520	selected for SubredirectNotify the parent of the target
521	window. All of the values provided to the PresentPixmap
522	request are provided. If the client simply passes these
523	parameters back to the X server, the effect will be as if the
524	original client executed the request.
525
526	If 'update-window' is TRUE, then there are clients who have
527	requested composite automatic redirect on the window and who
528	presumably expect the window buffer to eventually contain
529	the application provided contents. The compositing manager
530	should at least occasionally update the window buffer with
531	suitable contents. The precise update interval is left to the
532	discretion of the client receiving this event.
533
534			     ❄ ❄ ❄  ❄  ❄ ❄ ❄
535
5369. Extension Versioning
537
538	1.0: First published version
539
540	1.2: Added PresentCompleteModeSuboptimalCopy flag and
541	     PresentOptionSuboptimal option
542
543			     ❄ ❄ ❄  ❄  ❄ ❄ ❄
544
545
54610. Relationship with other extensions
547
548As an extension designed to support other extensions, there is
549naturally some interactions with other extensions.
550
55110.1 GLX
552
553GLX is both an application interface and an X extension. OpenGL
554applications using the GLX API will use the GLX extension and may use
555the Present extension to display application contents.
556
55710.2 DRI3
558
559The DRI3 extension provides a way to share direct rendered pixel data
560with the X server as X pixmaps. When used in conjunction with Present,
561they provide a complete direct rendering solution for OpenGL or other
562APIs.
563
56410.3 DRI2
565
566Present provides similar functionality to the DRI2SwapBuffers and
567requests, however Present uses X pixmaps to refer to the new window
568contents instead of the DRI2 buffer attachments.
569
570Present and DRI3 are designed in conjunction to replace DRI2.
571
57210.4 XvMC / Xv
573
574It might be nice to be able to use YUV formatted objects as Present
575sources.
576
577			     ❄ ❄ ❄  ❄  ❄ ❄ ❄
578
579Appendix A. Protocol Encoding
580
581Syntactic Conventions
582
583This document uses the same syntactic conventions as the core X
584protocol encoding document.
585
586
587A.1 Common Types
588┌───
589    PresentEventType
590	0	PresentConfigureNotify
591	1	PresentCompleteNotify
592	2	PresentIdleNotify
593└───
594
595┌───
596    PresentEventMask
597	1	PresentConfigureNotifyMask
598	2	PresentCompleteNotifyMask
599	4	PresentIdleNotifyMask
600└───
601
602┌───
603    PresentOption
604	1	PresentOptionAsync
605	2	PresentOptionCopy;
606	4	PresentOptionUST
607	8	PresentOptionSuboptimal
608	16	PresentOptionAsyncMayTear
609└───
610
611┌───
612    PresentCapability
613	1	PresentCapabilityAsync
614	2	PresentCapabilityFence
615	4	PresentCapabilityUST
616	8	PresentCapabilityAsyncMayTear
617└───
618
619┌───
620    PresentCompleteKind
621	0	PresentCompleteKindPixmap
622	1	PresentCompleteKindMSCNotify
623└───
624
625┌───
626    PresentCompleteMode
627	0	PresentCompleteModeCopy
628	1	PresentCompleteModeFlip
629	2	PresentCompleteModeSkip
630	3	PresentCompleteModeSuboptimalCopy
631└───
632
633┌───
634    PresentNotify
635	4	Window			window
636	4	CARD32			serial
637└───
638
639A.1.1 Common Types proposed for a later Present extension version
640
641┌───
642    PresentEventType
643	...
644	3	PresentRedirectNotify
645└───
646
647┌───
648    PresentEventMask
649	...
650	8	PresentSubredirectNotifyMask
651└───
652
653A.2 Protocol Requests
654
655┌───
656    PresentQueryVersion
657	1	CARD8			major opcode
658	1	0			Present opcode
659	2	3			length
660	4	CARD32			major version
661	4	CARD32			minor version
662663	1	1			Reply
664        1				unused
665	2	CARD16			sequence number
666	4	0			reply length
667	4	CARD32			major version
668        4	CARD32			minor version
669	16				unused	
670└───
671
672┌───
673    PresentPixmap
674	1	CARD8			major opcode
675	1	1			Present opcode
676	2	18+2n			length
677	4	Window			window
678	4	Pixmap			pixmap
679	4	CARD32			serial
680	4	Region			valid-area
681	4	Region			update-area
682	2	INT16			x-off
683	2	INT16			y-off
684	4	CRTC			target-crtc
685	4	SyncFence		wait-fence
686	4	SyncFence		idle-fence
687	4	CARD32			options
688	4				unused
689	8	CARD64			target-msc
690	8	CARD64			divisor
691	8	CARD64			remainder
692	8n	LISTofPresentNotify	notifies
693└───
694
695┌───
696    PresentNotifyMSC
697	1	CARD8			major opcode
698	1	2			Present opcode
699	2	10			length
700	4	Window			window
701	4	CARD32			serial
702	4				unused
703	8	CARD64			target-msc
704	8	CARD64			divisor
705	8	CARD64			remainder
706└───
707
708┌───
709    PresentSelectInput
710	1	CARD8			major opcode
711	1	3			Present opcode
712	2	4			length
713	4	EventID			event-id
714	4	Window			window
715	4	SETofPRESENTEVENTMASK	event-mask
716└───
717
718┌───
719    PresentQueryCapabilities
720	1	CARD8			major opcode
721	1	4			Present opcode
722	2	2			length
723	4	CRTC or Window		target
724725	1	1			Reply
726        1				unused
727	2	CARD16			sequence number
728	4	0			reply length
729	4	SETofPRESENTCAPABILITY	capabilities
730└───
731
732A.3 Protocol Events
733
734┌───
735    PresentConfigureNotify
736	1	35			XGE
737	1	CARD8			Present extension opcode
738	2	CARD16			sequence number
739	4	2			length
740	2	0			PresentConfigureNotify
741	2				unused
742	4	CARD32			event id
743	4	Window			window
744	2	INT16			x
745	2	INT16			y
746	2	CARD16			width
747	2	CARD16			height
748	2	INT16			off x
749	2	INT16			off y
750
751	2	CARD16			pixmap width
752	2	CARD16			pixmap height
753	4	CARD32			pixmap flags
754└───
755
756┌───
757    PresentCompleteNotify
758	1	35			XGE
759	1	CARD8			Present extension opcode
760	2	CARD16			sequence number
761	4	2			length
762	2	1			PresentCompleteNotify
763	1	CARD8			kind
764	1	CARD8			mode
765	4	CARD32			event id
766	4	Window			window
767	4	CARD32			serial
768	8	CARD64			ust
769
770	8	CARD64			msc
771└───
772
773┌───
774    PresentIdleNotify
775	1	35			XGE
776	1	CARD8			Present extension opcode
777	2	CARD16			sequence number
778	4	0			length
779	2	2			PresentIdleNotify
780	2				unused
781	4	CARD32			event id
782	4	Window			window
783	4	CARD32			serial
784	4	Pixmap			pixmap
785	4	SyncFence		idle-fence
786└───
787
788A.3.1 Protocol Events proposed for later Present extension version
789
790┌───
791    PresentRedirectNotify
792	1	35			XGE
793	1	CARD8			Present extension opcode
794	2	CARD16			sequence number
795	4	18+2n			length
796	2	3			PresentRedirectNotify
797	1	BOOL			update-window
798	1				unused
799	4	CARD32			event id
800	4	Window			event-window
801	4	Window			window
802	4	Pixmap			pixmap
803	4	CARD32			serial
804
805	4	Region			valid-area
806	4	Region			update-area
807	8	Rectangle		valid-rect
808	8	Rectangle		update-rect
809	2	INT16			x-off
810	2	INT16			y-off
811	4	CRTC			target-crtc
812	4	SyncFence		wait-fence
813	4	SyncFence		idle-fence
814	4	CARD32			options
815	4				unused
816	8	CARD64			target-msc
817	8	CARD64			divisor
818	8	CARD64			remainder
819	8n	LISTofPRESENTNOTIFY	notifies
820└───
821
822A.4 Protocol Errors
823
824The Present extension defines no errors.
825
826			     ❄ ❄ ❄  ❄  ❄ ❄ ❄
827