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