Skip to content

Commit 2847689

Browse files
committed
Pyevdi-fixes
1 parent 0313eca commit 2847689

File tree

10 files changed

+63
-35
lines changed

10 files changed

+63
-35
lines changed

pyevdi/Buffer.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
// Copyright (c) 2022 DisplayLink (UK) Ltd.
2-
#include "Buffer.h"
3-
#include "../library/evdi_lib.h"
42
#include <cstdlib>
53
#include <cstdio>
64

5+
#include "../library/evdi_lib.h"
6+
#include "Buffer.h"
7+
78
int Buffer::numerator = 0;
89

910
Buffer::Buffer(evdi_mode mode, evdi_handle evdiHandle)
@@ -25,8 +26,13 @@ Buffer::Buffer(evdi_mode mode, evdi_handle evdiHandle)
2526
buffer.rect_count = 16;
2627
buffer.rects = reinterpret_cast<evdi_rect *>(
2728
calloc(buffer.rect_count, sizeof(struct evdi_rect)));
28-
buffer.buffer =
29-
calloc(mode.width * mode.width, mode.bits_per_pixel / 8);
29+
rects_span = std::span<evdi_rect>(buffer.rects, buffer.rect_count);
30+
bytes_per_pixel = mode.bits_per_pixel / 8;
31+
buffer_size = mode.width * mode.height * bytes_per_pixel;
32+
buffer.buffer = calloc(1, buffer_size);
33+
buffer_span =
34+
std::span<uint32_t>(reinterpret_cast<uint32_t *>(buffer.buffer),
35+
buffer_size / sizeof(uint32_t));
3036

3137
evdi_register_buffer(evdiHandle, buffer);
3238
}

pyevdi/Buffer.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@
22
#ifndef BUFFER_H
33
#define BUFFER_H
44

5-
#include "../library/evdi_lib.h"
5+
#include <cstddef>
66
#include <memory>
7+
#include <cstddef>
8+
#include <span>
9+
10+
#include "../library/evdi_lib.h"
711

812
class Buffer : public std::enable_shared_from_this<Buffer> {
913
static int numerator;
1014
evdi_handle evdiHandle;
1115

1216
public:
1317
evdi_buffer buffer;
18+
size_t buffer_size;
19+
std::span<evdi_rect> rects_span;
20+
std::span<uint32_t> buffer_span;
21+
size_t bytes_per_pixel;
1422
Buffer(evdi_mode mode, evdi_handle evdiHandle);
1523
~Buffer();
1624
};

pyevdi/Card.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// Copyright (c) 2022 DisplayLink (UK) Ltd.
2+
#include <format>
3+
24
#include "../library/evdi_lib.h"
3-
#include <pybind11/pybind11.h>
4-
#include "Card.h"
55
#include "Buffer.h"
6+
#include "Card.h"
67

78
namespace py = pybind11;
89

@@ -24,8 +25,8 @@ void card_C_mode_handler(struct evdi_mode mode, void *user_data)
2425
card->setMode(mode);
2526
card->makeBuffers(2);
2627

27-
if (card->m_modeHandler != nullptr) {
28-
card->m_modeHandler(mode);
28+
if (!card->mode_handler.is_none()) {
29+
card->mode_handler(mode);
2930
}
3031

3132
card->request_update();
@@ -53,23 +54,19 @@ void Card::clearBuffers()
5354
void dpms_handler(int dpms_mode, void * /*user_data*/)
5455
{
5556
py::module logging = py::module::import("logging");
56-
logging.attr("info")("Got dpms signal." + std::to_string(dpms_mode));
57+
logging.attr("info")(std::format("Got dpms signal: \"{}\"", dpms_mode));
5758
}
5859

5960
Card::Card(int device)
6061
: evdiHandle(evdi_open(device))
6162
{
6263
if (evdiHandle == nullptr) {
63-
throw py::value_error("Card /dev/dri/card" +
64-
std::to_string(device) +
65-
"does not exists!");
64+
throw py::value_error(std::format(
65+
"Failed to open card \"/dev/dri/card{}\"", device));
6666
}
6767

6868
memset(&eventContext, 0, sizeof(eventContext));
6969

70-
m_modeHandler = nullptr;
71-
acquire_framebuffer_cb = nullptr;
72-
7370
eventContext.mode_changed_handler = &card_C_mode_handler;
7471
eventContext.update_ready_handler = &default_update_ready_handler;
7572
eventContext.dpms_handler = dpms_handler;
@@ -161,8 +158,8 @@ void Card::grab_pixels()
161158
evdi_grab_pixels(evdiHandle, buffer_requested->buffer.rects,
162159
&buffer_requested->buffer.rect_count);
163160

164-
if (acquire_framebuffer_cb)
165-
acquire_framebuffer_cb(std::move(buffer_requested));
161+
if (acquire_framebuffer_handler)
162+
acquire_framebuffer_handler(std::move(buffer_requested));
166163
buffer_requested = nullptr;
167164

168165
request_update();

pyevdi/Card.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@
22
#ifndef CARD_H
33
#define CARD_H
44

5-
#include "Buffer.h"
5+
#include <pybind11/pybind11.h>
6+
#include <pybind11/functional.h>
7+
#include <functional>
68
#include <list>
79
#include <memory>
810

11+
#include "Buffer.h"
12+
13+
namespace py = pybind11;
14+
915
class Card {
1016
evdi_handle evdiHandle;
1117
evdi_event_context eventContext;
@@ -25,9 +31,11 @@ class Card {
2531
friend void card_C_mode_handler(struct evdi_mode mode, void *user_data);
2632

2733
public:
28-
std::function<void(struct evdi_mode)> m_modeHandler;
29-
std::function<void(std::shared_ptr<Buffer> buffer)>
30-
acquire_framebuffer_cb;
34+
/// used py::function to allow lambdas to work
35+
/// void(struct evdi_mode)
36+
py::function mode_handler;
37+
/// void(std::shared_ptr<Buffer> buffer)
38+
py::function acquire_framebuffer_handler;
3139

3240
explicit Card(int device);
3341
~Card();

pyevdi/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ LIBABI := 1
1212
INCL_DIRS := -I../library $$(python3 -m pybind11 --includes)
1313

1414
# -fvisibility=hidden https://pybind11.readthedocs.io/en/stable/faq.html#someclass-declared-with-greater-visibility-than-the-type-of-its-field-someclass-member-wattributes
15-
CXXFLAGS := $(INCL_DIRS) -std=c++11 -fPIC -fvisibility=hidden $(CXXFLAGS)
15+
CXXFLAGS := $(INCL_DIRS) -std=c++20 -fPIC -fvisibility=hidden $(CXXFLAGS)
1616

1717
LDFLAGS := -L../library -Wl,--no-undefined $$(python3-config --ldflags --embed) -shared
1818

pyevdi/PyEvdi.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
// Copyright (c) 2022 DisplayLink (UK) Ltd.
2-
#include "../library/evdi_lib.h"
3-
#include <pybind11/pybind11.h>
4-
#include <pybind11/functional.h>
5-
#include "Card.h"
6-
#include <cstdio>
72
#include <cstdarg>
3+
#include <cstdint>
4+
#include <cstdio>
5+
#include <pybind11/functional.h>
86
#include <pybind11/stl.h>
97
#include <pybind11/stl_bind.h>
8+
#include <pybind11/numpy.h>
9+
#include <pybind11/pybind11.h>
10+
#include <pybind11/pytypes.h>
11+
#include <span>
12+
13+
#include "../library/evdi_lib.h"
14+
#include "Card.h"
1015

1116
namespace py = pybind11;
1217

@@ -33,7 +38,7 @@ void log_function(void * /*user_data*/, const char *format, ...)
3338

3439
PYBIND11_MODULE(PyEvdi, m)
3540
{
36-
m.doc() = "python bindings for evdi library";
41+
m.doc() = "Python bindings for evdi library";
3742

3843
evdi_logging el;
3944
el.function = &log_function;
@@ -108,7 +113,7 @@ PYBIND11_MODULE(PyEvdi, m)
108113
.def("connect", &Card::connect)
109114
.def("disconnect", &Card::disconnect)
110115
.def("handle_events", &Card::handle_events)
111-
.def_readwrite("acquire_framebuffer_cb",
112-
&Card::acquire_framebuffer_cb)
113-
.def_readwrite("mode_changed_handler", &Card::m_modeHandler);
116+
.def_readwrite("acquire_framebuffer_handler",
117+
&Card::acquire_framebuffer_handler)
118+
.def_readwrite("mode_changed_handler", &Card::mode_handler);
114119
}

pyevdi/sample_edid/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# How to get an EDID file
2+
```
3+
cp /sys/class/drm/card0-eDP-1/edid edid.bin
4+
```

pyevdi/test/test_connect.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def testHandlingEventsTenTimesWithDefaultHandlers():
5151
card.disconnect()
5252
card.close()
5353

54-
def my_acquire_framebuffer_cb(buffer) -> None:
54+
def my_acquire_framebuffer_handler(buffer) -> None:
5555
print("received buffer", buffer.id)
5656
print("rect_count:", buffer.rect_count, "\nrects:")
5757
for i in buffer.rects:
@@ -63,7 +63,7 @@ def my_acquire_framebuffer_cb(buffer) -> None:
6363
def testHandlingEventsTenTimesWithAquireFramebufferSet():
6464
card = PyEvdi.Card(utilities.get_available_evdi_card())
6565

66-
card.acquire_framebuffer_cb = my_acquire_framebuffer_cb
66+
card.acquire_framebuffer_handler = my_acquire_framebuffer_handler
6767

6868
edid = utilities.get_edid()
6969
card.connect(edid, len(edid), utilities._FullHDAreaLimit, utilities._FullHDAreaLimit * utilities._60Hz)

pyevdi/test/utilities.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ def get_available_evdi_card():
2020
return -1
2121

2222
def get_edid():
23-
with open("4K60HzTest.edid", mode='rb') as file:
23+
with open("sample_edid/4K60HzTest.edid", mode='rb') as file:
2424
ed = file.read()
2525
return ed

0 commit comments

Comments
 (0)