[PATCH 2/4] ntdll: Add custom helpers for interfacing with GPU Resource objects.

Derek Lesho dlesho at codeweavers.com
Wed Oct 30 11:46:48 CDT 2019


Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
 dlls/ntdll/Makefile.in    |   1 +
 dlls/ntdll/gpu_resource.c | 104 ++++++++++++++++++++++++++++++++++++++
 dlls/ntdll/ntdll.spec     |   5 ++
 3 files changed, 110 insertions(+)
 create mode 100644 dlls/ntdll/gpu_resource.c

diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
index 9b4d70f6e8..ba4c7b8149 100644
--- a/dlls/ntdll/Makefile.in
+++ b/dlls/ntdll/Makefile.in
@@ -19,6 +19,7 @@ C_SRCS = \
 	error.c \
 	exception.c \
 	file.c \
+	gpu_resource.c \
 	handletable.c \
 	heap.c \
 	large_int.c \
diff --git a/dlls/ntdll/gpu_resource.c b/dlls/ntdll/gpu_resource.c
new file mode 100644
index 0000000000..63488016b1
--- /dev/null
+++ b/dlls/ntdll/gpu_resource.c
@@ -0,0 +1,104 @@
+#include "config.h"
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "ntdll_misc.h"
+#include "dxgi1_2.h"
+
+/* Closes Staging FD afterwards if successful */
+NTSTATUS CDECL __wine_create_gpu_resource(PHANDLE handle, PHANDLE kmt_handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr, int fd )
+{
+    NTSTATUS ret;
+    data_size_t len;
+    struct object_attributes *objattr;
+
+    if ((ret = alloc_object_attributes( attr, &objattr, &len ))) return ret;
+
+    wine_server_send_fd( fd );
+
+    SERVER_START_REQ( create_gpu_resource )
+    {
+        req->access = access;
+        req->fd = fd;
+        wine_server_add_data( req, objattr, len );
+        ret = wine_server_call( req );
+        if(handle) *handle = wine_server_ptr_handle( reply->handle );
+        if(kmt_handle) *kmt_handle = wine_server_ptr_handle( reply->kmt_handle );
+    }
+    SERVER_END_REQ;
+
+    RtlFreeHeap( GetProcessHeap(), 0, objattr );
+    if (!ret)
+        close(fd);
+
+    return ret;
+}
+
+/* Opens a GPU-resource handle from a KMT handle or name */
+NTSTATUS CDECL __wine_open_gpu_resource(HANDLE kmt_handle, OBJECT_ATTRIBUTES *attr, DWORD access, PHANDLE handle )
+{
+    NTSTATUS ret;
+
+    if ((kmt_handle && attr) || !handle)
+        return STATUS_INVALID_PARAMETER;
+
+    SERVER_START_REQ( open_gpu_resource )
+    {
+        req->access = access;
+        req->kmt_handle = wine_server_obj_handle( kmt_handle );
+        if (attr)
+        {
+            req->attributes = attr->Attributes;
+            req->rootdir    = wine_server_obj_handle( attr->RootDirectory );
+            if (attr->ObjectName)
+                wine_server_add_data( req, attr->ObjectName->Buffer, attr->ObjectName->Length );
+        }
+        if (!(ret = wine_server_call( req )))
+            *handle = wine_server_ptr_handle( reply->handle );
+        else
+            *handle = INVALID_HANDLE_VALUE;
+    }
+    SERVER_END_REQ;
+
+    return ret;
+}
+
+
+/* Gets an FD from GPU resource handle */
+NTSTATUS CDECL __wine_get_gpu_resource_fd(HANDLE handle, int *fd, int *needs_close)
+{
+    NTSTATUS ret;
+    enum server_fd_type type;
+
+    ret = server_get_unix_fd( handle, DXGI_SHARED_RESOURCE_READ|DXGI_SHARED_RESOURCE_WRITE, fd, needs_close, &type, NULL );
+
+    if (type != FD_TYPE_RESOURCE)
+    {
+        if (*needs_close)
+            close(*fd);
+        *fd = -1;
+        return STATUS_INVALID_HANDLE;
+    }
+
+    return ret;
+}
+
+/* gets KMT handle */
+NTSTATUS CDECL __wine_get_gpu_resource_info(HANDLE handle, HANDLE *kmt_handle)
+{
+    NTSTATUS ret;
+
+    SERVER_START_REQ(query_gpu_resource)
+    {
+        req->handle = wine_server_obj_handle( handle );
+        if (!(ret = wine_server_call(req)))
+            *kmt_handle = wine_server_ptr_handle( reply->kmt_handle );
+    }
+    SERVER_END_REQ;
+
+    return ret;
+}
\ No newline at end of file
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 06811edf01..4cc03469f9 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1570,3 +1570,8 @@
 # Filesystem
 @ cdecl wine_nt_to_unix_file_name(ptr ptr long long)
 @ cdecl wine_unix_to_nt_file_name(ptr ptr)
+
+@ cdecl __wine_create_gpu_resource(ptr ptr long ptr long)
+@ cdecl __wine_open_gpu_resource(ptr ptr long ptr)
+@ cdecl __wine_get_gpu_resource_fd(ptr ptr ptr)
+@ cdecl __wine_get_gpu_resource_info(ptr ptr)
\ No newline at end of file
-- 
2.23.0




More information about the wine-devel mailing list