Re: Helping Wine use 64 bit Mesa OGL drivers for 32-bit Windows applications

Christian König <[email protected]> Tue, 22 Oct 2024 16:14:46 +0200
Newsgroups gmane.comp.video.mesa3d.devel,gmane.comp.emulators.wine.devel
Message-ID <[email protected]>
Hi guys,

one theoretical alternative not mentioned in this thread is the use of 
mremap().

In other words you reserve some address space below 2G by using 
mmap(NULL, length, PROT_NONE, MAP_32BIT | MAP_ANONYMOUS, 0, 0) and then 
use mremap(addr64bit, 0, length, MREMAP_FIXED, reserved_addr).

I haven't tested this but at least in theory it should give you a 
duplicate of the 64bit mapping in the lower 2G of the address space.

Important is that you give 0 as oldsize to mremap() so that the old 
mapping isn't unmapped but rather just a new mapping of the existing VMA 
created.

Regards,
Christian.


Am 18.10.24 um 23:55 schrieb Derek Lesho:
> 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.
>
> Why not use Zink?:
>
> There's also a proposal to use a 32-bit PE build of Zink in Wine 
> bypassing the need for an extension; I brought this to discussion in 
> this Wine-Devel thread last week [3], which has some arguments against 
> this approach.
>
>
> If any of you have thoughts, concerns, or questions about this 
> potential approach, please let me know, thanks!
>
> 1: 
> https://gitlab.freedesktop.org/Guy1524/mesa/-/commits/placed_allocation
>
> 2: https://gitlab.winehq.org/wine/wine/-/merge_requests/6663
>
> 3: https://marc.info/?t=172883260300002&r=1&w=2
>