Name NV_triple_buffer NV_quadruple_buffer Name Strings EGL_NV_triple_buffer EGL_NV_quadruple_buffer Contributors Daniel Kartch, NVIDIA Corporation Tom McReynolds, NVIDIA Corporation Santanu Thangaraj, NVIDIA Corporation Contact Daniel Kartch, NVIDIA Corporation (dkartch 'at' nvidia.com) Status Complete. Version Version 1 - February 28, 2019 Number 133 Extension Type EGL display extension Dependencies Requires EGL 1.0 This extension is written against the wording of the EGL 1.3 Specification. Overview NV_triple_buffer and NV_quadruple_buffer allow applications to request additional back buffers, in order to produce greater and less variable frame rates. This document describes two related extensions, one dependent on the other. Implementations may choose to support only NV_triple_buffer and not NV_quadruple_buffer, but not vice versa. New Types None New Procedures and Functions None New Tokens Added by NV_triple_buffer: Accepted as a value for EGL_RENDER_BUFFER in the parameter of eglCreateWindowSurface: EGL_TRIPLE_BUFFER_NV 0x3230 Added by NV_quadruple_buffer: Accepted as a value for EGL_RENDER_BUFFER in the parameter of eglCreateWindowSurface: EGL_QUADRUPLE_BUFFER_NV 0x3231 Additions to the EGL 1.3 Specification: Insert after third sentence of second paragraph of Section 2.2.2 (Rendering Models): Windows may have more than one back buffer, allowing rendering of a new frame to proceed while the copy requested by eglSwapBuffers is still pending. Replace the third sentence of the EGL_RENDER_BUFFER description in Section 3.5.1 (Creating On-Screen Rendering Surfaces): If its value is EGL_BACK_BUFFER, EGL_TRIPLE_BUFFER_NV, or EGL_QUADRUPLE_BUFFER_NV, then client APIs should render into the current back buffer. The implementation should provide at least one, two, or three back buffers, respectively, which will be used in rotation each frame. Change first sentence of third bullet point of eglQueryContext description in Section 3.7.4 (Context Queries): If the context is bound to a window surface, then either EGL_SINGLE_BUFFER, EGL_BACK_BUFFER, EGL_TRIPLE_BUFFER_NV, or EGL_QUADRUPLE_BUFFER_NV may be returned. Replace first sentence of eglSwapBuffers description in Section 3.9.1 (Posting to a Window): If surface is a back-buffered window surface, then the current color buffer is copied to the native window associated with that surface. If there is more than one back buffer, then the next color buffer in rotation becomes current, and rendering of the next frame may proceed before the copy takes place, provided any previous swaps from the new current buffer have completed. Issues 1. Why do we need triple-buffering? RESOLVED: With only a single back buffer and a non-zero swap interval, eglSwapBuffers must block rendering to the back- buffer until the copy has completed. This can leave the CPU and/or GPU idle, wasting valuable compute time, and possibly cause the next frame to be delivered later than otherwise could have been. Additional buffers allow rendering to continue even when a frame is awaiting display, maximizing our use of computational resources. 2. Why quadruple-buffering? Isn't triple-buffering enough to produce frames as fast as the processor(s) and swap interval allow? RESOLVED: When there is only a single rendering stream operating on a system, triple-buffering is sufficient. However, if other threads are contending for resources, variable latencies may be introduced. This is especially problematic with video, where any deviation in frame rate from the recorded media can produce visible artifacts. Additional buffers smooth out these latencies, allowing a steady frame rate. 3. Then why not arbitrary n-buffering? RESOLVED: The TRIPLE/QUADRUPLE buffer specification fits nicely into the RENDER_BUFFER attribute already in use for eglCreateWindowSurface. Arbitrary buffer counts would require a new attribute. Additionally, case studies indicated no significant benefit to using more than three back buffers, especially when factoring in the added memory cost. Revision History #2 (February 28, 2019) Santanu Thangaraj - Marked issues 1,2 and 3 as resolved. - Included extension type section. - Corrected line length violations. #1 (August 12, 2008) Daniel Kartch - Initial Draft