cf12defd28
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
204 lines
5.3 KiB
Diff
204 lines
5.3 KiB
Diff
--- source-old/include/drm/drm.h
|
|
+++ source/include/drm/drm.h
|
|
@@ -44,7 +44,11 @@
|
|
#else /* One of the BSDs */
|
|
|
|
#include <stdint.h>
|
|
+#if defined(__redox__)
|
|
+#include <sys/ioctl.h>
|
|
+#else
|
|
#include <sys/ioccom.h>
|
|
+#endif
|
|
#include <sys/types.h>
|
|
typedef int8_t __s8;
|
|
typedef uint8_t __u8;
|
|
--- source-old/xf86drm.c
|
|
+++ source/xf86drm.c
|
|
@@ -57,6 +57,19 @@
|
|
#ifdef MAJOR_IN_SYSMACROS
|
|
#include <sys/sysmacros.h>
|
|
#endif
|
|
+#if defined(__redox__)
|
|
+// From musl sys/sysmacros.h
|
|
+#define major(x) \
|
|
+ ((unsigned)( (((x)>>31>>1) & 0xfffff000) | (((x)>>8) & 0x00000fff) ))
|
|
+#define minor(x) \
|
|
+ ((unsigned)( (((x)>>12) & 0xffffff00) | ((x) & 0x000000ff) ))
|
|
+
|
|
+#define makedev(x,y) ( \
|
|
+ (((x)&0xfffff000ULL) << 32) | \
|
|
+ (((x)&0x00000fffULL) << 8) | \
|
|
+ (((y)&0xffffff00ULL) << 12) | \
|
|
+ (((y)&0x000000ffULL)) )
|
|
+#endif
|
|
#if HAVE_SYS_SYSCTL_H
|
|
#include <sys/sysctl.h>
|
|
#endif
|
|
@@ -304,9 +317,14 @@
|
|
char *modifier_name = NULL;
|
|
bool result = false;
|
|
|
|
+#if defined(__redox__)
|
|
+ fprintf(stderr, "open_memstream not available on Redox\n");
|
|
+ return NULL;
|
|
+#else
|
|
fp = open_memstream(&modifier_name, &size);
|
|
if (!fp)
|
|
return NULL;
|
|
+#endif
|
|
|
|
switch (type) {
|
|
case DRM_FORMAT_MOD_ARM_TYPE_AFBC:
|
|
@@ -409,9 +427,14 @@
|
|
char *mod_amd = NULL;
|
|
size_t size = 0;
|
|
|
|
+#if defined(__redox__)
|
|
+ fprintf(stderr, "open_memstream not available on Redox\n");
|
|
+ return NULL;
|
|
+#else
|
|
fp = open_memstream(&mod_amd, &size);
|
|
if (!fp)
|
|
return NULL;
|
|
+#endif
|
|
|
|
switch (tile_version) {
|
|
case AMD_FMT_MOD_TILE_VER_GFX9:
|
|
@@ -823,6 +846,21 @@
|
|
return NULL;
|
|
}
|
|
|
|
+static int drmGetNodePath(char *buf, size_t buf_len, int type, int minor)
|
|
+{
|
|
+ const char *dev_name = drmGetDeviceName(type);
|
|
+
|
|
+#if defined(__redox__)
|
|
+ if (type == DRM_NODE_RENDER)
|
|
+ return snprintf(buf, buf_len, "%s/" DRM_RENDER_MINOR_NAME, DRM_DIR_NAME);
|
|
+#endif
|
|
+
|
|
+ if (!dev_name)
|
|
+ return -1;
|
|
+
|
|
+ return snprintf(buf, buf_len, dev_name, DRM_DIR_NAME, minor);
|
|
+}
|
|
+
|
|
/**
|
|
* Open the DRM device, creating it if necessary.
|
|
*
|
|
@@ -839,7 +877,6 @@
|
|
static int drmOpenDevice(dev_t dev, int minor, int type)
|
|
{
|
|
stat_t st;
|
|
- const char *dev_name = drmGetDeviceName(type);
|
|
char buf[DRM_NODE_NAME_MAX];
|
|
int fd;
|
|
mode_t devmode = DRM_DEV_MODE, serv_mode;
|
|
@@ -850,10 +887,8 @@
|
|
gid_t group = DRM_DEV_GID;
|
|
#endif
|
|
|
|
- if (!dev_name)
|
|
+ if (drmGetNodePath(buf, sizeof(buf), type, minor) < 0)
|
|
return -EINVAL;
|
|
-
|
|
- sprintf(buf, dev_name, DRM_DIR_NAME, minor);
|
|
drmMsg("drmOpenDevice: node name is %s\n", buf);
|
|
|
|
if (drm_server_info && drm_server_info->get_perms) {
|
|
@@ -958,15 +993,13 @@
|
|
{
|
|
int fd;
|
|
char buf[DRM_NODE_NAME_MAX];
|
|
- const char *dev_name = drmGetDeviceName(type);
|
|
|
|
if (create)
|
|
return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type);
|
|
|
|
- if (!dev_name)
|
|
+ if (drmGetNodePath(buf, sizeof(buf), type, minor) < 0)
|
|
return -EINVAL;
|
|
|
|
- sprintf(buf, dev_name, DRM_DIR_NAME, minor);
|
|
if ((fd = open(buf, O_RDWR | O_CLOEXEC)) >= 0)
|
|
return fd;
|
|
return -errno;
|
|
@@ -3306,7 +3339,8 @@
|
|
d = sbuf.st_rdev;
|
|
|
|
for (i = 0; i < DRM_MAX_MINOR; i++) {
|
|
- snprintf(name, sizeof name, DRM_DEV_NAME, DRM_DIR_NAME, i);
|
|
+ if (drmGetNodePath(name, sizeof(name), DRM_NODE_PRIMARY, i) < 0)
|
|
+ return NULL;
|
|
if (stat(name, &sbuf) == 0 && sbuf.st_rdev == d)
|
|
break;
|
|
}
|
|
@@ -3495,7 +3529,6 @@
|
|
#else
|
|
struct stat sbuf;
|
|
char buf[PATH_MAX + 1];
|
|
- const char *dev_name = drmGetDeviceName(type);
|
|
unsigned int maj, min;
|
|
int n;
|
|
|
|
@@ -3508,10 +3541,9 @@
|
|
if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
|
|
return NULL;
|
|
|
|
- if (!dev_name)
|
|
+ n = drmGetNodePath(buf, sizeof(buf), type, min);
|
|
+ if (n < 0)
|
|
return NULL;
|
|
-
|
|
- n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min);
|
|
if (n == -1 || n >= sizeof(buf))
|
|
return NULL;
|
|
|
|
@@ -4877,7 +4909,6 @@
|
|
#else
|
|
struct stat sbuf;
|
|
char node[PATH_MAX + 1];
|
|
- const char *dev_name;
|
|
int node_type;
|
|
int maj, min, n;
|
|
|
|
@@ -4894,12 +4925,8 @@
|
|
if (node_type == -1)
|
|
return NULL;
|
|
|
|
- dev_name = drmGetDeviceName(node_type);
|
|
- if (!dev_name)
|
|
- return NULL;
|
|
-
|
|
- n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min);
|
|
- if (n == -1 || n >= PATH_MAX)
|
|
+ n = drmGetNodePath(node, sizeof(node), node_type, min);
|
|
+ if (n < 0 || n >= PATH_MAX)
|
|
return NULL;
|
|
|
|
return strdup(node);
|
|
--- source-old/xf86drm.h
|
|
+++ source/xf86drm.h
|
|
@@ -47,7 +47,7 @@
|
|
#define DRM_MAX_MINOR 64 /* deprecated */
|
|
#endif
|
|
|
|
-#if defined(__linux__)
|
|
+#if defined(__linux__) || defined(__redox__)
|
|
|
|
#define DRM_IOCTL_NR(n) _IOC_NR(n)
|
|
#define DRM_IOC_VOID _IOC_NONE
|
|
@@ -81,6 +81,12 @@
|
|
#define DRM_PRIMARY_MINOR_NAME "drm"
|
|
#define DRM_CONTROL_MINOR_NAME "drmC" /* deprecated */
|
|
#define DRM_RENDER_MINOR_NAME "drmR"
|
|
+#elif defined(__redox__)
|
|
+#define DRM_DIR_NAME "/scheme/drm"
|
|
+#define DRM_PRIMARY_MINOR_NAME "card"
|
|
+#define DRM_CONTROL_MINOR_NAME "controlD" /* deprecated */
|
|
+#define DRM_RENDER_MINOR_NAME "renderD"
|
|
+#define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */
|
|
#else
|
|
#define DRM_DIR_NAME "/dev/dri"
|
|
#define DRM_PRIMARY_MINOR_NAME "card"
|