From de716254d983a05402a593793480ee1e5ee9e97e Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 13 Nov 2015 19:24:52 +0200 Subject: Videomode cleanup --- libkms++/connector.h | 14 +----------- libkms++/helpers.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++------ libkms++/videomode.h | 20 +++++++++++++++++ 3 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 libkms++/videomode.h (limited to 'libkms++') diff --git a/libkms++/connector.h b/libkms++/connector.h index 9776be3..a897d31 100644 --- a/libkms++/connector.h +++ b/libkms++/connector.h @@ -3,25 +3,13 @@ #include #include "drmobject.h" +#include "videomode.h" namespace kms { struct ConnectorPriv; -struct Videomode -{ - uint32_t clock; - uint16_t hdisplay, hsync_start, hsync_end, htotal, hskew; - uint16_t vdisplay, vsync_start, vsync_end, vtotal, vscan; - - uint32_t vrefresh; - - uint32_t flags; - uint32_t type; - char name[32]; // XXX -}; - class Connector : public DrmObject { friend class Card; diff --git a/libkms++/helpers.cpp b/libkms++/helpers.cpp index 7746bde..715e757 100644 --- a/libkms++/helpers.cpp +++ b/libkms++/helpers.cpp @@ -3,21 +3,70 @@ #include "helpers.h" #include +#define CPY(field) dst.field = src.field + namespace kms { Videomode drm_mode_to_video_mode(const drmModeModeInfo& drmmode) { - // XXX these are the same at the moment - Videomode mode; - memcpy(&mode, &drmmode, sizeof(mode)); + Videomode mode = { }; + + auto& src = drmmode; + auto& dst = mode; + + CPY(clock); + + CPY(hdisplay); + CPY(hsync_start); + CPY(hsync_end); + CPY(htotal); + CPY(hskew); + + CPY(vdisplay); + CPY(vsync_start); + CPY(vsync_end); + CPY(vtotal); + CPY(vscan); + + CPY(vrefresh); + + CPY(flags); + CPY(type); + + mode.name = drmmode.name; + return mode; } drmModeModeInfo video_mode_to_drm_mode(const Videomode& mode) { - // XXX these are the same at the moment - drmModeModeInfo drmmode; - memcpy(&drmmode, &mode, sizeof(drmmode)); + drmModeModeInfo drmmode = { }; + + auto& src = mode; + auto& dst = drmmode; + + CPY(clock); + + CPY(hdisplay); + CPY(hsync_start); + CPY(hsync_end); + CPY(htotal); + CPY(hskew); + + CPY(vdisplay); + CPY(vsync_start); + CPY(vsync_end); + CPY(vtotal); + CPY(vscan); + + CPY(vrefresh); + + CPY(flags); + CPY(type); + + strncpy(drmmode.name, mode.name.c_str(), sizeof(drmmode.name)); + drmmode.name[sizeof(drmmode.name) - 1] = 0; + return drmmode; } } diff --git a/libkms++/videomode.h b/libkms++/videomode.h new file mode 100644 index 0000000..28a5b00 --- /dev/null +++ b/libkms++/videomode.h @@ -0,0 +1,20 @@ +#pragma once + +namespace kms +{ + +struct Videomode +{ + uint32_t clock; + uint16_t hdisplay, hsync_start, hsync_end, htotal, hskew; + uint16_t vdisplay, vsync_start, vsync_end, vtotal, vscan; + + uint32_t vrefresh; + + uint32_t flags; // DRM_MODE_FLAG_* + uint32_t type; // DRM_MODE_TYPE_* + + std::string name; +}; + +} -- cgit v1.2.3