[PATCH v7 4/4] winevulkan: Implement VK_KHR_external_memory_win32 for images.

Derek Lesho dlesho at codeweavers.com
Tue May 25 13:11:40 CDT 2021


On 5/25/21 11:52 AM, Zebediah Figura (she/her) wrote:

> How do you plan to implement the following features:
For what it's worth, all of the ideas I express in this email don't 
apply this patch, but rather planned follow-up patches.  As it relates 
to Vulkan, I don't think there's any approach we take this path makes 
more of a headache.  For example, if we do decide to instead create 
custom object types for resources, all we have to do is extend the 
create_gpu_resource function in that direction.
>
> * named NT paths
>
> * security descriptors
>
> * KMT handles 

I intend to take the approach of wrapping the FD object behind a device 
object, like you suggested in your previous mail.  Device objects can be 
named, and while support for access rights on device file objects 
doesn't seem to be implemented right now, it shouldn't be too hard to 
add this functionality.

https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntoskrnl.exe/ntoskrnl.c#l530

The device objects will be created via IOCTLs to a master "Utility" 
device object, which will handle KMT lookup and user data storage.  For 
unnamed device objects I'm thinking about using 
FILE_AUTOGENERATED_DEVICE_NAME, retrieving the name of the device object 
IoCreateDevice returns, then proceeding as normal and opening/returning 
the handle.


>
> * CL_KHR_d3d11_sharing

OpenCL lacks any equivalent to GL's EXT_external_objects, which is 
"modern" approach to shared resources, meaning it is unable to directly 
share resources with Vulkan.  If needed in the future, I imagine it 
wouldn't be too hard to convince the OpenCL spec people to draft an 
equivalent extension.

To use the extension as it exists in OpenGL right now, we can just use 
the publicly exposed D3D API (GetSharedHandle/CreateSharedHandle for 
D3D11) to get a HANDLE to the device object, then run an IOCTL fetching 
the FD we feed into the extension.  Theoretically we could even use 
EXT_external_objects as an implementation detail for openCL, sharing the 
resource through two steps (first through EXT_external_objects then 
through CL_KHR_gl_sharing), but I imagine there would be some hitch we 
run into there, plus nothing uses OpenCL so why bother.

>
> * CL_KHR_gl_sharing
This doesn't involve what I am working on, both openGL and openCL are 
both host libraries, and should be able to share without any help from wine.
>
> * Shared resources in d3d9-11, when using the OpenGL backend

As mentioned, the EXT_external_objects extension exists, ( 
https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects.txt 
), which accepts and produces file descriptors compatible with the ones 
Vulkan produces and accepts.  The interactions here seem to be well defined.

>
> * Shared resources in d3d9-11, when using the Vulkan backend

The only additional challenge that faces both D3D implementations of any 
backend is that along with referencing the raw GPU payload, certain 
metadata is also stored in the resource objects.  However, this metadata 
is not stored by the host implementation (either GL or Vulkan), meaning 
it has to be tracked by us somehow.  For this, inside the device objects 
there will be user data that translation layers can access through IOCTLs.

As to not artificially hamstring certain implementations, I plan to 
leave the structure of this user data translation-layer defined.  To 
this end, I think it would be useful to store a GUID key needed to 
set/get the user data, so that translation layers doesn't try to parse 
user data with an unknown format.  This still leaves open the 
possibility of converging onto a single key if possible.

>
> * Shared resources in d3d12
Nothing special here, as the D3D12 model for sharing seems to be quite 
similar to the Vulkan one in that you share heaps, not resources.  It 
looks like it's a 1:1 mapping from a D3D12 heap to a Vulkan Device 
Memory object.
>
> * Shared resources between d3d9-12 devices, when using wined3d or 
> libvkd3d on Windows
Putting aside how rare and questionable of a use-case this must be, I 
don't think this concerns any of my patches.  My future patches would 
provide a way for translation layers on wine to store metadata alongside 
the host handlers, it doesn't have any correspondence to Windows.  If 
you really wanted to (why?), you could probably create your own backing 
storage in a shared memory object and accept the caveats that come along 
with that.
>
> * Shared resources between d3d9-12 devices and OpenGL or Vulkan, when 
> using wined3d or libvkd3d on Windows

Again, a questionable and rare use-case not related to the patches I 
intend to send, but I'll try to brainstorm something.

If you don't control the code trying to import your D3D resources into 
Vulkan or GL, you'll have to either

1) Figure out how to register the resources in your translation layer 
with Windows in such a way that it thinks the resources belong to the 
APIs you are implementing (as the Windows driver for Vulkan or GL will 
have to recognize it as such), or instead

2) Try to create an implicit Vulkan layer (for GL it would be much 
harder) that intercepts calls trying to import D3D objects, and instead 
imports the NT/KMT handles your translation layer can retrieve from Vulkan.

>
> Please give detailed walkthroughs, including code if possible, or 
> detailed explanations of why any of these can't be done.
>
>
> I note your tests also don't seem very interesting; they only share 
> objects within the same device. Sharing objects across multiple 
> devices, and across multiple processes, strikes me as more interesting.

In my opinion, given that the semantics for VK_KHR_external_memory_fd 
and VK_KHR_external_memory_win32 are so similar, I wonder how relevant 
such tests would be, it seems like the kind of thing the Vulkan CTS 
should add for testing drivers.

I think the tests should be more for testing the properties of the 
HANDLEs we get, as this is what we are implementing ourselves.  Maybe I 
should add more tests looking at the locations of the named objects in 
the NT directory, or tests relating to types of the objects and their 
access permissions.




More information about the wine-devel mailing list