Name MESA_map_buffer_client_pointer Name Strings GL_MESA_map_buffer_client_pointer Contact Derek Lesho Contributors Derek Lesho, Codeweavers Status Proposal Version Version 1, February, 2026 Number OpenGL Extension 562 Dependencies OpenGL 3.0 or ARB_map_buffer_ranged is required. This extension is written against the OpenGL 4.6 (Core Profile) Specification. Overview This extension allows the application to specify pointer ranges within which buffers should be mapped. This extension is proposed to help the WINE project [https://winehq.org], which implements the 32-bit Windows OpenGL ABI on top of 64-bit Linux, return an address in the 32-bit address range from Map(Named)Buffer(Range). IP Status None Issues None New Procedures and Functions void AddClientPointerRangeMESA( void *addr, sizeiptr size ); void *ReleaseClientPointerRangeMESA( sizeiptr *size ); New Types None New Tokens Accepted by the parameter of MapBufferRange: MAP_CLIENT_POINTER_BIT_MESA 0x4000 Accepted by the parameter of GetBufferParameter{i|i64}v: BUFFER_CLIENT_POINTER_SIZE_MESA 0x9790 Additions to Chapter 6 of the OpenGL Core Profile Specification, Version 4.6, "Buffer Objects" Modify Section 6.3, "Mapping and Unmapping Buffer Data" Add to the bulleted list describing flags that modify buffer mappings, p.73. * MAP_CLIENT_POINTER_BIT_MESA indicates the mapped buffer pointer must be in an address range provided by AddClientPointerRangeMESA. If no space is found here, an OUT_OF_MEMORY error is generated. Append to Section 6.3 "Mapping and Unmapping Buffer Data", p.78. If a buffer is mapped with the MAP_CLIENT_POINTER_BIT_MESA flag, the returned pointer will be in a range provided by the application through void AddClientPointerRangeMESA( void *addr, sizeiptr size ); with set to the start of a page-aligned address range of size with read and write permissions. The added ranges are global state, which may be used and reused for any buffers mapped with including MAP_CLIENT_POINTER_BIT_MESA. The driver will hold this address range as long as any buffers are mapped in it. To reacquire the pages, first unmap any buffers in the range, call Flush, and thence void *ReleaseClientPointerRangeMESA( sizeiptr *size ); will return the range back to the application, with relaying back the size of the returned range. While the pages sit in the driver, memory access in any manner other than as defined by Map(Named)BufferRange is not permitted, and results in undefined behavior. Errors An OUT_OF_MEMORY error is generated by Map(Named)BufferRange if MAP_CLIENT_POINTER_BIT_MESA is included in but no space can be found for a mapping in the ranges provided by AddClientPointerRangeMESA. In this case, the buffer object state value BUFFER_CLIENT_POINTER_SIZE_MESA is set to the size required of a new client pointer range to enable mapping the buffer with MAP_CLIENT_POINTER_BIT_MESA. Revision History Version 1, 2026-2-25 (Derek Lesho) Initial draft.