2 #include <cstring>
3 #include <stdexcept>
4 #include <sys/mman.h>
5 #include <xf86drm.h>
6 #include <xf86drmMode.h>
8 #include "kms++.h"
10 using namespace std;
12 namespace kms
13 {
15 ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, uint8_t depth, uint8_t bpp, uint32_t stride, uint32_t handle)
16 :Framebuffer(card, width, height)
17 {
18 uint32_t id;
19 int r = drmModeAddFB(card.fd(), width, height, depth, bpp, stride, handle, &id);
20 if (r)
21 throw invalid_argument("fob");
23 set_id(id);
24 }
26 ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format,
27 uint32_t handles[], uint32_t pitches[], uint32_t offsets[])
28 : Framebuffer(card, width, height)
29 {
30 uint32_t id;
31 int r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format, handles, pitches, offsets, &id, 0);
32 if (r)
33 throw std::invalid_argument(string("Failed to create ExtFramebuffer: ") + strerror(r));
35 set_id(id);
36 }
38 ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format,
39 int fds[4], uint32_t pitches[4], uint32_t offsets[4])
40 : Framebuffer(card, width, height)
41 {
42 int r;
44 const PixelFormatInfo& format_info = get_pixel_format_info(format);
46 uint32_t handles[4] = { 0 };
48 for (int i = 0; i < format_info.num_planes; ++i) {
49 r = drmPrimeFDToHandle(card.fd(), fds[i], &handles[i]);
50 if (r)
51 throw invalid_argument(string("drmPrimeFDToHandle: ") + strerror(errno));
52 }
54 uint32_t id;
55 r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format,
56 handles, pitches, offsets, &id, 0);
57 if (r)
58 throw invalid_argument(string("drmModeAddFB2 failed: ") + strerror(errno));
60 set_id(id);
61 }
63 ExtFramebuffer::~ExtFramebuffer()
64 {
65 drmModeRmFB(card().fd(), id());
66 }
68 }