use PixelFormat all around
authorTomi Valkeinen <tomi.valkeinen@iki.fi>
Sat, 3 Oct 2015 20:29:18 +0000 (23:29 +0300)
committerTomi Valkeinen <tomi.valkeinen@iki.fi>
Sun, 4 Oct 2015 07:21:56 +0000 (10:21 +0300)
libkms++/dumbframebuffer.cpp
libkms++/dumbframebuffer.h
libkmstest/colorbar.cpp
libkmstest/conv.cpp
libkmstest/testpat.cpp
tests/db.cpp
tests/testpat.cpp

index abea762955744a06905f235a0202828f779841dd..e493b9fc4ba61855805d8fb1d0169d0e7c2b902d 100644 (file)
@@ -23,9 +23,9 @@ DumbFramebuffer::DumbFramebuffer(Card &card, uint32_t width, uint32_t height, co
 }
 
 DumbFramebuffer::DumbFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format)
-       :Framebuffer(card, width, height)
+       :Framebuffer(card, width, height), m_format(format)
 {
-       Create(width, height, (uint32_t)format);
+       Create();
 }
 
 DumbFramebuffer::~DumbFramebuffer()
@@ -47,24 +47,24 @@ struct FormatPlaneInfo
 
 struct FormatInfo
 {
-       uint32_t format;
+       PixelFormat format;
        uint8_t num_planes;
        struct FormatPlaneInfo planes[4];
 };
 
 static const FormatInfo format_info_array[] = {
        /* YUV packed */
-       { DRM_FORMAT_UYVY, 1, { { 32, 2, 1 } }, },
-       { DRM_FORMAT_YUYV, 1, { { 32, 2, 1 } }, },
+       { PixelFormat::UYVY, 1, { { 32, 2, 1 } }, },
+       { PixelFormat::YUYV, 1, { { 32, 2, 1 } }, },
        /* YUV semi-planar */
-       { DRM_FORMAT_NV12, 2, { { 8, 1, 1, }, { 16, 2, 2 } }, },
+       { PixelFormat::NV12, 2, { { 8, 1, 1, }, { 16, 2, 2 } }, },
        /* RGB16 */
-       { DRM_FORMAT_RGB565, 1, { { 16, 1, 1 } }, },
+       { PixelFormat::RGB565, 1, { { 16, 1, 1 } }, },
        /* RGB32 */
-       { DRM_FORMAT_XRGB8888, 1, { { 32, 1, 1 } }, },
+       { PixelFormat::XRGB8888, 1, { { 32, 1, 1 } }, },
 };
 
-static const FormatInfo& find_format(uint32_t format)
+static const FormatInfo& find_format(PixelFormat format)
 {
        for (uint i = 0; i < ARRAY_SIZE(format_info_array); ++i) {
                if (format == format_info_array[i].format)
@@ -74,13 +74,11 @@ static const FormatInfo& find_format(uint32_t format)
        throw std::invalid_argument("foo");
 }
 
-void DumbFramebuffer::Create(uint32_t width, uint32_t height, uint32_t format)
+void DumbFramebuffer::Create()
 {
        int r;
 
-       m_format = format;
-
-       const FormatInfo& format_info = find_format(format);
+       const FormatInfo& format_info = find_format(m_format);
 
        m_num_planes = format_info.num_planes;
 
@@ -90,8 +88,8 @@ void DumbFramebuffer::Create(uint32_t width, uint32_t height, uint32_t format)
 
                /* create dumb buffer */
                struct drm_mode_create_dumb creq = drm_mode_create_dumb();
-               creq.width = width / pi.xsub;
-               creq.height = height / pi.ysub;
+               creq.width = width() / pi.xsub;
+               creq.height = height() / pi.ysub;
                creq.bpp = pi.bitspp;
                r = drmIoctl(card().fd(), DRM_IOCTL_MODE_CREATE_DUMB, &creq);
                if (r)
@@ -128,7 +126,7 @@ void DumbFramebuffer::Create(uint32_t width, uint32_t height, uint32_t format)
        uint32_t pitches[4] = { m_planes[0].stride, m_planes[1].stride };
        uint32_t offsets[4] = { 0 };
        uint32_t id;
-       r = drmModeAddFB2(card().fd(), width, height, format,
+       r = drmModeAddFB2(card().fd(), width(), height(), (uint32_t)format(),
                          bo_handles, pitches, offsets, &id, 0);
        if (r)
                throw std::invalid_argument("foo");
index 25a3c2e83f9ff2f64bc8e59c944fdf08ed899166..c3c0adb1aff538ef78d9226fc4525a4916d58966 100644 (file)
@@ -14,7 +14,7 @@ public:
 
        void print_short() const;
 
-       uint32_t format() const { return m_format; }
+       PixelFormat format() const { return m_format; }
 
        uint8_t* map(unsigned plane) const { return m_planes[plane].map; }
        uint32_t stride(unsigned plane) const { return m_planes[plane].stride; }
@@ -30,12 +30,12 @@ private:
                uint8_t *map;
        };
 
-       void Create(uint32_t width, uint32_t height, uint32_t format);
+       void Create();
        void Destroy();
 
        unsigned m_num_planes;
        struct FramebufferPlane m_planes[4];
 
-       uint32_t m_format;
+       PixelFormat m_format;
 };
 }
index bc9cdcada86843dbcadef40b18c39dde2a4bac4b..31a4510fc3fa63401393d00139bf2bcdb4682c53 100644 (file)
@@ -102,23 +102,23 @@ static void drm_draw_color_bar_semiplanar_yuv(DumbFramebuffer& buf, int old_xpos
 void draw_color_bar(DumbFramebuffer& buf, int old_xpos, int xpos, int width)
 {
        switch (buf.format()) {
-       case DRM_FORMAT_NV12:
-       case DRM_FORMAT_NV21:
+       case PixelFormat::NV12:
+       case PixelFormat::NV21:
                // XXX not right but gets something on the screen
                drm_draw_color_bar_semiplanar_yuv(buf, old_xpos, xpos, width);
                break;
 
-       case DRM_FORMAT_YUYV:
-       case DRM_FORMAT_UYVY:
+       case PixelFormat::YUYV:
+       case PixelFormat::UYVY:
                // XXX not right but gets something on the screen
                drm_draw_color_bar_rgb565(buf, old_xpos, xpos, width);
                break;
 
-       case DRM_FORMAT_RGB565:
+       case PixelFormat::RGB565:
                drm_draw_color_bar_rgb565(buf, old_xpos, xpos, width);
                break;
 
-       case DRM_FORMAT_XRGB8888:
+       case PixelFormat::XRGB8888:
                drm_draw_color_bar_rgb888(buf, old_xpos, xpos, width);
                break;
 
index f2f19ac1fa92922f684c3c417fad0b0faaeb2e24..45f4a757de7928caa2d6ed016f1f66cfe71eb7b4 100644 (file)
@@ -34,13 +34,13 @@ static void fb_rgb_to_packed_yuv(DumbFramebuffer& dst_fb, const DumbFramebuffer&
                        YUV yuv2 = read_rgb_as_yuv(src_fb, x + 1, y);
 
                        switch (dst_fb.format()) {
-                       case DRM_FORMAT_UYVY:
+                       case PixelFormat::UYVY:
                                dst[x * 2 + 0] = (yuv1.u + yuv2.u) / 2;
                                dst[x * 2 + 1] = yuv1.y;
                                dst[x * 2 + 2] = (yuv1.v + yuv2.v) / 2;
                                dst[x * 2 + 3] = yuv2.y;
                                break;
-                       case DRM_FORMAT_YUYV:
+                       case PixelFormat::YUYV:
                                dst[x * 2 + 0] = yuv1.y;
                                dst[x * 2 + 1] = (yuv1.u + yuv2.u) / 2;
                                dst[x * 2 + 2] = yuv2.y;
@@ -116,17 +116,17 @@ static void fb_rgb_to_rgb565(DumbFramebuffer& dst_fb, const DumbFramebuffer& src
 void color_convert(DumbFramebuffer& dst, const DumbFramebuffer &src)
 {
        switch (dst.format()) {
-       case DRM_FORMAT_NV12:
-       case DRM_FORMAT_NV21:
+       case PixelFormat::NV12:
+       case PixelFormat::NV21:
                fb_rgb_to_semiplanar_yuv(dst, src);
                break;
 
-       case DRM_FORMAT_YUYV:
-       case DRM_FORMAT_UYVY:
+       case PixelFormat::YUYV:
+       case PixelFormat::UYVY:
                fb_rgb_to_packed_yuv(dst, src);
                break;
 
-       case DRM_FORMAT_RGB565:
+       case PixelFormat::RGB565:
                fb_rgb_to_rgb565(dst, src);
                break;
 
index 1516369d0f533f3edb037481b096d813bc8951b9..c8188d8a00b2e56d00834d49c24c3be3b5f4ba0b 100644 (file)
@@ -21,19 +21,19 @@ static void draw_pixel(DumbFramebuffer& buf, unsigned x, unsigned y, RGB color)
        static RGB c1;
 
        switch (buf.format()) {
-       case DRM_FORMAT_XRGB8888:
+       case PixelFormat::XRGB8888:
        {
                uint32_t *p = (uint32_t*)(buf.map(0) + buf.stride(0) * y + x * 4);
                *p = color.raw;
                break;
        }
-       case DRM_FORMAT_RGB565:
+       case PixelFormat::RGB565:
        {
                uint16_t *p = (uint16_t*)(buf.map(0) + buf.stride(0) * y + x * 2);
                *p = color.rgb565();
                break;
        }
-       case DRM_FORMAT_UYVY:
+       case PixelFormat::UYVY:
        {
                if ((x & 1) == 0) {
                        c1 = color;
@@ -51,7 +51,7 @@ static void draw_pixel(DumbFramebuffer& buf, unsigned x, unsigned y, RGB color)
                p[3] = yuv2.y;
                break;
        }
-       case DRM_FORMAT_YUYV:
+       case PixelFormat::YUYV:
        {
                if ((x & 1) == 0) {
                        c1 = color;
@@ -69,6 +69,8 @@ static void draw_pixel(DumbFramebuffer& buf, unsigned x, unsigned y, RGB color)
                p[3] = (yuv1.v + yuv2.v) / 2;
                break;
        }
+       default:
+               throw std::invalid_argument("unknown pixelformat");
        }
 }
 
index 84fb7674686d5357ad8b68717f9b0140469788ac..c72d1217007d7c85fd754af0f741d585d1ba9110 100644 (file)
@@ -106,8 +106,8 @@ int main()
 
                auto mode = conn->get_default_mode();
 
-               auto fb1 = new DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, "XR24");
-               auto fb2 = new DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, "XR24");
+               auto fb1 = new DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, PixelFormat::XRGB8888);
+               auto fb2 = new DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, PixelFormat::XRGB8888);
 
                printf("conn %u, crtc %u, fb1 %u, fb2 %u\n", conn->id(), crtc->id(), fb1->id(), fb2->id());
 
index 02f195ac1243598b3f2de355f71fe4a3add7208d..52e97134f729770ac3a7839c49b1ac20a1dc41b0 100644 (file)
@@ -30,7 +30,7 @@ int main()
 
                auto mode = conn->get_default_mode();
 
-               auto fb = new DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, "XR24");
+               auto fb = new DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, PixelFormat::XRGB8888);
                draw_test_pattern(*fb);
                fbs.push_back(fb);
 
@@ -54,7 +54,7 @@ int main()
                }
 
                if (plane) {
-                       auto planefb = new DumbFramebuffer(card, 400, 400, "YUYV");
+                       auto planefb = new DumbFramebuffer(card, 400, 400, PixelFormat::YUYV);
                        draw_test_pattern(*planefb);
                        fbs.push_back(planefb);