Skip to content

Commit c31f212

Browse files
committed
Add linux kernel clang format.
Disable Autoformat like the kernel guidelines suggest. Add instructions to generate `compile_commands.json`. Modernize cpp code. Fix incorrect version in test. Add instructions to build python module. Fix Makefile to use virtual env if activated. Rename `acquire_framebuffer_cb` to `acquire_framebuffer_handler` for consistency.
1 parent eb83c2e commit c31f212

File tree

15 files changed

+1006
-231
lines changed

15 files changed

+1006
-231
lines changed

.clang-format

Lines changed: 687 additions & 0 deletions
Large diffs are not rendered by default.

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@ tmp/
2020
checkpatch.pl
2121
const_structs.checkpatch
2222
spelling.txt
23+
24+
__pycache__/
25+
evdienv/
26+
.cache/
27+
compile_commands.json

.vscode/settings.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"[cpp]": {
3+
"editor.formatOnType": false,
4+
"editor.formatOnPaste": false,
5+
"editor.formatOnSave": false
6+
},
7+
"[c]": {
8+
"editor.formatOnType": false,
9+
"editor.formatOnPaste": false,
10+
"editor.formatOnSave": false
11+
}
12+
}

pyevdi/Buffer.cpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,45 @@
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)
1011
{
11-
int id = numerator++;
12+
int id = numerator++;
1213

13-
this->evdiHandle = evdiHandle;
14-
int stride = mode.width;
15-
int pitch_mask = 63;
14+
this->evdiHandle = evdiHandle;
15+
int stride = mode.width;
16+
int pitch_mask = 63;
1617

1718
stride += pitch_mask;
1819
stride &= ~pitch_mask;
1920
stride *= 4;
2021

21-
buffer.id = id;
22-
buffer.width = mode.width;
23-
buffer.height = mode.height;
24-
buffer.stride = stride;
25-
buffer.rect_count = 16;
26-
buffer.rects = reinterpret_cast<evdi_rect*>(
27-
calloc(buffer.rect_count, sizeof(struct evdi_rect)));
28-
buffer.buffer = calloc(mode.width*mode.width, mode.bits_per_pixel/8);
22+
buffer.id = id;
23+
buffer.width = mode.width;
24+
buffer.height = mode.height;
25+
buffer.stride = stride;
26+
buffer.rect_count = 16;
27+
buffer.rects = reinterpret_cast<evdi_rect *>(
28+
calloc(buffer.rect_count, sizeof(struct evdi_rect)));
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));
2936

30-
evdi_register_buffer(evdiHandle, buffer);
37+
evdi_register_buffer(evdiHandle, buffer);
3138
}
3239

3340
Buffer::~Buffer()
3441
{
35-
evdi_unregister_buffer(evdiHandle, buffer.id);
36-
free(buffer.buffer);
37-
free(buffer.rects);
42+
evdi_unregister_buffer(evdiHandle, buffer.id);
43+
free(buffer.buffer);
44+
free(buffer.rects);
3845
}

pyevdi/Buffer.h

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,23 @@
33
#define BUFFER_H
44

55
#include "../library/evdi_lib.h"
6+
#include <cstddef>
67
#include <memory>
8+
#include <cstddef>
9+
#include <span>
710

11+
class Buffer : public std::enable_shared_from_this<Buffer> {
12+
static int numerator;
13+
evdi_handle evdiHandle;
814

9-
class Buffer : public std::enable_shared_from_this<Buffer>
10-
{
11-
static int numerator;
12-
evdi_handle evdiHandle;
13-
public:
14-
evdi_buffer buffer;
15-
Buffer(evdi_mode mode, evdi_handle evdiHandle);
16-
~Buffer();
15+
public:
16+
evdi_buffer buffer;
17+
size_t buffer_size;
18+
std::span<evdi_rect> rects_span;
19+
std::span<uint32_t> buffer_span;
20+
size_t bytes_per_pixel;
21+
Buffer(evdi_mode mode, evdi_handle evdiHandle);
22+
~Buffer();
1723
};
1824

1925
#endif

pyevdi/Card.cpp

Lines changed: 93 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,167 +1,166 @@
11
// Copyright (c) 2022 DisplayLink (UK) Ltd.
2+
#include <format>
3+
24
#include "../library/evdi_lib.h"
3-
#include <pybind11/pybind11.h>
45
#include "Card.h"
56
#include "Buffer.h"
67

78
namespace py = pybind11;
89

9-
1010
void default_update_ready_handler(int buffer_to_be_updated, void *user_data)
1111
{
12-
Card* card_ptr = reinterpret_cast<Card*>(user_data);
13-
assert(buffer_to_be_updated == card_ptr->buffer_requested->buffer.id);
14-
card_ptr->grab_pixels();
12+
Card *card_ptr = reinterpret_cast<Card *>(user_data);
13+
assert(buffer_to_be_updated == card_ptr->buffer_requested->buffer.id);
14+
card_ptr->grab_pixels();
1515
}
1616

1717
void card_C_mode_handler(struct evdi_mode mode, void *user_data)
1818
{
19-
py::module logging = py::module::import("logging");
20-
logging.attr("info")("Got mode_changed signal.");
21-
Card* card = reinterpret_cast<Card*>(user_data);
19+
py::module logging = py::module::import("logging");
20+
logging.attr("info")("Got mode_changed signal.");
21+
Card *card = reinterpret_cast<Card *>(user_data);
2222

23-
assert(card);
23+
assert(card);
2424

25-
card->setMode(mode);
26-
card->makeBuffers(2);
25+
card->setMode(mode);
26+
card->makeBuffers(2);
2727

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

32-
card->request_update();
32+
card->request_update();
3333
}
3434

3535
void Card::setMode(struct evdi_mode mode)
3636
{
37-
this->mode = mode;
37+
this->mode = mode;
3838
}
3939

4040
void Card::makeBuffers(int count)
4141
{
42-
clearBuffers();
43-
for(int i=0; i<count; i++){
44-
buffers.emplace_back(new Buffer(mode, evdiHandle));
45-
}
42+
clearBuffers();
43+
for (int i = 0; i < count; i++) {
44+
buffers.emplace_back(new Buffer(mode, evdiHandle));
45+
}
4646
}
4747

4848
void Card::clearBuffers()
4949
{
50-
buffer_requested.reset();
51-
buffers.clear();
50+
buffer_requested.reset();
51+
buffers.clear();
5252
}
5353

54-
void dpms_handler(int dpms_mode, void* /*user_data*/){
55-
py::module logging = py::module::import("logging");
56-
logging.attr("info")("Got dpms signal." + std::to_string(dpms_mode));
54+
void dpms_handler(int dpms_mode, void * /*user_data*/)
55+
{
56+
py::module logging = py::module::import("logging");
57+
logging.attr("info")(std::format("Got dpms signal: \"{}\"", dpms_mode));
5758
}
5859

59-
Card::Card(int device) :
60-
evdiHandle(evdi_open(device))
60+
Card::Card(int device)
61+
: evdiHandle(evdi_open(device))
6162
{
62-
if(evdiHandle==nullptr)
63-
{
64-
throw py::value_error("Card /dev/dri/card" + std::to_string(device) + "does not exists!");
65-
}
66-
67-
memset(&eventContext, 0, sizeof(eventContext));
63+
if (evdiHandle == nullptr) {
64+
throw py::value_error(std::format(
65+
"Failed to open card \"/dev/dri/card{}\"", device));
66+
}
6867

69-
m_modeHandler = nullptr;
70-
acquire_framebuffer_cb = nullptr;
68+
memset(&eventContext, 0, sizeof(eventContext));
7169

72-
eventContext.mode_changed_handler = &card_C_mode_handler;
73-
eventContext.update_ready_handler = &default_update_ready_handler;
74-
eventContext.dpms_handler=dpms_handler;
75-
eventContext.user_data = this;
70+
eventContext.mode_changed_handler = &card_C_mode_handler;
71+
eventContext.update_ready_handler = &default_update_ready_handler;
72+
eventContext.dpms_handler = dpms_handler;
73+
eventContext.user_data = this;
7674

77-
memset(&mode, 0, sizeof(mode));
75+
memset(&mode, 0, sizeof(mode));
7876
}
7977

8078
Card::~Card()
8179
{
82-
close();
80+
close();
8381
}
8482

8583
void Card::close()
8684
{
87-
if(evdiHandle != nullptr)
88-
{
89-
clearBuffers();
90-
evdi_close(evdiHandle);
91-
}
92-
evdiHandle = nullptr;
85+
if (evdiHandle != nullptr) {
86+
clearBuffers();
87+
evdi_close(evdiHandle);
88+
}
89+
evdiHandle = nullptr;
9390
}
9491

9592
void Card::connect(const char *edid, const unsigned int edid_length,
96-
const uint32_t pixel_area_limit, const uint32_t pixel_per_second_limit)
93+
const uint32_t pixel_area_limit,
94+
const uint32_t pixel_per_second_limit)
9795
{
98-
evdi_connect2(evdiHandle, reinterpret_cast<const unsigned char *>(edid),
99-
edid_length, pixel_area_limit, pixel_per_second_limit);
96+
evdi_connect2(evdiHandle, reinterpret_cast<const unsigned char *>(edid),
97+
edid_length, pixel_area_limit, pixel_per_second_limit);
10098
}
10199

102100
void Card::disconnect()
103101
{
104-
evdi_disconnect(evdiHandle);
102+
evdi_disconnect(evdiHandle);
105103
}
106104

107105
struct evdi_mode Card::getMode() const
108106
{
109-
return mode;
107+
return mode;
110108
}
111109

112110
void Card::handle_events(int waiting_time)
113111
{
114-
fd_set rfds;
115-
struct timeval tv;
116-
FD_ZERO(&rfds);
117-
int fd = evdi_get_event_ready(evdiHandle);
118-
FD_SET(fd, &rfds);
119-
tv.tv_sec = 0;
120-
tv.tv_usec = waiting_time*1000;
121-
122-
request_update();
123-
124-
if(select(fd + 1, &rfds, NULL, NULL, &tv)){
125-
evdi_handle_events(evdiHandle, &eventContext);
126-
}
112+
fd_set rfds;
113+
struct timeval tv;
114+
FD_ZERO(&rfds);
115+
int fd = evdi_get_event_ready(evdiHandle);
116+
FD_SET(fd, &rfds);
117+
tv.tv_sec = 0;
118+
tv.tv_usec = waiting_time * 1000;
119+
120+
request_update();
121+
122+
if (select(fd + 1, &rfds, NULL, NULL, &tv)) {
123+
evdi_handle_events(evdiHandle, &eventContext);
124+
}
127125
}
128126

129127
void Card::request_update()
130128
{
131-
if(buffer_requested){
132-
return;
133-
}
134-
135-
for(auto &i : buffers){
136-
if(i.use_count() == 1)
137-
{
138-
buffer_requested = i;
139-
break;
140-
}
141-
}
142-
143-
if(!buffer_requested){
144-
return;
145-
}
146-
147-
bool update_ready = evdi_request_update(evdiHandle, buffer_requested->buffer.id);
148-
149-
if(update_ready){
150-
grab_pixels();
151-
}
129+
if (buffer_requested) {
130+
return;
131+
}
132+
133+
for (auto &i : buffers) {
134+
if (i.use_count() == 1) {
135+
buffer_requested = i;
136+
break;
137+
}
138+
}
139+
140+
if (!buffer_requested) {
141+
return;
142+
}
143+
144+
bool update_ready =
145+
evdi_request_update(evdiHandle, buffer_requested->buffer.id);
146+
147+
if (update_ready) {
148+
grab_pixels();
149+
}
152150
}
153151

154152
void Card::grab_pixels()
155153
{
156-
if(!buffer_requested){
157-
return;
158-
}
154+
if (!buffer_requested) {
155+
return;
156+
}
159157

160-
evdi_grab_pixels(evdiHandle, buffer_requested->buffer.rects, &buffer_requested->buffer.rect_count);
158+
evdi_grab_pixels(evdiHandle, buffer_requested->buffer.rects,
159+
&buffer_requested->buffer.rect_count);
161160

162-
if(acquire_framebuffer_cb)
163-
acquire_framebuffer_cb(std::move(buffer_requested));
164-
buffer_requested = nullptr;
161+
if (acquire_framebuffer_handler)
162+
acquire_framebuffer_handler(std::move(buffer_requested));
163+
buffer_requested = nullptr;
165164

166-
request_update();
165+
request_update();
167166
}

0 commit comments

Comments
 (0)