summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2019-11-06 17:28:56 +0200
committerGitHub <noreply@github.com>2019-11-06 17:28:56 +0200
commitd6dc724f16672cbb3eed382815514f4c9a0246d4 (patch)
tree2dc92e3848cb6de85cf29646418b6deac3dbb250
parent9d142cb7ec175a8394f47aee61ca8a1951dd6170 (diff)
parent3009db77d599c6a397c24ba1a4e84c53299162c0 (diff)
Merge pull request #40 from tomba/work
Misc improvements
-rw-r--r--kms++/inc/kms++/blob.h2
-rw-r--r--kms++/inc/kms++/card.h12
-rw-r--r--kms++/inc/kms++/connector.h4
-rw-r--r--kms++/inc/kms++/crtc.h4
-rw-r--r--kms++/inc/kms++/decls.h1
-rw-r--r--kms++/inc/kms++/dmabufframebuffer.h51
-rw-r--r--kms++/inc/kms++/drmpropobject.h2
-rw-r--r--kms++/inc/kms++/dumbframebuffer.h23
-rw-r--r--kms++/inc/kms++/encoder.h2
-rw-r--r--kms++/inc/kms++/extframebuffer.h22
-rw-r--r--kms++/inc/kms++/framebuffer.h16
-rw-r--r--kms++/inc/kms++/kms++.h1
-rw-r--r--kms++/inc/kms++/plane.h2
-rw-r--r--kms++/inc/kms++/property.h2
-rw-r--r--kms++/src/card.cpp6
-rw-r--r--kms++/src/connector.cpp2
-rw-r--r--kms++/src/crtc.cpp2
-rw-r--r--kms++/src/dmabufframebuffer.cpp129
-rw-r--r--kms++/src/drmobject.cpp2
-rw-r--r--kms++/src/drmpropobject.cpp2
-rw-r--r--kms++/src/dumbframebuffer.cpp20
-rw-r--r--kms++/src/encoder.cpp2
-rw-r--r--kms++/src/extframebuffer.cpp66
-rw-r--r--kms++/src/plane.cpp2
-rw-r--r--kms++/src/videomode.cpp2
-rw-r--r--py/pykms/pykmsbase.cpp16
-rwxr-xr-xpy/tests/test.py2
-rw-r--r--utils/kmscapture.cpp8
28 files changed, 257 insertions, 148 deletions
diff --git a/kms++/inc/kms++/blob.h b/kms++/inc/kms++/blob.h
index fd872f1..31e915c 100644
--- a/kms++/inc/kms++/blob.h
+++ b/kms++/inc/kms++/blob.h
@@ -11,7 +11,7 @@ class Blob : public DrmObject
public:
Blob(Card& card, uint32_t blob_id);
Blob(Card& card, void* data, size_t len);
- virtual ~Blob();
+ ~Blob() override;
std::vector<uint8_t> data();
diff --git a/kms++/inc/kms++/card.h b/kms++/inc/kms++/card.h
index e734689..e561ffc 100644
--- a/kms++/inc/kms++/card.h
+++ b/kms++/inc/kms++/card.h
@@ -50,13 +50,13 @@ public:
bool has_dumb_buffers() const { return m_has_dumb; }
bool has_kms() const;
- const std::vector<Connector*> get_connectors() const { return m_connectors; }
- const std::vector<Encoder*> get_encoders() const { return m_encoders; }
- const std::vector<Crtc*> get_crtcs() const { return m_crtcs; }
- const std::vector<Plane*> get_planes() const { return m_planes; }
- const std::vector<Property*> get_properties() const { return m_properties; }
+ std::vector<Connector*> get_connectors() const { return m_connectors; }
+ std::vector<Encoder*> get_encoders() const { return m_encoders; }
+ std::vector<Crtc*> get_crtcs() const { return m_crtcs; }
+ std::vector<Plane*> get_planes() const { return m_planes; }
+ std::vector<Property*> get_properties() const { return m_properties; }
- const std::vector<DrmObject*> get_objects() const;
+ std::vector<DrmObject*> get_objects() const;
std::vector<Pipeline> get_connected_pipelines();
diff --git a/kms++/inc/kms++/connector.h b/kms++/inc/kms++/connector.h
index 155f916..323d37d 100644
--- a/kms++/inc/kms++/connector.h
+++ b/kms++/inc/kms++/connector.h
@@ -46,9 +46,9 @@ public:
std::vector<Encoder*> get_encoders() const;
private:
Connector(Card& card, uint32_t id, uint32_t idx);
- ~Connector();
+ ~Connector() override;
- void setup();
+ void setup() override;
void restore_mode();
ConnectorPriv* m_priv;
diff --git a/kms++/inc/kms++/crtc.h b/kms++/inc/kms++/crtc.h
index ea20ef8..990fc20 100644
--- a/kms++/inc/kms++/crtc.h
+++ b/kms++/inc/kms++/crtc.h
@@ -42,9 +42,9 @@ public:
int gamma_size() const;
private:
Crtc(Card& card, uint32_t id, uint32_t idx);
- ~Crtc();
+ ~Crtc() override;
- void setup();
+ void setup() override;
void restore_mode(Connector *conn);
CrtcPriv* m_priv;
diff --git a/kms++/inc/kms++/decls.h b/kms++/inc/kms++/decls.h
index 91bce13..438dad5 100644
--- a/kms++/inc/kms++/decls.h
+++ b/kms++/inc/kms++/decls.h
@@ -12,6 +12,7 @@ class DrmPropObject;
class DumbFramebuffer;
class Encoder;
class ExtFramebuffer;
+class DmabufFramebuffer;
class Framebuffer;
class PageFlipHandlerBase;
class Plane;
diff --git a/kms++/inc/kms++/dmabufframebuffer.h b/kms++/inc/kms++/dmabufframebuffer.h
new file mode 100644
index 0000000..73c6d21
--- /dev/null
+++ b/kms++/inc/kms++/dmabufframebuffer.h
@@ -0,0 +1,51 @@
+#pragma once
+
+#include "framebuffer.h"
+#include "pixelformats.h"
+#include <vector>
+
+namespace kms
+{
+
+class DmabufFramebuffer : public Framebuffer
+{
+public:
+ DmabufFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format,
+ std::vector<int> fds, std::vector<uint32_t> pitches, std::vector<uint32_t> offsets);
+ ~DmabufFramebuffer() override;
+
+ uint32_t width() const override { return Framebuffer::width(); }
+ uint32_t height() const override { return Framebuffer::height(); }
+
+ PixelFormat format() const override { return m_format; }
+ unsigned num_planes() const override { return m_num_planes; }
+
+ uint32_t handle(unsigned plane) const { return m_planes[plane].handle; }
+ uint32_t stride(unsigned plane) const override { return m_planes[plane].stride; }
+ uint32_t size(unsigned plane) const override { return m_planes[plane].size; }
+ uint32_t offset(unsigned plane) const override { return m_planes[plane].offset; }
+ uint8_t* map(unsigned plane) override;
+ int prime_fd(unsigned plane) override;
+
+ void begin_cpu_access(CpuAccess access) override;
+ void end_cpu_access() override;
+
+private:
+ struct FramebufferPlane {
+ uint32_t handle;
+ int prime_fd;
+ uint32_t size;
+ uint32_t stride;
+ uint32_t offset;
+ uint8_t *map;
+ };
+
+ unsigned m_num_planes;
+ struct FramebufferPlane m_planes[4];
+
+ PixelFormat m_format;
+
+ uint32_t m_sync_flags = 0;
+};
+
+}
diff --git a/kms++/inc/kms++/drmpropobject.h b/kms++/inc/kms++/drmpropobject.h
index d9ba58e..809caf5 100644
--- a/kms++/inc/kms++/drmpropobject.h
+++ b/kms++/inc/kms++/drmpropobject.h
@@ -31,7 +31,7 @@ protected:
DrmPropObject(Card& card, uint32_t object_type);
DrmPropObject(Card& card, uint32_t id, uint32_t object_type, uint32_t idx = 0);
- virtual ~DrmPropObject();
+ ~DrmPropObject() override;
private:
std::map<uint32_t, uint64_t> m_prop_values;
diff --git a/kms++/inc/kms++/dumbframebuffer.h b/kms++/inc/kms++/dumbframebuffer.h
index fb99d0e..b722615 100644
--- a/kms++/inc/kms++/dumbframebuffer.h
+++ b/kms++/inc/kms++/dumbframebuffer.h
@@ -11,20 +11,20 @@ class DumbFramebuffer : public Framebuffer
public:
DumbFramebuffer(Card& card, uint32_t width, uint32_t height, const std::string& fourcc);
DumbFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format);
- virtual ~DumbFramebuffer();
+ ~DumbFramebuffer() override;
- uint32_t width() const { return Framebuffer::width(); }
- uint32_t height() const { return Framebuffer::height(); }
+ uint32_t width() const override { return Framebuffer::width(); }
+ uint32_t height() const override { return Framebuffer::height(); }
- PixelFormat format() const { return m_format; }
- unsigned num_planes() const { return m_num_planes; }
+ PixelFormat format() const override { return m_format; }
+ unsigned num_planes() const override { return m_num_planes; }
uint32_t handle(unsigned plane) const { return m_planes[plane].handle; }
- uint32_t stride(unsigned plane) const { return m_planes[plane].stride; }
- uint32_t size(unsigned plane) const { return m_planes[plane].size; }
- uint32_t offset(unsigned plane) const { return m_planes[plane].offset; }
- uint8_t* map(unsigned plane);
- int prime_fd(unsigned plane);
+ uint32_t stride(unsigned plane) const override { return m_planes[plane].stride; }
+ uint32_t size(unsigned plane) const override { return m_planes[plane].size; }
+ uint32_t offset(unsigned plane) const override { return m_planes[plane].offset; }
+ uint8_t* map(unsigned plane) override;
+ int prime_fd(unsigned plane) override;
private:
struct FramebufferPlane {
@@ -36,9 +36,6 @@ private:
uint8_t *map;
};
- void Create();
- void Destroy();
-
unsigned m_num_planes;
struct FramebufferPlane m_planes[4];
diff --git a/kms++/inc/kms++/encoder.h b/kms++/inc/kms++/encoder.h
index 1d36adc..72c0213 100644
--- a/kms++/inc/kms++/encoder.h
+++ b/kms++/inc/kms++/encoder.h
@@ -20,7 +20,7 @@ public:
const std::string& get_encoder_type() const;
private:
Encoder(Card& card, uint32_t id, uint32_t idx);
- ~Encoder();
+ ~Encoder() override;
EncoderPriv* m_priv;
};
diff --git a/kms++/inc/kms++/extframebuffer.h b/kms++/inc/kms++/extframebuffer.h
index 5f0660c..0b9d08a 100644
--- a/kms++/inc/kms++/extframebuffer.h
+++ b/kms++/inc/kms++/extframebuffer.h
@@ -2,6 +2,7 @@
#include "framebuffer.h"
#include "pixelformats.h"
+#include <vector>
namespace kms
{
@@ -11,27 +12,22 @@ class ExtFramebuffer : public Framebuffer
public:
ExtFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format,
std::vector<uint32_t> handles, std::vector<uint32_t> pitches, std::vector<uint32_t> offsets);
- ExtFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format,
- std::vector<int> fds, std::vector<uint32_t> pitches, std::vector<uint32_t> offsets);
- virtual ~ExtFramebuffer();
+ ~ExtFramebuffer() override;
- uint32_t width() const { return Framebuffer::width(); }
- uint32_t height() const { return Framebuffer::height(); }
+ uint32_t width() const override { return Framebuffer::width(); }
+ uint32_t height() const override { return Framebuffer::height(); }
- PixelFormat format() const { return m_format; }
- unsigned num_planes() const { return m_num_planes; }
+ PixelFormat format() const override { return m_format; }
+ unsigned num_planes() const override { return m_num_planes; }
uint32_t handle(unsigned plane) const { return m_planes[plane].handle; }
- uint32_t stride(unsigned plane) const { return m_planes[plane].stride; }
- uint32_t size(unsigned plane) const { return m_planes[plane].size; }
- uint32_t offset(unsigned plane) const { return m_planes[plane].offset; }
- uint8_t* map(unsigned plane);
- int prime_fd(unsigned plane);
+ uint32_t stride(unsigned plane) const override { return m_planes[plane].stride; }
+ uint32_t size(unsigned plane) const override { return m_planes[plane].size; }
+ uint32_t offset(unsigned plane) const override { return m_planes[plane].offset; }
private:
struct FramebufferPlane {
uint32_t handle;
- int prime_fd;
uint32_t size;
uint32_t stride;
uint32_t offset;
diff --git a/kms++/inc/kms++/framebuffer.h b/kms++/inc/kms++/framebuffer.h
index 3d43d08..bcfd1f0 100644
--- a/kms++/inc/kms++/framebuffer.h
+++ b/kms++/inc/kms++/framebuffer.h
@@ -5,6 +5,13 @@
namespace kms
{
+enum class CpuAccess
+{
+ Read,
+ Write,
+ ReadWrite,
+};
+
class IFramebuffer {
public:
virtual ~IFramebuffer() { }
@@ -20,16 +27,19 @@ public:
virtual uint32_t offset(unsigned plane) const { throw std::runtime_error("not implemented"); }
virtual uint8_t* map(unsigned plane) { throw std::runtime_error("not implemented"); }
virtual int prime_fd(unsigned plane) { throw std::runtime_error("not implemented"); }
+
+ virtual void begin_cpu_access(CpuAccess access) { }
+ virtual void end_cpu_access() { }
};
class Framebuffer : public DrmObject, public IFramebuffer
{
public:
Framebuffer(Card& card, uint32_t id);
- virtual ~Framebuffer();
+ ~Framebuffer() override;
- uint32_t width() const { return m_width; }
- uint32_t height() const { return m_height; }
+ uint32_t width() const override { return m_width; }
+ uint32_t height() const override { return m_height; }
void flush();
protected:
diff --git a/kms++/inc/kms++/kms++.h b/kms++/inc/kms++/kms++.h
index 3365ef7..a97505a 100644
--- a/kms++/inc/kms++/kms++.h
+++ b/kms++/inc/kms++/kms++.h
@@ -8,6 +8,7 @@
#include "framebuffer.h"
#include "dumbframebuffer.h"
#include "extframebuffer.h"
+#include "dmabufframebuffer.h"
#include "plane.h"
#include "property.h"
#include "blob.h"
diff --git a/kms++/inc/kms++/plane.h b/kms++/inc/kms++/plane.h
index 27e819b..1d78537 100644
--- a/kms++/inc/kms++/plane.h
+++ b/kms++/inc/kms++/plane.h
@@ -35,7 +35,7 @@ public:
uint32_t gamma_size() const;
private:
Plane(Card& card, uint32_t id, uint32_t idx);
- ~Plane();
+ ~Plane() override;
PlanePriv* m_priv;
};
diff --git a/kms++/inc/kms++/property.h b/kms++/inc/kms++/property.h
index b9097ff..8d6088e 100644
--- a/kms++/inc/kms++/property.h
+++ b/kms++/inc/kms++/property.h
@@ -34,7 +34,7 @@ public:
std::vector<uint32_t> get_blob_ids() const;
private:
Property(Card& card, uint32_t id);
- ~Property();
+ ~Property() override;
PropertyType m_type;
diff --git a/kms++/src/card.cpp b/kms++/src/card.cpp
index 1509a98..5b3d69e 100644
--- a/kms++/src/card.cpp
+++ b/kms++/src/card.cpp
@@ -1,9 +1,9 @@
-#include <stdio.h>
+#include <cstdio>
#include <unistd.h>
#include <fcntl.h>
#include <utility>
#include <stdexcept>
-#include <string.h>
+#include <cstring>
#include <algorithm>
#include <cerrno>
#include <algorithm>
@@ -296,7 +296,7 @@ DrmObject* Card::get_object(uint32_t id) const
return nullptr;
}
-const vector<DrmObject*> Card::get_objects() const
+std::vector<kms::DrmObject*> Card::get_objects() const
{
vector<DrmObject*> v;
for(auto pair : m_obmap)
diff --git a/kms++/src/connector.cpp b/kms++/src/connector.cpp
index a1807da..72f8777 100644
--- a/kms++/src/connector.cpp
+++ b/kms++/src/connector.cpp
@@ -1,4 +1,4 @@
-#include <stdio.h>
+#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
diff --git a/kms++/src/crtc.cpp b/kms++/src/crtc.cpp
index f94216f..7ffaaff 100644
--- a/kms++/src/crtc.cpp
+++ b/kms++/src/crtc.cpp
@@ -1,4 +1,4 @@
-#include <stdio.h>
+#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
diff --git a/kms++/src/dmabufframebuffer.cpp b/kms++/src/dmabufframebuffer.cpp
new file mode 100644
index 0000000..00ab94e
--- /dev/null
+++ b/kms++/src/dmabufframebuffer.cpp
@@ -0,0 +1,129 @@
+
+#include <cstring>
+#include <cerrno>
+
+#include <stdexcept>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+#include <xf86drm.h>
+#include <xf86drmMode.h>
+#include <linux/dma-buf.h>
+
+#include <kms++/kms++.h>
+
+using namespace std;
+
+namespace kms
+{
+
+DmabufFramebuffer::DmabufFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format,
+ vector<int> fds, vector<uint32_t> pitches, vector<uint32_t> offsets)
+ : Framebuffer(card, width, height)
+{
+ int r;
+
+ m_format = format;
+
+ const PixelFormatInfo& format_info = get_pixel_format_info(format);
+
+ m_num_planes = format_info.num_planes;
+
+ for (int i = 0; i < format_info.num_planes; ++i) {
+ FramebufferPlane& plane = m_planes[i];
+
+ plane.prime_fd = fds[i];
+
+ r = drmPrimeFDToHandle(card.fd(), fds[i], &plane.handle);
+ if (r)
+ throw invalid_argument(string("drmPrimeFDToHandle: ") + strerror(errno));
+
+ plane.stride = pitches[i];
+ plane.offset = offsets[i];
+ plane.size = plane.stride * height;
+ plane.map = 0;
+ }
+
+ uint32_t id;
+ uint32_t bo_handles[4] = { m_planes[0].handle, m_planes[1].handle, m_planes[2].handle, m_planes[3].handle };
+ r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format,
+ bo_handles, pitches.data(), offsets.data(), &id, 0);
+ if (r)
+ throw invalid_argument(string("drmModeAddFB2 failed: ") + strerror(errno));
+
+ set_id(id);
+}
+
+DmabufFramebuffer::~DmabufFramebuffer()
+{
+ drmModeRmFB(card().fd(), id());
+}
+
+uint8_t* DmabufFramebuffer::map(unsigned plane)
+{
+ FramebufferPlane& p = m_planes[plane];
+
+ if (p.map)
+ return p.map;
+
+ p.map = (uint8_t *)mmap(0, p.size, PROT_READ | PROT_WRITE, MAP_SHARED,
+ p.prime_fd, 0);
+ if (p.map == MAP_FAILED)
+ throw invalid_argument(string("mmap failed: ") + strerror(errno));
+
+ return p.map;
+}
+
+int DmabufFramebuffer::prime_fd(unsigned plane)
+{
+ FramebufferPlane& p = m_planes[plane];
+
+ return p.prime_fd;
+}
+
+void DmabufFramebuffer::begin_cpu_access(CpuAccess access)
+{
+ if (m_sync_flags != 0)
+ throw runtime_error("begin_cpu sync already started");
+
+ switch (access) {
+ case CpuAccess::Read:
+ m_sync_flags = DMA_BUF_SYNC_READ;
+ break;
+ case CpuAccess::Write:
+ m_sync_flags = DMA_BUF_SYNC_WRITE;
+ break;
+ case CpuAccess::ReadWrite:
+ m_sync_flags = DMA_BUF_SYNC_RW;
+ break;
+ }
+
+ dma_buf_sync dbs {
+ .flags = DMA_BUF_SYNC_START | m_sync_flags
+ };
+
+ for (uint32_t p = 0; p < m_num_planes; ++p) {
+ int r = ioctl(prime_fd(p), DMA_BUF_IOCTL_SYNC, &dbs);
+ if (r)
+ throw runtime_error("DMA_BUF_IOCTL_SYNC failed");
+ }
+}
+
+void DmabufFramebuffer::end_cpu_access()
+{
+ if (m_sync_flags == 0)
+ throw runtime_error("begin_cpu sync not started");
+
+ dma_buf_sync dbs {
+ .flags = DMA_BUF_SYNC_END | m_sync_flags
+ };
+
+ for (uint32_t p = 0; p < m_num_planes; ++p) {
+ int r = ioctl(prime_fd(p), DMA_BUF_IOCTL_SYNC, &dbs);
+ if (r)
+ throw runtime_error("DMA_BUF_IOCTL_SYNC failed");
+ }
+
+ m_sync_flags = 0;
+}
+
+}
diff --git a/kms++/src/drmobject.cpp b/kms++/src/drmobject.cpp
index f94fc5d..9c0f5ae 100644
--- a/kms++/src/drmobject.cpp
+++ b/kms++/src/drmobject.cpp
@@ -1,4 +1,4 @@
-#include <string.h>
+#include <cstring>
#include <iostream>
#include <stdexcept>
diff --git a/kms++/src/drmpropobject.cpp b/kms++/src/drmpropobject.cpp
index f91f913..74f8848 100644
--- a/kms++/src/drmpropobject.cpp
+++ b/kms++/src/drmpropobject.cpp
@@ -1,4 +1,4 @@
-#include <string.h>
+#include <cstring>
#include <iostream>
#include <stdexcept>
diff --git a/kms++/src/dumbframebuffer.cpp b/kms++/src/dumbframebuffer.cpp
index 4419687..2b74c35 100644
--- a/kms++/src/dumbframebuffer.cpp
+++ b/kms++/src/dumbframebuffer.cpp
@@ -28,16 +28,6 @@ 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), m_format(format)
{
- Create();
-}
-
-DumbFramebuffer::~DumbFramebuffer()
-{
- Destroy();
-}
-
-void DumbFramebuffer::Create()
-{
int r;
const PixelFormatInfo& format_info = get_pixel_format_info(m_format);
@@ -50,10 +40,10 @@ void DumbFramebuffer::Create()
/* create dumb buffer */
struct drm_mode_create_dumb creq = drm_mode_create_dumb();
- creq.width = width();
- creq.height = height() / pi.ysub;
+ creq.width = width;
+ creq.height = height / pi.ysub;
creq.bpp = pi.bitspp;
- r = drmIoctl(card().fd(), DRM_IOCTL_MODE_CREATE_DUMB, &creq);
+ r = drmIoctl(card.fd(), DRM_IOCTL_MODE_CREATE_DUMB, &creq);
if (r)
throw invalid_argument(string("DRM_IOCTL_MODE_CREATE_DUMB failed: ") + strerror(errno));
@@ -70,7 +60,7 @@ void DumbFramebuffer::Create()
uint32_t pitches[4] = { m_planes[0].stride, m_planes[1].stride };
uint32_t offsets[4] = { m_planes[0].offset, m_planes[1].offset };
uint32_t id;
- r = drmModeAddFB2(card().fd(), width(), height(), (uint32_t)format(),
+ r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format,
bo_handles, pitches, offsets, &id, 0);
if (r)
throw invalid_argument(string("drmModeAddFB2 failed: ") + strerror(errno));
@@ -78,7 +68,7 @@ void DumbFramebuffer::Create()
set_id(id);
}
-void DumbFramebuffer::Destroy()
+DumbFramebuffer::~DumbFramebuffer()
{
/* delete framebuffer */
drmModeRmFB(card().fd(), id());
diff --git a/kms++/src/encoder.cpp b/kms++/src/encoder.cpp
index bfb2ea8..30a241a 100644
--- a/kms++/src/encoder.cpp
+++ b/kms++/src/encoder.cpp
@@ -1,4 +1,4 @@
-#include <stdio.h>
+#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
diff --git a/kms++/src/extframebuffer.cpp b/kms++/src/extframebuffer.cpp
index 12e59b7..28cc138 100644
--- a/kms++/src/extframebuffer.cpp
+++ b/kms++/src/extframebuffer.cpp
@@ -28,7 +28,6 @@ ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, Pixe
FramebufferPlane& plane = m_planes[i];
plane.handle = handles[i];
- plane.prime_fd = 0;
plane.stride = pitches[i];
plane.offset = offsets[i];
@@ -44,74 +43,9 @@ ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, Pixe
set_id(id);
}
-ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format,
- vector<int> fds, vector<uint32_t> pitches, vector<uint32_t> offsets)
- : Framebuffer(card, width, height)
-{
- int r;
-
- m_format = format;
-
- const PixelFormatInfo& format_info = get_pixel_format_info(format);
-
- m_num_planes = format_info.num_planes;
-
- for (int i = 0; i < format_info.num_planes; ++i) {
- FramebufferPlane& plane = m_planes[i];
-
- plane.prime_fd = fds[i];
-
- r = drmPrimeFDToHandle(card.fd(), fds[i], &plane.handle);
- if (r)
- throw invalid_argument(string("drmPrimeFDToHandle: ") + strerror(errno));
-
- plane.stride = pitches[i];
- plane.offset = offsets[i];
- plane.size = plane.stride * height;
- plane.map = 0;
- }
-
- uint32_t id;
- uint32_t bo_handles[4] = { m_planes[0].handle, m_planes[1].handle };
- r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format,
- bo_handles, pitches.data(), offsets.data(), &id, 0);
- if (r)
- throw invalid_argument(string("drmModeAddFB2 failed: ") + strerror(errno));
-
- set_id(id);
-}
-
ExtFramebuffer::~ExtFramebuffer()
{
drmModeRmFB(card().fd(), id());
}
-uint8_t* ExtFramebuffer::map(unsigned plane)
-{
- FramebufferPlane& p = m_planes[plane];
-
- if (!p.prime_fd)
- throw invalid_argument("cannot mmap non-dmabuf fb");
-
- if (p.map)
- return p.map;
-
- p.map = (uint8_t *)mmap(0, p.size, PROT_READ | PROT_WRITE, MAP_SHARED,
- p.prime_fd, 0);
- if (p.map == MAP_FAILED)
- throw invalid_argument(string("mmap failed: ") + strerror(errno));
-
- return p.map;
-}
-
-int ExtFramebuffer::prime_fd(unsigned plane)
-{
- FramebufferPlane& p = m_planes[plane];
-
- if (!p.prime_fd)
- throw invalid_argument("no primefb for non-dmabuf fb");
-
- return p.prime_fd;
-}
-
}
diff --git a/kms++/src/plane.cpp b/kms++/src/plane.cpp
index f68c8d0..b040884 100644
--- a/kms++/src/plane.cpp
+++ b/kms++/src/plane.cpp
@@ -1,4 +1,4 @@
-#include <stdio.h>
+#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
diff --git a/kms++/src/videomode.cpp b/kms++/src/videomode.cpp
index 7099898..b53f0c0 100644
--- a/kms++/src/videomode.cpp
+++ b/kms++/src/videomode.cpp
@@ -1,6 +1,6 @@
#include <xf86drm.h>
#include <xf86drmMode.h>
-#include <math.h>
+#include <cmath>
#include <sstream>
#include <fmt/format.h>
diff --git a/py/pykms/pykmsbase.cpp b/py/pykms/pykmsbase.cpp
index b4dc090..c039833 100644
--- a/py/pykms/pykmsbase.cpp
+++ b/py/pykms/pykmsbase.cpp
@@ -122,14 +122,14 @@ void init_pykmsbase(py::module &m)
;
py::class_<Blob>(m, "Blob")
- .def("__init__", [](Blob& instance, Card& card, py::buffer buf) {
- py::buffer_info info = buf.request();
- if (info.ndim != 1)
- throw std::runtime_error("Incompatible buffer dimension!");
+ .def(py::init([](Card& card, py::buffer buf) {
+ py::buffer_info info = buf.request();
+ if (info.ndim != 1)
+ throw std::runtime_error("Incompatible buffer dimension!");
- new (&instance) Blob(card, info.ptr, info.size * info.itemsize);
- },
- py::keep_alive<1, 3>()) // Keep Card alive until this is destructed
+ return new Blob(card, info.ptr, info.size * info.itemsize);
+ }),
+ py::keep_alive<1, 2>()) // Keep Card alive until this is destructed
.def_property_readonly("data", &Blob::data)
@@ -167,7 +167,7 @@ void init_pykmsbase(py::module &m)
.def("offset", &DumbFramebuffer::offset)
;
- py::class_<ExtFramebuffer, Framebuffer>(m, "ExtFramebuffer")
+ py::class_<DmabufFramebuffer, Framebuffer>(m, "DmabufFramebuffer")
.def(py::init<Card&, uint32_t, uint32_t, PixelFormat, vector<int>, vector<uint32_t>, vector<uint32_t>>(),
py::keep_alive<1, 2>()) // Keep Card alive until this is destructed
;
diff --git a/py/tests/test.py b/py/tests/test.py
index 83cf16a..3f9e205 100755
--- a/py/tests/test.py
+++ b/py/tests/test.py
@@ -28,7 +28,7 @@ else:
origfb = pykms.DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, "XR24");
if args.dmabuf:
- fb = pykms.ExtFramebuffer(card, origfb.width, origfb.height, origfb.format,
+ fb = pykms.DmabufFramebuffer(card, origfb.width, origfb.height, origfb.format,
[origfb.fd(0)], [origfb.stride(0)], [origfb.offset(0)])
else:
fb = origfb
diff --git a/utils/kmscapture.cpp b/utils/kmscapture.cpp
index 01eac61..f215a65 100644
--- a/utils/kmscapture.cpp
+++ b/utils/kmscapture.cpp
@@ -38,7 +38,7 @@ public:
int fd() const { return m_fd; }
void start_streaming();
private:
- ExtFramebuffer* GetExtFrameBuffer(Card& card, uint32_t i, PixelFormat pixfmt);
+ DmabufFramebuffer* GetDmabufFrameBuffer(Card& card, uint32_t i, PixelFormat pixfmt);
int m_fd; /* camera file descriptor */
Crtc* m_crtc;
Plane* m_plane;
@@ -68,7 +68,7 @@ static int buffer_export(int v4lfd, enum v4l2_buf_type bt, uint32_t index, int *
return 0;
}
-ExtFramebuffer* CameraPipeline::GetExtFrameBuffer(Card& card, uint32_t i, PixelFormat pixfmt)
+DmabufFramebuffer* CameraPipeline::GetDmabufFrameBuffer(Card& card, uint32_t i, PixelFormat pixfmt)
{
int r, dmafd;
@@ -82,7 +82,7 @@ ExtFramebuffer* CameraPipeline::GetExtFrameBuffer(Card& card, uint32_t i, PixelF
vector<uint32_t> pitches { m_in_width * (format_info.planes[0].bitspp / 8) };
vector<uint32_t> offsets { 0 };
- return new ExtFramebuffer(card, m_in_width, m_in_height, pixfmt,
+ return new DmabufFramebuffer(card, m_in_width, m_in_height, pixfmt,
fds, pitches, offsets);
}
@@ -173,7 +173,7 @@ CameraPipeline::CameraPipeline(int cam_fd, Card& card, Crtc *crtc, Plane* plane,
Framebuffer *fb;
if (m_buffer_provider == BufferProvider::V4L2)
- fb = GetExtFrameBuffer(card, i, pixfmt);
+ fb = GetDmabufFrameBuffer(card, i, pixfmt);
else
fb = new DumbFramebuffer(card, m_in_width,
m_in_height, pixfmt);