mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-19 06:47:02 -04:00
Merge branch 'renderer-drm-devid' into 'master'
render: replace wlr_renderer_get_drm_fd() with drm_dev_id See merge request wlroots/wlroots!4368
This commit is contained in:
commit
779f37e846
15 changed files with 177 additions and 225 deletions
|
|
@ -1384,11 +1384,6 @@ destroy_image:
|
|||
return false;
|
||||
}
|
||||
|
||||
static int vulkan_get_drm_fd(struct wlr_renderer *wlr_renderer) {
|
||||
struct wlr_vk_renderer *renderer = vulkan_get_renderer(wlr_renderer);
|
||||
return renderer->dev->drm_fd;
|
||||
}
|
||||
|
||||
static struct wlr_render_pass *vulkan_begin_buffer_pass(struct wlr_renderer *wlr_renderer,
|
||||
struct wlr_buffer *buffer, const struct wlr_buffer_pass_options *options) {
|
||||
struct wlr_vk_renderer *renderer = vulkan_get_renderer(wlr_renderer);
|
||||
|
|
@ -1413,7 +1408,6 @@ static const struct wlr_renderer_impl renderer_impl = {
|
|||
.get_texture_formats = vulkan_get_texture_formats,
|
||||
.get_render_formats = vulkan_get_render_formats,
|
||||
.destroy = vulkan_destroy,
|
||||
.get_drm_fd = vulkan_get_drm_fd,
|
||||
.texture_from_buffer = vulkan_texture_from_buffer,
|
||||
.begin_buffer_pass = vulkan_begin_buffer_pass,
|
||||
};
|
||||
|
|
@ -2423,6 +2417,10 @@ struct wlr_renderer *vulkan_renderer_create_for_device(struct wlr_vk_device *dev
|
|||
wl_list_init(&renderer->color_transforms);
|
||||
wl_list_init(&renderer->pipeline_layouts);
|
||||
|
||||
if (vulkan_get_phdev_drm_dev_id(dev->phdev, &renderer->drm_dev_id)) {
|
||||
renderer->wlr_renderer.drm_dev_id = &renderer->drm_dev_id;
|
||||
}
|
||||
|
||||
if (!init_static_render_data(renderer)) {
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -2462,7 +2460,7 @@ error:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct wlr_renderer *wlr_vk_renderer_create_with_drm_fd(int drm_fd) {
|
||||
struct wlr_renderer *wlr_vk_renderer_create_with_drm_dev_id(dev_t dev_id) {
|
||||
wlr_log(WLR_INFO, "The vulkan renderer is only experimental and "
|
||||
"not expected to be ready for daily use");
|
||||
wlr_log(WLR_INFO, "Run with VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation "
|
||||
|
|
@ -2474,7 +2472,7 @@ struct wlr_renderer *wlr_vk_renderer_create_with_drm_fd(int drm_fd) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
VkPhysicalDevice phdev = vulkan_find_drm_phdev(ini, drm_fd);
|
||||
VkPhysicalDevice phdev = vulkan_find_drm_phdev(ini, dev_id);
|
||||
if (!phdev) {
|
||||
// We rather fail here than doing some guesswork
|
||||
wlr_log(WLR_ERROR, "Could not match drm and vulkan device");
|
||||
|
|
@ -2488,15 +2486,6 @@ struct wlr_renderer *wlr_vk_renderer_create_with_drm_fd(int drm_fd) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
// Do not use the drm_fd that was passed in: we should prefer the render
|
||||
// node even if a primary node was provided
|
||||
dev->drm_fd = vulkan_open_phdev_drm_fd(phdev);
|
||||
if (dev->drm_fd < 0) {
|
||||
vulkan_device_destroy(dev);
|
||||
vulkan_instance_destroy(ini);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return vulkan_renderer_create_for_device(dev);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
#undef _POSIX_C_SOURCE
|
||||
#endif
|
||||
#include <assert.h>
|
||||
#include <fcntl.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
|
@ -256,7 +255,7 @@ static void log_phdev(const VkPhysicalDeviceProperties *props) {
|
|||
wlr_log(WLR_INFO, " Driver version: %u.%u.%u", dv_major, dv_minor, dv_patch);
|
||||
}
|
||||
|
||||
VkPhysicalDevice vulkan_find_drm_phdev(struct wlr_vk_instance *ini, int drm_fd) {
|
||||
VkPhysicalDevice vulkan_find_drm_phdev(struct wlr_vk_instance *ini, dev_t devid) {
|
||||
VkResult res;
|
||||
uint32_t num_phdevs;
|
||||
|
||||
|
|
@ -273,12 +272,6 @@ VkPhysicalDevice vulkan_find_drm_phdev(struct wlr_vk_instance *ini, int drm_fd)
|
|||
return VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
struct stat drm_stat = {0};
|
||||
if (fstat(drm_fd, &drm_stat) != 0) {
|
||||
wlr_log_errno(WLR_ERROR, "fstat failed");
|
||||
return VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < num_phdevs; ++i) {
|
||||
VkPhysicalDevice phdev = phdevs[i];
|
||||
|
||||
|
|
@ -353,8 +346,7 @@ VkPhysicalDevice vulkan_find_drm_phdev(struct wlr_vk_instance *ini, int drm_fd)
|
|||
|
||||
dev_t primary_devid = makedev(drm_props.primaryMajor, drm_props.primaryMinor);
|
||||
dev_t render_devid = makedev(drm_props.renderMajor, drm_props.renderMinor);
|
||||
if (primary_devid == drm_stat.st_rdev ||
|
||||
render_devid == drm_stat.st_rdev) {
|
||||
if (primary_devid == devid || render_devid == devid) {
|
||||
wlr_log(WLR_INFO, "Found matching Vulkan physical device: %s",
|
||||
phdev_props.deviceName);
|
||||
return phdev;
|
||||
|
|
@ -364,7 +356,7 @@ VkPhysicalDevice vulkan_find_drm_phdev(struct wlr_vk_instance *ini, int drm_fd)
|
|||
return VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
int vulkan_open_phdev_drm_fd(VkPhysicalDevice phdev) {
|
||||
bool vulkan_get_phdev_drm_dev_id(VkPhysicalDevice phdev, dev_t *dev_id) {
|
||||
// vulkan_find_drm_phdev() already checks that VK_EXT_physical_device_drm
|
||||
// is supported
|
||||
VkPhysicalDeviceDrmPropertiesEXT drm_props = {
|
||||
|
|
@ -376,38 +368,16 @@ int vulkan_open_phdev_drm_fd(VkPhysicalDevice phdev) {
|
|||
};
|
||||
vkGetPhysicalDeviceProperties2(phdev, &props);
|
||||
|
||||
dev_t devid;
|
||||
if (drm_props.hasRender) {
|
||||
devid = makedev(drm_props.renderMajor, drm_props.renderMinor);
|
||||
*dev_id = makedev(drm_props.renderMajor, drm_props.renderMinor);
|
||||
} else if (drm_props.hasPrimary) {
|
||||
devid = makedev(drm_props.primaryMajor, drm_props.primaryMinor);
|
||||
*dev_id = makedev(drm_props.primaryMajor, drm_props.primaryMinor);
|
||||
} else {
|
||||
wlr_log(WLR_ERROR, "Physical device is missing both render and primary nodes");
|
||||
return -1;
|
||||
return false;
|
||||
}
|
||||
|
||||
drmDevice *device = NULL;
|
||||
if (drmGetDeviceFromDevId(devid, 0, &device) != 0) {
|
||||
wlr_log_errno(WLR_ERROR, "drmGetDeviceFromDevId failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char *name = NULL;
|
||||
if (device->available_nodes & (1 << DRM_NODE_RENDER)) {
|
||||
name = device->nodes[DRM_NODE_RENDER];
|
||||
} else {
|
||||
assert(device->available_nodes & (1 << DRM_NODE_PRIMARY));
|
||||
name = device->nodes[DRM_NODE_PRIMARY];
|
||||
wlr_log(WLR_DEBUG, "DRM device %s has no render node, "
|
||||
"falling back to primary node", name);
|
||||
}
|
||||
|
||||
int drm_fd = open(name, O_RDWR | O_NONBLOCK | O_CLOEXEC);
|
||||
if (drm_fd < 0) {
|
||||
wlr_log_errno(WLR_ERROR, "Failed to open DRM node %s", name);
|
||||
}
|
||||
drmFreeDevice(&device);
|
||||
return drm_fd;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void load_device_proc(struct wlr_vk_device *dev, const char *name,
|
||||
|
|
@ -452,7 +422,6 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini,
|
|||
|
||||
dev->phdev = phdev;
|
||||
dev->instance = ini;
|
||||
dev->drm_fd = -1;
|
||||
|
||||
// For dmabuf import we require at least the external_memory_fd,
|
||||
// external_memory_dma_buf, queue_family_foreign,
|
||||
|
|
@ -650,10 +619,6 @@ void vulkan_device_destroy(struct wlr_vk_device *dev) {
|
|||
vkDestroyDevice(dev->dev, NULL);
|
||||
}
|
||||
|
||||
if (dev->drm_fd > 0) {
|
||||
close(dev->drm_fd);
|
||||
}
|
||||
|
||||
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_texture_formats);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue