blob: 7c62cc314cefc8717d7765322c782c7c5a5eaff3 [file] [log] [blame]
Name
MESA_map_buffer_client_pointer
Name Strings
GL_MESA_map_buffer_client_pointer
Contact
Derek Lesho <dlesho@codeweavers.com>
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 <access> parameter of MapBufferRange:
MAP_CLIENT_POINTER_BIT_MESA 0x4000
Accepted by the <pname> 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 <addr> set to the start of a page-aligned address range of size
<size> with read and write permissions. The added ranges are global
state, which may be used and reused for any buffers mapped with
<access> 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 <size> 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 <access> 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.