On 2024-10-18 23:55, Derek Lesho wrote:
> Hey everyone đź‘‹,
> 
> I'm Derek from the Wine project, and wanted to start a discussion with y'all 
> about potentially extending the Mesa OGL drivers to help us with a 
> functionality gap we're facing.
> 
> Problem Space:
> 
> In the last few years Wine's support for running 32-bit windows apps in a 
> 64-bit host environment (wow64) has almost reached feature completion, but 
> there remains a pain point with OpenGL applications: Namely that Wine can't 
> return a 64-bit GL implementation's buffer mappings to a 32 bit application 
> when the address is outside of the 32-bit range.
> 
> Currently, we have a workaround that will copy any changes to the mapping 
> back to the host upon glBufferUnmap, but this of course is slow when the 
> implementation directly returns mapped memory, and doesn't work for 
> GL_PERSISTENT_BIT, where directly mapped memory is required.
> 
> A few years ago we also faced this problem with Vulkan's, which was solved 
> through the VK_EXT_map_memory_placed extension Faith drafted, allowing us to 
> use our Wine-internal allocator to provide the pages the driver maps to. I'm 
> now wondering if an GL equivalent would also be seen as feasible amongst the 
> devs here.
> 
> Proposed solution:
> 
> As the GL backend handles host mapping in its own code, only giving 
> suballocations from its mappings back to the App, the problem is a little bit 
> less straight forward in comparison to our Vulkan solution: If we just 
> allowed the application to set its own placed mapping when calling 
> glMapBuffer, the driver might then have to handle moving buffers out of 
> already mapped ranges, and would lose control over its own memory management 
> schemes.
> 
> Therefore, I propose a GL extension that allows the GL client to provide a 
> mapping and unmapping callback to the implementation, to be used whenever the 
> driver needs to perform such operations. This way the driver remains in full 
> control of its memory management affairs, and the amount of work for an 
> implementation as well as potential for bugs is kept minimal. I've written a 
> draft implementation in Zink using map_memory_placed [1] and a corresponding 
> Wine MR utilizing it [2], and would be curious to hear your thoughts. I don't 
> have experience in the Mesa codebase, so I apologize if the branch is a tad 
> messy.
> 
> In theory, the only requirement from drivers from the extension would be that 
> glMapBuffer always return a pointer from within a page allocated through the 
> provided callbacks, so that it can be guaranteed to be positioned within the 
> required address space. Wine would then use it's existing workaround for 
> other types of buffers, but as Mesa seems to often return directly mapped 
> buffers in other cases as well, Wine could also avoid the slowdown that comes 
> with copying in these cases as well.
Does this really require a callback, or could e.g. a "keep application-visible 
mappings within 32-bit range" context flag work?


-- 
Earthling Michel Dänzer       \        GNOME / Xwayland / Mesa developer
https://redhat.com             \               Libre software enthusiast

Reply via email to