exts->KHR_swapchain_mutable_format = true;
#endif
#endif /* ANDROID */
+
+ exts->EXT_physical_device_drm = true;
}
static void
VkPhysicalDeviceConservativeRasterizationPropertiesEXT
*conservative_rasterization;
VkPhysicalDeviceCustomBorderColorPropertiesEXT *custom_border_color;
+ VkPhysicalDeviceDrmPropertiesEXT *drm;
VkPhysicalDeviceLineRasterizationPropertiesEXT *line_rasterization;
VkPhysicalDevicePCIBusInfoPropertiesEXT *pci_bus_info;
VkPhysicalDevicePresentationPropertiesANDROID *presentation_properties;
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;
#include <unistd.h>
#include <xf86drm.h>
+#ifdef MAJOR_IN_MKDEV
+#include <sys/mkdev.h>
+#endif
+#ifdef MAJOR_IN_SYSMACROS
+#include <sys/sysmacros.h>
+#endif
+
#include "drm-uapi/virtgpu_drm.h"
#include "util/sparse_array.h"
#define VIRGL_RENDERER_UNSTABLE_APIS
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;
{
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;
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);
}
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;
{
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;