presentproto.txt revision d63b911f
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 119 ▶ 120 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 system 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 308 ▶ 309 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 639 ▶ 640 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 701 ▶ 702 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