summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xf86drmMode.c133
-rw-r--r--xf86drmMode.h27
2 files changed, 160 insertions, 0 deletions
diff --git a/xf86drmMode.c b/xf86drmMode.c
index f603ceb2..4c5d6068 100644
--- a/xf86drmMode.c
+++ b/xf86drmMode.c
@@ -978,6 +978,139 @@ void drmModeFreePlaneResources(drmModePlaneResPtr ptr)
drmFree(ptr);
}
+int drmModeSetSource(int fd, uint32_t source_id, uint32_t plane_id,
+ uint32_t width, uint32_t height,
+ uint32_t pixel_format)
+{
+ struct drm_mode_set_live_source s;
+
+ s.source_id = source_id;
+ s.plane_id = plane_id;
+ s.width = width;
+ s.height = height;
+ s.pixel_format = pixel_format;
+
+ return DRM_IOCTL(fd, DRM_IOCTL_MODE_SETSOURCE, &s);
+}
+
+drmModeSourcePtr drmModeGetSource(int fd, uint32_t source_id)
+{
+ struct drm_mode_get_live_source src;
+ uint32_t count_format_types;
+ drmModeSourcePtr r = 0;
+
+retry:
+ memset(&src, 0, sizeof(src));
+ src.source_id = source_id;
+ if (drmIoctl(fd, DRM_IOCTL_MODE_GETSOURCE, &src))
+ return 0;
+
+ count_format_types = src.count_format_types;
+
+ if (src.count_format_types) {
+ src.format_type_ptr = VOID2U64(drmMalloc(src.count_format_types *
+ sizeof(uint32_t)));
+ if (!src.format_type_ptr)
+ goto err_allocs;
+ }
+
+ if (drmIoctl(fd, DRM_IOCTL_MODE_GETSOURCE, &src))
+ return 0;
+
+ if (count_format_types < src.count_format_types) {
+ drmFree(U642VOID(src.format_type_ptr));
+ goto retry;
+ }
+
+ if (!(r = drmMalloc(sizeof(*r))))
+ return NULL;
+
+ r->source_id = src.source_id;
+ strncpy(r->name, src.name, DRM_SOURCE_NAME_LEN);
+ r->name[DRM_SOURCE_NAME_LEN-1] = 0;
+ r->plane_id = src.plane_id;
+ r->possible_planes = src.possible_planes;
+ r->width = src.width;
+ r->height = src.height;
+ r->pixel_format = src.pixel_format;
+
+ r->count_formats = src.count_format_types;
+ r->formats = drmAllocCpy(U642VOID(src.format_type_ptr),
+ src.count_format_types, sizeof(uint32_t));
+ if (src.count_format_types && !r->formats) {
+ drmFree(r->formats);
+ drmFree(r);
+ r = NULL;
+ }
+
+err_allocs:
+ drmFree(U642VOID(src.format_type_ptr));
+ return r;
+}
+
+void drmModeFreeSource(drmModeSourcePtr ptr)
+{
+ if (!ptr)
+ return;
+
+ drmFree(ptr->formats);
+ drmFree(ptr);
+}
+
+drmModeSourceResPtr drmModeGetSourceResources(int fd)
+{
+ struct drm_mode_get_live_source_res res, counts;
+ drmModeSourceResPtr r = 0;
+
+retry:
+ memset(&res, 0, sizeof(res));
+ if (drmIoctl(fd, DRM_IOCTL_MODE_GETSOURCERESOURCES, &res))
+ return 0;
+
+ counts = res;
+
+ if (res.count_sources) {
+ res.source_id_ptr = VOID2U64(drmMalloc(res.count_sources *
+ sizeof(uint32_t)));
+ if (!res.source_id_ptr)
+ goto err_allocs;
+ }
+
+ if (drmIoctl(fd, DRM_IOCTL_MODE_GETSOURCERESOURCES, &res))
+ goto err_allocs;
+
+ if (counts.count_sources < res.count_sources) {
+ drmFree(U642VOID(res.source_id_ptr));
+ goto retry;
+ }
+
+ if (!(r = drmMalloc(sizeof(*r))))
+ goto err_allocs;
+
+ r->count_sources = res.count_sources;
+ r->sources = drmAllocCpy(U642VOID(res.source_id_ptr),
+ res.count_sources, sizeof(uint32_t));
+ if (res.count_sources && !r->sources) {
+ drmFree(r->sources);
+ drmFree(r);
+ r = 0;
+ }
+
+err_allocs:
+ drmFree(U642VOID(res.source_id_ptr));
+
+ return r;
+}
+
+void drmModeFreeSourceResources(drmModeSourceResPtr ptr)
+{
+ if (!ptr)
+ return;
+
+ drmFree(ptr->sources);
+ drmFree(ptr);
+}
+
drmModeObjectPropertiesPtr drmModeObjectGetProperties(int fd,
uint32_t object_id,
uint32_t object_type)
diff --git a/xf86drmMode.h b/xf86drmMode.h
index 8e400340..c5f1b4a7 100644
--- a/xf86drmMode.h
+++ b/xf86drmMode.h
@@ -70,6 +70,7 @@ extern "C" {
#define DRM_CONNECTOR_NAME_LEN 32
#define DRM_DISPLAY_MODE_LEN 32
#define DRM_PROP_NAME_LEN 32
+#define DRM_SOURCE_NAME_LEN 32
#define DRM_MODE_TYPE_BUILTIN (1<<0)
#define DRM_MODE_TYPE_CLOCK_C ((1<<1) | DRM_MODE_TYPE_BUILTIN)
@@ -307,6 +308,24 @@ typedef struct _drmModePlaneRes {
uint32_t *planes;
} drmModePlaneRes, *drmModePlaneResPtr;
+typedef struct _drmModeSource {
+ uint32_t source_id;
+ char name[DRM_SOURCE_NAME_LEN];
+
+ uint32_t plane_id;
+ uint32_t possible_planes;
+ uint32_t count_formats;
+ uint32_t *formats;
+
+ uint32_t width, height;
+ uint32_t pixel_format;
+} drmModeSource, *drmModeSourcePtr;
+
+typedef struct _drmModeSourceRes {
+ uint32_t count_sources;
+ uint32_t *sources;
+} drmModeSourceRes, *drmModeSourceResPtr;
+
extern void drmModeFreeModeInfo( drmModeModeInfoPtr ptr );
extern void drmModeFreeResources( drmModeResPtr ptr );
extern void drmModeFreeFB( drmModeFBPtr ptr );
@@ -315,6 +334,8 @@ extern void drmModeFreeConnector( drmModeConnectorPtr ptr );
extern void drmModeFreeEncoder( drmModeEncoderPtr ptr );
extern void drmModeFreePlane( drmModePlanePtr ptr );
extern void drmModeFreePlaneResources(drmModePlaneResPtr ptr);
+extern void drmModeFreeSource( drmModeSourcePtr ptr );
+extern void drmModeFreeSourceResources(drmModeSourceResPtr ptr);
/**
* Retrives all of the resources associated with a card.
@@ -434,6 +455,12 @@ extern int drmModeSetPlane(int fd, uint32_t plane_id, uint32_t crtc_id,
uint32_t src_x, uint32_t src_y,
uint32_t src_w, uint32_t src_h);
+extern drmModeSourceResPtr drmModeGetSourceResources(int fd);
+extern drmModeSourcePtr drmModeGetSource(int fd, uint32_t source_id);
+extern int drmModeSetSource(int fd, uint32_t source_id, uint32_t plane_id,
+ uint32_t width, uint32_t height,
+ uint32_t pixel_format);
+
extern drmModeObjectPropertiesPtr drmModeObjectGetProperties(int fd,
uint32_t object_id,
uint32_t object_type);