Merge "libdrm: add bindgen-generated Rust bindings" into main
diff --git a/Android.bp b/Android.bp
index 7ed9174..ea47195 100644
--- a/Android.bp
+++ b/Android.bp
@@ -81,7 +81,10 @@
     vendor_available: true,
     host_supported: true,
     defaults: ["libdrm_defaults"],
-    export_include_dirs: ["include/drm", "android"],
+    export_include_dirs: [
+        "include/drm",
+        "android",
+    ],
     apex_available: [
         "//apex_available:platform",
         "com.android.virt",
@@ -92,14 +95,22 @@
 cc_library {
     name: "libdrm",
     recovery_available: true,
-    vendor_available: true,
     host_supported: true,
+    vendor_available: true,
+    product_available: true,
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
     defaults: [
         "libdrm_defaults",
         "libdrm_sources",
     ],
 
-    export_include_dirs: ["include/drm", "android"],
+    export_include_dirs: [
+        "include/drm",
+        "android",
+    ],
 
     cflags: [
         "-Wno-enum-conversion",
@@ -107,8 +118,50 @@
         "-Wno-sign-compare",
         "-Wno-tautological-compare",
     ],
+}
+
+// Rust bindings for libdrm, generated in a way compatible with drm-ffi crate.
+rust_bindgen {
+    name: "libdrm_sys",
+    crate_name: "drm_sys",
+    wrapper_src: "rust/drm_wrapper.h",
+    source_stem: "bindings",
+    bindgen_flags: [
+        "--ctypes-prefix=core::ffi",
+        "--no-prepend-enum-name",
+        "--with-derive-default",
+        "--with-derive-hash",
+        "--with-derive-eq",
+        "--blocklist-type=drm_handle_t",
+        "--blocklist-type=__BINDGEN_TMP_.*",
+        "--blocklist-type=drm_control_DRM_ADD_COMMAND",
+        "--allowlist-type=_?DRM_.*|drm_.*|hdr_.*",
+        "--allowlist-var=_?DRM_.*|drm_.*",
+        "--constified-enum-module=drm_control_.*",
+        "--constified-enum-module=drm_buf_desc_.*",
+        "--constified-enum-module=drm_map_type",
+        "--constified-enum-module=drm_map_flags",
+        "--constified-enum-module=drm_stat_type",
+        "--constified-enum-module=drm_lock_flags",
+        "--constified-enum-module=drm_dma_flags",
+        "--constified-enum-module=drm_ctx_flags",
+        "--constified-enum-module=drm_drawable_info_type_t",
+        "--constified-enum-module=drm_vblank_seq_type",
+        "--constified-enum-module=drm_mode_subconnector",
+    ],
+    shared_libs: [
+        "libdrm",
+        "libcutils",
+        "liblog",
+    ],
+    host_supported: true,
+    vendor_available: true,
+    product_available: true,
     apex_available: [
+        "//apex_available:anyapex",
         "//apex_available:platform",
-        "com.android.virt",
+    ],
+    visibility: [
+        "//external/rust/crates/drm-ffi",
     ],
 }
diff --git a/rust/drm_wrapper.h b/rust/drm_wrapper.h
new file mode 100644
index 0000000..98d877e
--- /dev/null
+++ b/rust/drm_wrapper.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2024 Google LLC
+ */
+
+#include <fcntl.h>
+#include <xf86drm.h>
+#include <xf86drmMode.h>
+
+// bindgen doesn't create constants for macros that expand to other macros
+// https://github.com/Smithay/drm-rs/blob/328742fddc675b3370057b382eb54acbc9b48c79/drm-ffi/drm-sys/build.rs#L110
+
+const unsigned int __BINDGEN_TMP_DRM_MODE_PROP_OBJECT = DRM_MODE_PROP_OBJECT;
+#undef DRM_MODE_PROP_OBJECT
+const unsigned int DRM_MODE_PROP_OBJECT = __BINDGEN_TMP_DRM_MODE_PROP_OBJECT;
+#define DRM_MODE_PROP_OBJECT DRM_MODE_PROP_OBJECT
+
+const unsigned int __BINDGEN_TMP_DRM_MODE_PROP_SIGNED_RANGE =
+    DRM_MODE_PROP_SIGNED_RANGE;
+#undef DRM_MODE_PROP_SIGNED_RANGE
+const unsigned int DRM_MODE_PROP_SIGNED_RANGE =
+    __BINDGEN_TMP_DRM_MODE_PROP_SIGNED_RANGE;
+#define DRM_MODE_PROP_SIGNED_RANGE DRM_MODE_PROP_SIGNED_RANGE