[PATCH 1/4] winevulkan: Use standard CRT memory allocators.

Georg Lehmann dadschoorse at gmail.com
Tue Apr 13 10:16:57 CDT 2021


Thanks for the explanation!

On 13.04.21 14:45, Jacek Caban wrote:
> Hi Georg,
> 
> On 13.04.2021 09:52, Georg Lehmann wrote:
>> On 13.04.21 00:53, Jacek Caban wrote:
>>> Signed-off-by: Jacek Caban <jacek at codeweavers.com>
>>> ---
>>> In preparation for split PE/.so parts.
>>>
>>>   dlls/winevulkan/make_vulkan |   8 +--
>>>   dlls/winevulkan/vulkan.c    | 111 ++++++++++++++++++------------------
>>>   2 files changed, 60 insertions(+), 59 deletions(-)
>>>
>>>
>>
>> Hi,
>>
>> could you give an overview of all the changes that you are planning to
>> make for the .so/PE split? winevulkan had quite a few contributors over
>> the past years, and I think those who aren't part of codeweavers aren't
>> super familiar with wine internals. I would certainly like to know more
>> about the implications of this rework. 
> 
> 
> Sure. Generally, Wine is moving towards stricter separation between 
> PE/Windows side and Unix side. This already has a great effect on 
> compatibility with stuff like API hooking, DRMs, debuggers etc. In the 
> future, this will be also needed for stuff like 32on64.
> 
> 
> In practice, in its current shape, it means that winevulkan should be 
> built as a PE file. As such, it may do Windows calls, but not direct 
> Unix calls. For Unix calls, it will have a separated .so library. .so 
> library exports its internal interface to PE side and can do any Unix 
> calls. However, .so part should avoid calling PE side, so it's very 
> limited to what win32 APIs it can use. #pragma makedep unix controls 
> which side given source file lives on.
> 
> 
> In case of winevulkan, the transition is quite straightforward. Most of 
> the code can live in .so part (namely, vulkan.c and vulkan_thunks.c). 
> There are a few Windows calls that we need to be moved out of there and 
> this series moves most of win32 calls out of vulkan.c. We will also need 
> dispatch tables and exported functions on PE part, so that will need 
> another thin layer of thunking. Using wine_vkResetEvent as an example, 
> in my WIP tree, there is a new PE function for PE side:
> 
> 
> VkResult WINAPI wine_vkResetEvent(VkDevice device, VkEvent event)
> {
>      return unix_funcs->p_vkResetEvent(device, event);
> }
> 
> 
> That's what applications can see, while unix_funcs->p_vkResetEvent 
> points to the existing vkResetEvent thunk living in .so part:
> 
> 
> VkResult WINAPI unix_vkResetEvent(VkDevice device, VkEvent event)
> {
>      TRACE("%p, 0x%s\n", device, wine_dbgstr_longlong(event));
>      return device->funcs.p_vkResetEvent(device->device, event);
> }
> 

This sounds like it could potentially negatively affect performance up
to a measurable degree due to another indirection. But I guess there's
no way to have a function in the unix library (with the correct calling
convention and everything) and to return that from the PE in
vkGet*ProcAddr?

Thanks,

Georg



More information about the wine-devel mailing list