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

James Jones <[email protected]> Tue, 22 Oct 2024 10:32:12 -0700
Newsgroups gmane.comp.video.mesa3d.devel,gmane.comp.emulators.wine.devel
Message-ID <[email protected]>
This sounds interesting, but does it come with the same "Only gets 2GB 
VA" downside Derek pointed out in the thread fork where he was 
responding to Michel?

Thanks,
-James

On 10/22/24 07:14, Christian König wrote:
> 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
>>
>