venus: implement VK_EXT_physical_device_drm

Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17387>
This commit is contained in:
Clément Guérin 2022-07-06 16:04:32 -07:00 committed by Marge Bot
parent fdf550cdf0
commit a1a22862c6
4 changed files with 69 additions and 2 deletions

View File

@ -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;

View File

@ -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;

View File

@ -12,6 +12,13 @@
#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
@ -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;

View File

@ -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;