diff --git a/src/virtio/vulkan/vn_physical_device.c b/src/virtio/vulkan/vn_physical_device.c index c9bd7218350..f03d49fe339 100644 --- a/src/virtio/vulkan/vn_physical_device.c +++ b/src/virtio/vulkan/vn_physical_device.c @@ -928,6 +928,8 @@ vn_physical_device_get_native_extensions( exts->KHR_swapchain_mutable_format = true; #endif #endif /* ANDROID */ + + exts->EXT_physical_device_drm = true; } static void @@ -1893,6 +1895,7 @@ vn_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, VkPhysicalDeviceConservativeRasterizationPropertiesEXT *conservative_rasterization; VkPhysicalDeviceCustomBorderColorPropertiesEXT *custom_border_color; + VkPhysicalDeviceDrmPropertiesEXT *drm; VkPhysicalDeviceLineRasterizationPropertiesEXT *line_rasterization; VkPhysicalDevicePCIBusInfoPropertiesEXT *pci_bus_info; VkPhysicalDevicePresentationPropertiesANDROID *presentation_properties; @@ -2095,6 +2098,20 @@ vn_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: *u.custom_border_color = props->custom_border_color; break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: + u.drm->hasPrimary = + physical_dev->instance->renderer->info.drm.has_primary; + u.drm->primaryMajor = + physical_dev->instance->renderer->info.drm.primary_major; + u.drm->primaryMinor = + physical_dev->instance->renderer->info.drm.primary_minor; + u.drm->hasRender = + physical_dev->instance->renderer->info.drm.has_render; + u.drm->renderMajor = + physical_dev->instance->renderer->info.drm.render_major; + u.drm->renderMinor = + physical_dev->instance->renderer->info.drm.render_minor; + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: *u.line_rasterization = props->line_rasterization; break; diff --git a/src/virtio/vulkan/vn_renderer.h b/src/virtio/vulkan/vn_renderer.h index 24abfc961ad..a8207c6b85b 100644 --- a/src/virtio/vulkan/vn_renderer.h +++ b/src/virtio/vulkan/vn_renderer.h @@ -41,6 +41,15 @@ struct vn_renderer_sync { }; struct vn_renderer_info { + struct { + bool has_primary; + int primary_major; + int primary_minor; + bool has_render; + int render_major; + int render_minor; + } drm; + struct { uint16_t vendor_id; uint16_t device_id; diff --git a/src/virtio/vulkan/vn_renderer_virtgpu.c b/src/virtio/vulkan/vn_renderer_virtgpu.c index 5c7c82db12f..fb876911c27 100644 --- a/src/virtio/vulkan/vn_renderer_virtgpu.c +++ b/src/virtio/vulkan/vn_renderer_virtgpu.c @@ -12,6 +12,13 @@ #include #include +#ifdef MAJOR_IN_MKDEV +#include +#endif +#ifdef MAJOR_IN_SYSMACROS +#include +#endif + #include "drm-uapi/virtgpu_drm.h" #include "util/sparse_array.h" #define VIRGL_RENDERER_UNSTABLE_APIS @@ -99,7 +106,12 @@ struct virtgpu { struct vn_instance *instance; int fd; - int version_minor; + + bool has_primary; + int primary_major; + int primary_minor; + int render_major; + int render_minor; int bustype; drmPciBusInfo pci_bus_info; @@ -1375,6 +1387,13 @@ virtgpu_init_renderer_info(struct virtgpu *gpu) { struct vn_renderer_info *info = &gpu->base.info; + info->drm.has_primary = gpu->has_primary; + info->drm.primary_major = gpu->primary_major; + info->drm.primary_minor = gpu->primary_minor; + info->drm.has_render = true; + info->drm.render_major = gpu->render_major; + info->drm.render_minor = gpu->render_minor; + info->pci.vendor_id = VIRTGPU_PCI_VENDOR_ID; info->pci.device_id = VIRTGPU_PCI_DEVICE_ID; @@ -1583,6 +1602,7 @@ virtgpu_open_device(struct virtgpu *gpu, const drmDevicePtr dev) return VK_ERROR_INITIALIZATION_FAILED; } + const char *primary_path = dev->nodes[DRM_NODE_PRIMARY]; const char *node_path = dev->nodes[DRM_NODE_RENDER]; int fd = open(node_path, O_RDWR | O_CLOEXEC); @@ -1610,7 +1630,21 @@ virtgpu_open_device(struct virtgpu *gpu, const drmDevicePtr dev) } gpu->fd = fd; - gpu->version_minor = version->version_minor; + + struct stat st; + if (stat(primary_path, &st) == 0) { + gpu->has_primary = true; + gpu->primary_major = major(st.st_rdev); + gpu->primary_minor = minor(st.st_rdev); + } else { + gpu->has_primary = false; + gpu->primary_major = 0; + gpu->primary_minor = 0; + } + stat(node_path, &st); + gpu->render_major = major(st.st_rdev); + gpu->render_minor = minor(st.st_rdev); + gpu->bustype = dev->bustype; if (dev->bustype == DRM_BUS_PCI) gpu->pci_bus_info = *dev->businfo.pci; diff --git a/src/virtio/vulkan/vn_renderer_vtest.c b/src/virtio/vulkan/vn_renderer_vtest.c index dd20111887d..8d37a65dd24 100644 --- a/src/virtio/vulkan/vn_renderer_vtest.c +++ b/src/virtio/vulkan/vn_renderer_vtest.c @@ -927,6 +927,13 @@ vtest_init_renderer_info(struct vtest *vtest) { struct vn_renderer_info *info = &vtest->base.info; + info->drm.has_primary = false; + info->drm.primary_major = 0; + info->drm.primary_minor = 0; + info->drm.has_render = false; + info->drm.render_major = 0; + info->drm.render_minor = 0; + info->pci.vendor_id = VTEST_PCI_VENDOR_ID; info->pci.device_id = VTEST_PCI_DEVICE_ID;