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:
parent
fdf550cdf0
commit
a1a22862c6
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue