Blob Blame History Raw
From 05ec8d7a160aa5fb1a7fb47c6711e3e95348fbf7 Mon Sep 17 00:00:00 2001
From: Aleksei Bavshin <alebastr89@gmail.com>
Date: Tue, 8 Nov 2022 18:37:13 -0800
Subject: [PATCH 1/2] Compatibility with libdrm 2.4.112

---
 meson.build                  | 2 +-
 render/allocator/gbm.c       | 7 ++-----
 render/egl.c                 | 5 +----
 render/vulkan/pixel_format.c | 6 ++----
 types/output/render.c        | 7 ++-----
 5 files changed, 8 insertions(+), 19 deletions(-)

diff --git a/meson.build b/meson.build
index 5dd38e1a..b2fbcf33 100644
--- a/meson.build
+++ b/meson.build
@@ -107,7 +107,7 @@ wayland_server = dependency('wayland-server',
 )
 
 drm = dependency('libdrm',
-	version: '>=2.4.113',
+	version: '>=2.4.112',
 	fallback: 'libdrm',
 	default_options: [
 		'intel=disabled',
diff --git a/render/allocator/gbm.c b/render/allocator/gbm.c
index f77fedd8..805d80e3 100644
--- a/render/allocator/gbm.c
+++ b/render/allocator/gbm.c
@@ -138,14 +138,11 @@ static struct wlr_gbm_buffer *create_buffer(struct wlr_gbm_allocator *alloc,
 		buffer->dmabuf.modifier = fallback_modifier;
 	}
 
-	char *format_name = drmGetFormatName(buffer->dmabuf.format);
 	char *modifier_name = drmGetFormatModifierName(buffer->dmabuf.modifier);
 	wlr_log(WLR_DEBUG, "Allocated %dx%d GBM buffer "
-		"with format %s (0x%08"PRIX32"), modifier %s (0x%016"PRIX64")",
-		buffer->base.width, buffer->base.height,
-		format_name ? format_name : "<unknown>", buffer->dmabuf.format,
+		"with format 0x%08"PRIX32", modifier %s (0x%016"PRIX64")",
+		buffer->base.width, buffer->base.height, buffer->dmabuf.format,
 		modifier_name ? modifier_name : "<unknown>", buffer->dmabuf.modifier);
-	free(format_name);
 	free(modifier_name);
 
 	return buffer;
diff --git a/render/egl.c b/render/egl.c
index e3839c7d..13068fe2 100644
--- a/render/egl.c
+++ b/render/egl.c
@@ -161,10 +161,7 @@ static void init_dmabuf_formats(struct wlr_egl *egl) {
 		}
 
 		if (wlr_log_get_verbosity() >= WLR_DEBUG) {
-			char *fmt_name = drmGetFormatName(fmt);
-			wlr_log(WLR_DEBUG, "  %s (0x%08"PRIX32")",
-				fmt_name ? fmt_name : "<unknown>", fmt);
-			free(fmt_name);
+			wlr_log(WLR_DEBUG, "  0x%08"PRIX32"", fmt);
 
 			log_modifier(DRM_FORMAT_MOD_INVALID, false);
 			if (modifiers_len == 0) {
diff --git a/render/vulkan/pixel_format.c b/render/vulkan/pixel_format.c
index f55063d7..d0008648 100644
--- a/render/vulkan/pixel_format.c
+++ b/render/vulkan/pixel_format.c
@@ -234,10 +234,8 @@ void vulkan_format_props_query(struct wlr_vk_device *dev,
 		const struct wlr_vk_format *format) {
 	VkResult res;
 
-	char *format_name = drmGetFormatName(format->drm_format);
-	wlr_log(WLR_DEBUG, "  %s (0x%08"PRIX32")",
-		format_name ? format_name : "<unknown>", format->drm_format);
-	free(format_name);
+	wlr_log(WLR_DEBUG, " %.4s (0x08%"PRIx32")",
+		(const char *)&format->drm_format, format->drm_format);
 
 	// get general features and modifiers
 	VkFormatProperties2 fmtp = {0};
diff --git a/types/output/render.c b/types/output/render.c
index 13d714e1..862f67f5 100644
--- a/types/output/render.c
+++ b/types/output/render.c
@@ -4,7 +4,6 @@
 #include <wlr/interfaces/wlr_output.h>
 #include <wlr/render/interface.h>
 #include <wlr/util/log.h>
-#include <xf86drm.h>
 #include "backend/backend.h"
 #include "render/allocator/allocator.h"
 #include "render/drm_format_set.h"
@@ -71,10 +70,8 @@ static bool output_create_swapchain(struct wlr_output *output,
 		return true;
 	}
 
-	char *format_name = drmGetFormatName(format->format);
-	wlr_log(WLR_DEBUG, "Choosing primary buffer format %s (0x%08"PRIX32") for output '%s'",
-		format_name ? format_name : "<unknown>", format->format, output->name);
-	free(format_name);
+	wlr_log(WLR_DEBUG, "Choosing primary buffer format 0x%"PRIX32" for output '%s'",
+		format->format, output->name);
 
 	if (!allow_modifiers && (format->len != 1 || format->modifiers[0] != DRM_FORMAT_MOD_LINEAR)) {
 		if (!wlr_drm_format_has(format, DRM_FORMAT_MOD_INVALID)) {
-- 
2.37.3


From 99798f45c7a407c2a97c7ac2883c348b8e71c8c1 Mon Sep 17 00:00:00 2001
From: Aleksei Bavshin <alebastr89@gmail.com>
Date: Tue, 8 Nov 2022 18:37:51 -0800
Subject: [PATCH 2/2] Compatibility with libdrm 2.4.109

---
 backend/drm/drm.c          | 29 ++++++++++++++++++++---------
 backend/drm/util.c         | 31 +++++++++++++++++++++++++++++++
 include/backend/drm/util.h |  2 ++
 meson.build                |  2 +-
 4 files changed, 54 insertions(+), 10 deletions(-)

diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index 04994c68..9576de17 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -1141,6 +1141,23 @@ static struct wlr_drm_crtc *connector_get_current_crtc(
 	return NULL;
 }
 
+static uint32_t get_possible_crtcs(int fd, const drmModeConnector *conn) {
+	uint32_t possible_crtcs = 0;
+
+	for (int i = 0; i < conn->count_encoders; ++i) {
+		drmModeEncoder *enc = drmModeGetEncoder(fd, conn->encoders[i]);
+		if (!enc) {
+			continue;
+		}
+
+		possible_crtcs |= enc->possible_crtcs;
+
+		drmModeFreeEncoder(enc);
+	}
+
+	return possible_crtcs;
+}
+
 static struct wlr_drm_connector *create_drm_connector(struct wlr_drm_backend *drm,
 		const drmModeConnector *drm_conn) {
 	struct wlr_drm_connector *wlr_conn = calloc(1, sizeof(*wlr_conn));
@@ -1153,17 +1170,11 @@ static struct wlr_drm_connector *create_drm_connector(struct wlr_drm_backend *dr
 	wlr_conn->status = DRM_MODE_DISCONNECTED;
 	wlr_conn->id = drm_conn->connector_id;
 
-	const char *conn_name =
-		drmModeGetConnectorTypeName(drm_conn->connector_type);
-	if (conn_name == NULL) {
-		conn_name = "Unknown";
-	}
-
 	snprintf(wlr_conn->name, sizeof(wlr_conn->name),
-		"%s-%"PRIu32, conn_name, drm_conn->connector_type_id);
+		"%s-%"PRIu32, conn_get_name(drm_conn->connector_type),
+		drm_conn->connector_type_id);
 
-	wlr_conn->possible_crtcs =
-		drmModeConnectorGetPossibleCrtcs(drm->fd, drm_conn);
+	wlr_conn->possible_crtcs = get_possible_crtcs(drm->fd, drm_conn);
 	if (wlr_conn->possible_crtcs == 0) {
 		wlr_drm_conn_log(wlr_conn, WLR_ERROR, "No CRTC possible");
 	}
diff --git a/backend/drm/util.c b/backend/drm/util.c
index 03c4b0b4..6e0df7c5 100644
--- a/backend/drm/util.c
+++ b/backend/drm/util.c
@@ -119,6 +119,37 @@ void parse_edid(struct wlr_drm_connector *conn, size_t len, const uint8_t *data)
 	}
 }
 
+const char *conn_get_name(uint32_t type_id) {
+	switch (type_id) {
+	case DRM_MODE_CONNECTOR_Unknown:     return "Unknown";
+	case DRM_MODE_CONNECTOR_VGA:         return "VGA";
+	case DRM_MODE_CONNECTOR_DVII:        return "DVI-I";
+	case DRM_MODE_CONNECTOR_DVID:        return "DVI-D";
+	case DRM_MODE_CONNECTOR_DVIA:        return "DVI-A";
+	case DRM_MODE_CONNECTOR_Composite:   return "Composite";
+	case DRM_MODE_CONNECTOR_SVIDEO:      return "SVIDEO";
+	case DRM_MODE_CONNECTOR_LVDS:        return "LVDS";
+	case DRM_MODE_CONNECTOR_Component:   return "Component";
+	case DRM_MODE_CONNECTOR_9PinDIN:     return "DIN";
+	case DRM_MODE_CONNECTOR_DisplayPort: return "DP";
+	case DRM_MODE_CONNECTOR_HDMIA:       return "HDMI-A";
+	case DRM_MODE_CONNECTOR_HDMIB:       return "HDMI-B";
+	case DRM_MODE_CONNECTOR_TV:          return "TV";
+	case DRM_MODE_CONNECTOR_eDP:         return "eDP";
+	case DRM_MODE_CONNECTOR_VIRTUAL:     return "Virtual";
+	case DRM_MODE_CONNECTOR_DSI:         return "DSI";
+	case DRM_MODE_CONNECTOR_DPI:         return "DPI";
+	case DRM_MODE_CONNECTOR_WRITEBACK:   return "Writeback";
+#ifdef DRM_MODE_CONNECTOR_SPI
+	case DRM_MODE_CONNECTOR_SPI:         return "SPI";
+#endif
+#ifdef DRM_MODE_CONNECTOR_USB
+	case DRM_MODE_CONNECTOR_USB:         return "USB";
+#endif
+	default:                             return "Unknown";
+	}
+}
+
 static bool is_taken(size_t n, const uint32_t arr[static n], uint32_t key) {
 	for (size_t i = 0; i < n; ++i) {
 		if (arr[i] == key) {
diff --git a/include/backend/drm/util.h b/include/backend/drm/util.h
index 9bfe5f8a..4979d906 100644
--- a/include/backend/drm/util.h
+++ b/include/backend/drm/util.h
@@ -14,6 +14,8 @@ enum wlr_output_mode_aspect_ratio get_picture_aspect_ratio(const drmModeModeInfo
 const char *get_pnp_manufacturer(uint16_t code);
 // Populates the make/model/phys_{width,height} of output from the edid data
 void parse_edid(struct wlr_drm_connector *conn, size_t len, const uint8_t *data);
+// Returns the string representation of a DRM output type
+const char *conn_get_name(uint32_t type_id);
 
 // Part of match_obj
 enum {
diff --git a/meson.build b/meson.build
index b2fbcf33..b673ab20 100644
--- a/meson.build
+++ b/meson.build
@@ -107,7 +107,7 @@ wayland_server = dependency('wayland-server',
 )
 
 drm = dependency('libdrm',
-	version: '>=2.4.112',
+	version: '>=2.4.109',
 	fallback: 'libdrm',
 	default_options: [
 		'intel=disabled',
-- 
2.37.3