mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-21 06:46:46 -04:00
wip: add support for Vulkan software rendering
VK_EXT_external_memory_host allows us to instruct llvmpipe to render to an existing chunk of memory.
This commit is contained in:
parent
77951968dc
commit
e2518ea9de
6 changed files with 215 additions and 26 deletions
|
|
@ -303,7 +303,7 @@ VkPhysicalDevice vulkan_find_drm_phdev(struct wlr_vk_instance *ini, int drm_fd)
|
|||
}
|
||||
|
||||
struct stat drm_stat = {0};
|
||||
if (fstat(drm_fd, &drm_stat) != 0) {
|
||||
if (drm_fd >= 0 && fstat(drm_fd, &drm_stat) != 0) {
|
||||
wlr_log_errno(WLR_ERROR, "fstat failed");
|
||||
return VK_NULL_HANDLE;
|
||||
}
|
||||
|
|
@ -370,6 +370,15 @@ VkPhysicalDevice vulkan_find_drm_phdev(struct wlr_vk_instance *ini, int drm_fd)
|
|||
wlr_log(WLR_INFO, " Driver name: %s (%s)", driver_props.driverName, driver_props.driverInfo);
|
||||
}
|
||||
|
||||
if (drm_fd < 0) {
|
||||
if (phdev_props.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU) {
|
||||
wlr_log(WLR_INFO, "Found matching Vulkan physical device: %s",
|
||||
phdev_props.deviceName);
|
||||
return phdev;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!has_drm_props) {
|
||||
wlr_log(WLR_DEBUG, " Ignoring physical device \"%s\": "
|
||||
"VK_EXT_physical_device_drm not supported",
|
||||
|
|
@ -449,9 +458,9 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini,
|
|||
const char *names[] = {
|
||||
VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
|
||||
VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, // or vulkan 1.2
|
||||
VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME,
|
||||
VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME,
|
||||
VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME,
|
||||
//VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME,
|
||||
//VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME,
|
||||
//VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME,
|
||||
};
|
||||
|
||||
unsigned nc = sizeof(names) / sizeof(names[0]);
|
||||
|
|
@ -466,6 +475,11 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini,
|
|||
dev->extensions[dev->extension_count++] = names[i];
|
||||
}
|
||||
|
||||
const char *name = "VK_EXT_external_memory_host";
|
||||
if (find_extensions(avail_ext_props, avail_extc, &name, 1) == NULL) {
|
||||
dev->extensions[dev->extension_count++] = name;
|
||||
}
|
||||
|
||||
// queue families
|
||||
{
|
||||
uint32_t qfam_count;
|
||||
|
|
@ -514,12 +528,15 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini,
|
|||
// load api
|
||||
dev->api.getMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)
|
||||
vkGetDeviceProcAddr(dev->dev, "vkGetMemoryFdPropertiesKHR");
|
||||
|
||||
if (!dev->api.getMemoryFdPropertiesKHR) {
|
||||
wlr_log(WLR_ERROR, "Failed to retrieve required dev function pointers");
|
||||
goto error;
|
||||
}
|
||||
|
||||
dev->api.getMemoryHostPointerPropertiesEXT =
|
||||
(PFN_vkGetMemoryHostPointerPropertiesEXT)
|
||||
vkGetDeviceProcAddr(dev->dev, "vkGetMemoryHostPointerPropertiesEXT");
|
||||
|
||||
// - check device format support -
|
||||
size_t max_fmts;
|
||||
const struct wlr_vk_format *fmts = vulkan_get_format_list(&max_fmts);
|
||||
|
|
@ -556,6 +573,7 @@ void vulkan_device_destroy(struct wlr_vk_device *dev) {
|
|||
|
||||
wlr_drm_format_set_finish(&dev->dmabuf_render_formats);
|
||||
wlr_drm_format_set_finish(&dev->dmabuf_texture_formats);
|
||||
wlr_drm_format_set_finish(&dev->shm_render_formats);
|
||||
|
||||
for (unsigned i = 0u; i < dev->format_prop_count; ++i) {
|
||||
vulkan_format_props_finish(&dev->format_props[i]);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue