aboutsummaryrefslogtreecommitdiff
path: root/include/backend/drm
diff options
context:
space:
mode:
Diffstat (limited to 'include/backend/drm')
-rw-r--r--include/backend/drm/bo_handle_table.h24
-rw-r--r--include/backend/drm/drm.h4
-rw-r--r--include/backend/drm/iface.h1
-rw-r--r--include/backend/drm/renderer.h4
-rw-r--r--include/backend/drm/util.h2
5 files changed, 28 insertions, 7 deletions
diff --git a/include/backend/drm/bo_handle_table.h b/include/backend/drm/bo_handle_table.h
new file mode 100644
index 00000000..d086df45
--- /dev/null
+++ b/include/backend/drm/bo_handle_table.h
@@ -0,0 +1,24 @@
+#ifndef BACKEND_DRM_BO_HANDLE_TABLE_H
+#define BACKEND_DRM_BO_HANDLE_TABLE_H
+
+/**
+ * Table performing reference counting for buffer object handles.
+ *
+ * The BO handles are allocated incrementally and are recycled by the kernel,
+ * so a simple array is used.
+ *
+ * This design is inspired from amdgpu's code in libdrm:
+ * https://gitlab.freedesktop.org/mesa/drm/-/blob/1a4c0ec9aea13211997f982715fe5ffcf19dd067/amdgpu/handle_table.c
+ */
+struct wlr_drm_bo_handle_table {
+ size_t *nrefs;
+ size_t len;
+};
+
+void drm_bo_handle_table_finish(struct wlr_drm_bo_handle_table *table);
+bool drm_bo_handle_table_ref(struct wlr_drm_bo_handle_table *table,
+ uint32_t handle);
+size_t drm_bo_handle_table_unref(struct wlr_drm_bo_handle_table *table,
+ uint32_t handle);
+
+#endif
diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h
index 9aae5e0b..d57ddbf4 100644
--- a/include/backend/drm/drm.h
+++ b/include/backend/drm/drm.h
@@ -1,7 +1,6 @@
#ifndef BACKEND_DRM_DRM_H
#define BACKEND_DRM_DRM_H
-#include <gbm.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
@@ -12,6 +11,7 @@
#include <wlr/backend/session.h>
#include <wlr/render/drm_format_set.h>
#include <xf86drmMode.h>
+#include "backend/drm/bo_handle_table.h"
#include "backend/drm/iface.h"
#include "backend/drm/properties.h"
#include "backend/drm/renderer.h"
@@ -62,7 +62,7 @@ struct wlr_drm_backend {
int fd;
char *name;
struct wlr_device *dev;
- struct gbm_device *gbm;
+ struct wlr_drm_bo_handle_table bo_handles;
size_t num_crtcs;
struct wlr_drm_crtc *crtcs;
diff --git a/include/backend/drm/iface.h b/include/backend/drm/iface.h
index e02c2199..98f7e06c 100644
--- a/include/backend/drm/iface.h
+++ b/include/backend/drm/iface.h
@@ -1,7 +1,6 @@
#ifndef BACKEND_DRM_IFACE_H
#define BACKEND_DRM_IFACE_H
-#include <gbm.h>
#include <stdbool.h>
#include <stdint.h>
#include <xf86drm.h>
diff --git a/include/backend/drm/renderer.h b/include/backend/drm/renderer.h
index 70a9533b..d6f878c5 100644
--- a/include/backend/drm/renderer.h
+++ b/include/backend/drm/renderer.h
@@ -1,7 +1,6 @@
#ifndef BACKEND_DRM_RENDERER_H
#define BACKEND_DRM_RENDERER_H
-#include <gbm.h>
#include <stdbool.h>
#include <stdint.h>
#include <wlr/backend.h>
@@ -30,9 +29,10 @@ struct wlr_drm_surface {
struct wlr_drm_fb {
struct wlr_buffer *wlr_buf;
struct wlr_addon addon;
+ struct wlr_drm_backend *backend;
struct wl_list link; // wlr_drm_backend.fbs
- struct gbm_bo *bo;
+ uint32_t handles[WLR_DMABUF_MAX_PLANES];
uint32_t id;
};
diff --git a/include/backend/drm/util.h b/include/backend/drm/util.h
index 15895ec6..b4cdee7d 100644
--- a/include/backend/drm/util.h
+++ b/include/backend/drm/util.h
@@ -13,8 +13,6 @@ void parse_edid(struct wlr_output *restrict output, 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);
-// Returns the DRM framebuffer id for a gbm_bo
-uint32_t get_fb_for_bo(struct gbm_bo *bo, bool with_modifiers);
// Part of match_obj
enum {