Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
f30f8a42
Commit
f30f8a42
authored
Apr 24, 2024
by
Rémi Bernon
Committed by
Alexandre Julliard
May 01, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
win32u: Return the host surface directly from vulkan_surface_create.
parent
7d2d8c7e
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
37 additions
and
90 deletions
+37
-90
vulkan.c
dlls/win32u/vulkan.c
+5
-12
vulkan.c
dlls/winemac.drv/vulkan.c
+10
-26
vulkan.c
dlls/winewayland.drv/vulkan.c
+10
-23
vulkan.c
dlls/winex11.drv/vulkan.c
+9
-25
vulkan_driver.h
include/wine/vulkan_driver.h
+3
-4
No files found.
dlls/win32u/vulkan.c
View file @
f30f8a42
...
...
@@ -52,7 +52,7 @@ static void *(*p_vkGetInstanceProcAddr)(VkInstance, const char *);
struct
surface
{
VkSurfaceKHR
host_surface
;
VkSurfaceKHR
driver_surfac
e
;
void
*
driver_privat
e
;
HWND
hwnd
;
};
...
...
@@ -76,14 +76,13 @@ static VkResult win32u_vkCreateWin32SurfaceKHR( VkInstance instance, const VkWin
if
(
allocator
)
FIXME
(
"Support for allocation callbacks not implemented yet
\n
"
);
if
(
!
(
surface
=
calloc
(
1
,
sizeof
(
*
surface
)
)))
return
VK_ERROR_OUT_OF_HOST_MEMORY
;
if
((
res
=
driver_funcs
->
p_vulkan_surface_create
(
info
->
hwnd
,
instance
,
&
surface
->
driver_surfac
e
)))
if
((
res
=
driver_funcs
->
p_vulkan_surface_create
(
info
->
hwnd
,
instance
,
&
surface
->
host_surface
,
&
surface
->
driver_privat
e
)))
{
free
(
surface
);
return
res
;
}
surface
->
hwnd
=
info
->
hwnd
;
surface
->
host_surface
=
driver_funcs
->
p_wine_get_host_surface
(
surface
->
driver_surface
);
*
handle
=
surface_to_handle
(
surface
);
return
VK_SUCCESS
;
}
...
...
@@ -96,7 +95,7 @@ static void win32u_vkDestroySurfaceKHR( VkInstance instance, VkSurfaceKHR handle
if
(
allocator
)
FIXME
(
"Support for allocation callbacks not implemented yet
\n
"
);
p_vkDestroySurfaceKHR
(
instance
,
surface
->
host_surface
,
NULL
/* allocator */
);
driver_funcs
->
p_vulkan_surface_destroy
(
surface
->
hwnd
,
surface
->
driver_
surfac
e
);
driver_funcs
->
p_vulkan_surface_destroy
(
surface
->
hwnd
,
surface
->
driver_
privat
e
);
free
(
surface
);
}
...
...
@@ -164,13 +163,13 @@ static struct vulkan_funcs vulkan_funcs =
.
p_wine_get_host_surface
=
win32u_wine_get_host_surface
,
};
static
VkResult
nulldrv_vulkan_surface_create
(
HWND
hwnd
,
VkInstance
instance
,
VkSurfaceKHR
*
surface
)
static
VkResult
nulldrv_vulkan_surface_create
(
HWND
hwnd
,
VkInstance
instance
,
VkSurfaceKHR
*
surface
,
void
**
private
)
{
FIXME
(
"stub!
\n
"
);
return
VK_ERROR_INCOMPATIBLE_DRIVER
;
}
static
void
nulldrv_vulkan_surface_destroy
(
HWND
hwnd
,
VkSurfaceKHR
surfac
e
)
static
void
nulldrv_vulkan_surface_destroy
(
HWND
hwnd
,
void
*
privat
e
)
{
}
...
...
@@ -188,11 +187,6 @@ static const char *nulldrv_get_host_surface_extension(void)
return
"VK_WINE_nulldrv_surface"
;
}
static
VkSurfaceKHR
nulldrv_wine_get_host_surface
(
VkSurfaceKHR
surface
)
{
return
surface
;
}
static
const
struct
vulkan_driver_funcs
nulldrv_funcs
=
{
.
p_vulkan_surface_create
=
nulldrv_vulkan_surface_create
,
...
...
@@ -200,7 +194,6 @@ static const struct vulkan_driver_funcs nulldrv_funcs =
.
p_vulkan_surface_presented
=
nulldrv_vulkan_surface_presented
,
.
p_vkGetPhysicalDeviceWin32PresentationSupportKHR
=
nulldrv_vkGetPhysicalDeviceWin32PresentationSupportKHR
,
.
p_get_host_surface_extension
=
nulldrv_get_host_surface_extension
,
.
p_wine_get_host_surface
=
nulldrv_wine_get_host_surface
,
};
static
void
vulkan_init
(
void
)
...
...
dlls/winemac.drv/vulkan.c
View file @
f30f8a42
...
...
@@ -56,7 +56,6 @@ struct wine_vk_surface
{
macdrv_metal_device
device
;
macdrv_metal_view
view
;
VkSurfaceKHR
host_surface
;
/* host surface */
};
typedef
struct
VkMacOSSurfaceCreateInfoMVK
...
...
@@ -81,11 +80,6 @@ static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice,
static
const
struct
vulkan_driver_funcs
macdrv_vulkan_driver_funcs
;
static
inline
struct
wine_vk_surface
*
surface_from_handle
(
VkSurfaceKHR
handle
)
{
return
(
struct
wine_vk_surface
*
)(
uintptr_t
)
handle
;
}
static
void
wine_vk_surface_destroy
(
struct
wine_vk_surface
*
surface
)
{
if
(
surface
->
view
)
...
...
@@ -97,13 +91,13 @@ static void wine_vk_surface_destroy(struct wine_vk_surface *surface)
free
(
surface
);
}
static
VkResult
macdrv_vulkan_surface_create
(
HWND
hwnd
,
VkInstance
instance
,
VkSurfaceKHR
*
surface
)
static
VkResult
macdrv_vulkan_surface_create
(
HWND
hwnd
,
VkInstance
instance
,
VkSurfaceKHR
*
surface
,
void
**
private
)
{
VkResult
res
;
struct
wine_vk_surface
*
mac_surface
;
struct
macdrv_win_data
*
data
;
TRACE
(
"%p %p %p
\n
"
,
hwnd
,
instance
,
surfac
e
);
TRACE
(
"%p %p %p
%p
\n
"
,
hwnd
,
instance
,
surface
,
privat
e
);
if
(
!
(
data
=
get_win_data
(
hwnd
)))
{
...
...
@@ -144,7 +138,7 @@ static VkResult macdrv_vulkan_surface_create(HWND hwnd, VkInstance instance, VkS
create_info_host
.
flags
=
0
;
/* reserved */
create_info_host
.
pLayer
=
macdrv_view_get_metal_layer
(
mac_surface
->
view
);
res
=
pvkCreateMetalSurfaceEXT
(
instance
,
&
create_info_host
,
NULL
/* allocator */
,
&
mac_surface
->
host_
surface
);
res
=
pvkCreateMetalSurfaceEXT
(
instance
,
&
create_info_host
,
NULL
/* allocator */
,
surface
);
}
else
{
...
...
@@ -154,7 +148,7 @@ static VkResult macdrv_vulkan_surface_create(HWND hwnd, VkInstance instance, VkS
create_info_host
.
flags
=
0
;
/* reserved */
create_info_host
.
pView
=
macdrv_view_get_metal_layer
(
mac_surface
->
view
);
res
=
pvkCreateMacOSSurfaceMVK
(
instance
,
&
create_info_host
,
NULL
/* allocator */
,
&
mac_surface
->
host_
surface
);
res
=
pvkCreateMacOSSurfaceMVK
(
instance
,
&
create_info_host
,
NULL
/* allocator */
,
surface
);
}
if
(
res
!=
VK_SUCCESS
)
{
...
...
@@ -162,11 +156,11 @@ static VkResult macdrv_vulkan_surface_create(HWND hwnd, VkInstance instance, VkS
goto
err
;
}
*
surface
=
(
uintptr_t
)
mac_surface
;
release_win_data
(
data
);
TRACE
(
"Created surface=0x%s
\n
"
,
wine_dbgstr_longlong
(
*
surface
));
*
private
=
mac_surface
;
TRACE
(
"Created surface=0x%s, private=%p
\n
"
,
wine_dbgstr_longlong
(
*
surface
),
*
private
);
return
VK_SUCCESS
;
err:
...
...
@@ -175,11 +169,11 @@ err:
return
res
;
}
static
void
macdrv_vulkan_surface_destroy
(
HWND
hwnd
,
VkSurfaceKHR
surfac
e
)
static
void
macdrv_vulkan_surface_destroy
(
HWND
hwnd
,
void
*
privat
e
)
{
struct
wine_vk_surface
*
mac_surface
=
surface_from_handle
(
surface
)
;
struct
wine_vk_surface
*
mac_surface
=
private
;
TRACE
(
"%p
0x%s
\n
"
,
hwnd
,
wine_dbgstr_longlong
(
surface
)
);
TRACE
(
"%p
%p
\n
"
,
hwnd
,
private
);
wine_vk_surface_destroy
(
mac_surface
);
}
...
...
@@ -201,15 +195,6 @@ static const char *macdrv_get_host_surface_extension(void)
return
pvkCreateMetalSurfaceEXT
?
"VK_EXT_metal_surface"
:
"VK_MVK_macos_surface"
;
}
static
VkSurfaceKHR
macdrv_wine_get_host_surface
(
VkSurfaceKHR
surface
)
{
struct
wine_vk_surface
*
mac_surface
=
surface_from_handle
(
surface
);
TRACE
(
"0x%s
\n
"
,
wine_dbgstr_longlong
(
surface
));
return
mac_surface
->
host_surface
;
}
static
const
struct
vulkan_driver_funcs
macdrv_vulkan_driver_funcs
=
{
.
p_vulkan_surface_create
=
macdrv_vulkan_surface_create
,
...
...
@@ -218,7 +203,6 @@ static const struct vulkan_driver_funcs macdrv_vulkan_driver_funcs =
.
p_vkGetPhysicalDeviceWin32PresentationSupportKHR
=
macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR
,
.
p_get_host_surface_extension
=
macdrv_get_host_surface_extension
,
.
p_wine_get_host_surface
=
macdrv_wine_get_host_surface
,
};
UINT
macdrv_VulkanInit
(
UINT
version
,
void
*
vulkan_handle
,
const
struct
vulkan_driver_funcs
**
driver_funcs
)
...
...
dlls/winewayland.drv/vulkan.c
View file @
f30f8a42
...
...
@@ -61,14 +61,8 @@ static const struct vulkan_driver_funcs wayland_vulkan_driver_funcs;
struct
wine_vk_surface
{
struct
wayland_client_surface
*
client
;
VkSurfaceKHR
host_surface
;
};
static
struct
wine_vk_surface
*
wine_vk_surface_from_handle
(
VkSurfaceKHR
handle
)
{
return
(
struct
wine_vk_surface
*
)(
uintptr_t
)
handle
;
}
static
HWND
wine_vk_surface_get_hwnd
(
struct
wine_vk_surface
*
wine_vk_surface
)
{
return
wl_surface_get_user_data
(
wine_vk_surface
->
client
->
wl_surface
);
...
...
@@ -93,21 +87,20 @@ static void wine_vk_surface_destroy(struct wine_vk_surface *wine_vk_surface)
free
(
wine_vk_surface
);
}
static
VkResult
wayland_vulkan_surface_create
(
HWND
hwnd
,
VkInstance
instance
,
VkSurfaceKHR
*
vk_surfac
e
)
static
VkResult
wayland_vulkan_surface_create
(
HWND
hwnd
,
VkInstance
instance
,
VkSurfaceKHR
*
surface
,
void
**
privat
e
)
{
VkResult
res
;
VkWaylandSurfaceCreateInfoKHR
create_info_host
;
struct
wine_vk_surface
*
wine_vk_surface
;
struct
wayland_surface
*
wayland_surface
;
TRACE
(
"%p %p %p
\n
"
,
hwnd
,
instance
,
vk_surfac
e
);
TRACE
(
"%p %p %p
%p
\n
"
,
hwnd
,
instance
,
surface
,
privat
e
);
wine_vk_surface
=
calloc
(
1
,
sizeof
(
*
wine_vk_surface
));
if
(
!
wine_vk_surface
)
{
ERR
(
"Failed to allocate memory for wayland vulkan surface
\n
"
);
res
=
VK_ERROR_OUT_OF_HOST_MEMORY
;
goto
err
;
return
VK_ERROR_OUT_OF_HOST_MEMORY
;
}
wayland_surface
=
wayland_surface_lock_hwnd
(
hwnd
);
...
...
@@ -138,28 +131,28 @@ static VkResult wayland_vulkan_surface_create(HWND hwnd, VkInstance instance, Vk
res
=
pvkCreateWaylandSurfaceKHR
(
instance
,
&
create_info_host
,
NULL
/* allocator */
,
&
wine_vk_surface
->
host_
surface
);
surface
);
if
(
res
!=
VK_SUCCESS
)
{
ERR
(
"Failed to create vulkan wayland surface, res=%d
\n
"
,
res
);
goto
err
;
}
*
vk_surface
=
(
uintptr_t
)
wine_vk_surface
;
*
private
=
wine_vk_surface
;
TRACE
(
"Created surface=0x%s
\n
"
,
wine_dbgstr_longlong
(
*
vk_surface
)
);
TRACE
(
"Created surface=0x%s
, private=%p
\n
"
,
wine_dbgstr_longlong
(
*
surface
),
*
private
);
return
VK_SUCCESS
;
err:
if
(
wine_vk_surface
)
wine_vk_surface_destroy
(
wine_vk_surface
);
wine_vk_surface_destroy
(
wine_vk_surface
);
return
res
;
}
static
void
wayland_vulkan_surface_destroy
(
HWND
hwnd
,
VkSurfaceKHR
surfac
e
)
static
void
wayland_vulkan_surface_destroy
(
HWND
hwnd
,
void
*
privat
e
)
{
struct
wine_vk_surface
*
wine_vk_surface
=
wine_vk_surface_from_handle
(
surface
)
;
struct
wine_vk_surface
*
wine_vk_surface
=
private
;
TRACE
(
"%p
0x%s
\n
"
,
hwnd
,
wine_dbgstr_longlong
(
surface
)
);
TRACE
(
"%p
%p
\n
"
,
hwnd
,
private
);
wine_vk_surface_destroy
(
wine_vk_surface
);
}
...
...
@@ -199,11 +192,6 @@ static const char *wayland_get_host_surface_extension(void)
return
"VK_KHR_wayland_surface"
;
}
static
VkSurfaceKHR
wayland_wine_get_host_surface
(
VkSurfaceKHR
surface
)
{
return
wine_vk_surface_from_handle
(
surface
)
->
host_surface
;
}
static
const
struct
vulkan_driver_funcs
wayland_vulkan_driver_funcs
=
{
.
p_vulkan_surface_create
=
wayland_vulkan_surface_create
,
...
...
@@ -212,7 +200,6 @@ static const struct vulkan_driver_funcs wayland_vulkan_driver_funcs =
.
p_vkGetPhysicalDeviceWin32PresentationSupportKHR
=
wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR
,
.
p_get_host_surface_extension
=
wayland_get_host_surface_extension
,
.
p_wine_get_host_surface
=
wayland_wine_get_host_surface
,
};
/**********************************************************************
...
...
dlls/winex11.drv/vulkan.c
View file @
f30f8a42
...
...
@@ -59,7 +59,6 @@ struct wine_vk_surface
LONG
ref
;
struct
list
entry
;
Window
window
;
VkSurfaceKHR
host_surface
;
HWND
hwnd
;
DWORD
hwnd_thread_id
;
};
...
...
@@ -78,11 +77,6 @@ static VkBool32 (*pvkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevi
static
const
struct
vulkan_driver_funcs
x11drv_vulkan_driver_funcs
;
static
inline
struct
wine_vk_surface
*
surface_from_handle
(
VkSurfaceKHR
handle
)
{
return
(
struct
wine_vk_surface
*
)(
uintptr_t
)
handle
;
}
static
void
wine_vk_surface_release
(
struct
wine_vk_surface
*
surface
)
{
if
(
InterlockedDecrement
(
&
surface
->
ref
))
...
...
@@ -131,13 +125,13 @@ void vulkan_thread_detach(void)
pthread_mutex_unlock
(
&
vulkan_mutex
);
}
static
VkResult
X11DRV_vulkan_surface_create
(
HWND
hwnd
,
VkInstance
instance
,
VkSurfaceKHR
*
surface
)
static
VkResult
X11DRV_vulkan_surface_create
(
HWND
hwnd
,
VkInstance
instance
,
VkSurfaceKHR
*
surface
,
void
**
private
)
{
VkResult
res
;
VkXlibSurfaceCreateInfoKHR
create_info_host
;
struct
wine_vk_surface
*
x11_surface
;
TRACE
(
"%p %p %p
\n
"
,
hwnd
,
instance
,
surfac
e
);
TRACE
(
"%p %p %p
%p
\n
"
,
hwnd
,
instance
,
surface
,
privat
e
);
/* TODO: support child window rendering. */
if
(
NtUserGetAncestor
(
hwnd
,
GA_PARENT
)
!=
NtUserGetDesktopWindow
())
...
...
@@ -157,7 +151,7 @@ static VkResult X11DRV_vulkan_surface_create( HWND hwnd, VkInstance instance, Vk
if
(
!
x11_surface
->
window
)
{
ERR
(
"Failed to allocate client window for hwnd=%p
\n
"
,
hwnd
);
ERR
(
"Failed to allocate client window for hwnd=%p
\n
"
,
hwnd
);
/* VK_KHR_win32_surface only allows out of host and device memory as errors. */
free
(
x11_surface
);
...
...
@@ -170,7 +164,7 @@ static VkResult X11DRV_vulkan_surface_create( HWND hwnd, VkInstance instance, Vk
create_info_host
.
dpy
=
gdi_display
;
create_info_host
.
window
=
x11_surface
->
window
;
res
=
pvkCreateXlibSurfaceKHR
(
instance
,
&
create_info_host
,
NULL
/* allocator */
,
&
x11_surface
->
host_
surface
);
res
=
pvkCreateXlibSurfaceKHR
(
instance
,
&
create_info_host
,
NULL
/* allocator */
,
surface
);
if
(
res
!=
VK_SUCCESS
)
{
ERR
(
"Failed to create Xlib surface, res=%d
\n
"
,
res
);
...
...
@@ -183,17 +177,17 @@ static VkResult X11DRV_vulkan_surface_create( HWND hwnd, VkInstance instance, Vk
list_add_tail
(
&
surface_list
,
&
x11_surface
->
entry
);
pthread_mutex_unlock
(
&
vulkan_mutex
);
*
surface
=
(
uintptr_t
)
x11_surface
;
*
private
=
x11_surface
;
TRACE
(
"Created surface
=0x%s
\n
"
,
wine_dbgstr_longlong
(
*
surface
)
);
TRACE
(
"Created surface
0x%s, private %p
\n
"
,
wine_dbgstr_longlong
(
*
surface
),
*
private
);
return
VK_SUCCESS
;
}
static
void
X11DRV_vulkan_surface_destroy
(
HWND
hwnd
,
VkSurfaceKHR
surfac
e
)
static
void
X11DRV_vulkan_surface_destroy
(
HWND
hwnd
,
void
*
privat
e
)
{
struct
wine_vk_surface
*
x11_surface
=
surface_from_handle
(
surface
)
;
struct
wine_vk_surface
*
x11_surface
=
private
;
TRACE
(
"%p
0x%s
\n
"
,
hwnd
,
wine_dbgstr_longlong
(
surface
)
);
TRACE
(
"%p
%p
\n
"
,
hwnd
,
private
);
wine_vk_surface_release
(
x11_surface
);
}
...
...
@@ -216,15 +210,6 @@ static const char *X11DRV_get_host_surface_extension(void)
return
"VK_KHR_xlib_surface"
;
}
static
VkSurfaceKHR
X11DRV_wine_get_host_surface
(
VkSurfaceKHR
surface
)
{
struct
wine_vk_surface
*
x11_surface
=
surface_from_handle
(
surface
);
TRACE
(
"0x%s
\n
"
,
wine_dbgstr_longlong
(
surface
));
return
x11_surface
->
host_surface
;
}
static
const
struct
vulkan_driver_funcs
x11drv_vulkan_driver_funcs
=
{
.
p_vulkan_surface_create
=
X11DRV_vulkan_surface_create
,
...
...
@@ -233,7 +218,6 @@ static const struct vulkan_driver_funcs x11drv_vulkan_driver_funcs =
.
p_vkGetPhysicalDeviceWin32PresentationSupportKHR
=
X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR
,
.
p_get_host_surface_extension
=
X11DRV_get_host_surface_extension
,
.
p_wine_get_host_surface
=
X11DRV_wine_get_host_surface
,
};
UINT
X11DRV_VulkanInit
(
UINT
version
,
void
*
vulkan_handle
,
const
struct
vulkan_driver_funcs
**
driver_funcs
)
...
...
include/wine/vulkan_driver.h
View file @
f30f8a42
...
...
@@ -21,7 +21,7 @@
#define __WINE_VULKAN_DRIVER_H
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */
#define WINE_VULKAN_DRIVER_VERSION 3
2
#define WINE_VULKAN_DRIVER_VERSION 3
3
struct
vulkan_funcs
{
...
...
@@ -44,13 +44,12 @@ struct vulkan_funcs
/* interface between win32u and the user drivers */
struct
vulkan_driver_funcs
{
VkResult
(
*
p_vulkan_surface_create
)(
HWND
,
VkInstance
,
VkSurfaceKHR
*
);
void
(
*
p_vulkan_surface_destroy
)(
HWND
,
VkSurfaceKHR
);
VkResult
(
*
p_vulkan_surface_create
)(
HWND
,
VkInstance
,
VkSurfaceKHR
*
,
void
**
);
void
(
*
p_vulkan_surface_destroy
)(
HWND
,
void
*
);
void
(
*
p_vulkan_surface_presented
)(
HWND
,
VkResult
);
VkBool32
(
*
p_vkGetPhysicalDeviceWin32PresentationSupportKHR
)(
VkPhysicalDevice
,
uint32_t
);
const
char
*
(
*
p_get_host_surface_extension
)(
void
);
VkSurfaceKHR
(
*
p_wine_get_host_surface
)(
VkSurfaceKHR
);
};
#endif
/* __WINE_VULKAN_DRIVER_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment