mirror of
https://gitlab.freedesktop.org/emersion/libliftoff.git
synced 2025-01-13 20:01:35 +01:00
Introduce display_test_commit
This function wraps drmModeAtomicCommit and handles error conditions and logging.
This commit is contained in:
parent
cb0794469c
commit
dc9c39ed5c
1 changed files with 28 additions and 12 deletions
40
display.c
40
display.c
|
@ -503,13 +503,33 @@ bool check_alloc_valid(struct alloc_result *result, struct alloc_step *step)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool display_test_commit(struct liftoff_display *display,
|
||||||
|
drmModeAtomicReq *req, bool *compatible)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = drmModeAtomicCommit(display->drm_fd, req,
|
||||||
|
DRM_MODE_ATOMIC_TEST_ONLY, NULL);
|
||||||
|
if (ret == 0) {
|
||||||
|
*compatible = true;
|
||||||
|
} else if (-ret == EINVAL || -ret == ERANGE) {
|
||||||
|
*compatible = false;
|
||||||
|
} else {
|
||||||
|
perror("drmModeAtomicCommit");
|
||||||
|
*compatible = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool output_choose_layers(struct liftoff_output *output,
|
bool output_choose_layers(struct liftoff_output *output,
|
||||||
struct alloc_result *result, struct alloc_step *step)
|
struct alloc_result *result, struct alloc_step *step)
|
||||||
{
|
{
|
||||||
struct liftoff_display *display;
|
struct liftoff_display *display;
|
||||||
struct liftoff_plane *plane;
|
struct liftoff_plane *plane;
|
||||||
struct liftoff_layer *layer;
|
struct liftoff_layer *layer;
|
||||||
int cursor, ret;
|
int cursor;
|
||||||
size_t remaining_planes;
|
size_t remaining_planes;
|
||||||
bool compatible;
|
bool compatible;
|
||||||
struct alloc_step next_step;
|
struct alloc_step next_step;
|
||||||
|
@ -577,9 +597,10 @@ bool output_choose_layers(struct liftoff_output *output,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = drmModeAtomicCommit(display->drm_fd, result->req,
|
if (!display_test_commit(display, result->req, &compatible)) {
|
||||||
DRM_MODE_ATOMIC_TEST_ONLY, NULL);
|
return false;
|
||||||
if (ret == 0) {
|
}
|
||||||
|
if (compatible) {
|
||||||
liftoff_log(LIFTOFF_DEBUG,
|
liftoff_log(LIFTOFF_DEBUG,
|
||||||
"Layer %p -> plane %"PRIu32": success",
|
"Layer %p -> plane %"PRIu32": success",
|
||||||
(void *)layer, plane->id);
|
(void *)layer, plane->id);
|
||||||
|
@ -588,9 +609,6 @@ bool output_choose_layers(struct liftoff_output *output,
|
||||||
if (!output_choose_layers(output, result, &next_step)) {
|
if (!output_choose_layers(output, result, &next_step)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (-ret != EINVAL && -ret != ERANGE) {
|
|
||||||
perror("drmModeAtomicCommit");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
drmModeAtomicSetCursor(result->req, cursor);
|
drmModeAtomicSetCursor(result->req, cursor);
|
||||||
|
@ -656,7 +674,8 @@ static bool reuse_previous_alloc(struct liftoff_display *display,
|
||||||
{
|
{
|
||||||
struct liftoff_output *output;
|
struct liftoff_output *output;
|
||||||
struct liftoff_layer *layer;
|
struct liftoff_layer *layer;
|
||||||
int cursor, ret;
|
int cursor;
|
||||||
|
bool compatible;
|
||||||
|
|
||||||
liftoff_list_for_each(output, &display->outputs, link) {
|
liftoff_list_for_each(output, &display->outputs, link) {
|
||||||
liftoff_list_for_each(layer, &output->layers, link) {
|
liftoff_list_for_each(layer, &output->layers, link) {
|
||||||
|
@ -671,10 +690,7 @@ static bool reuse_previous_alloc(struct liftoff_display *display,
|
||||||
if (!apply_current(display, req)) {
|
if (!apply_current(display, req)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!display_test_commit(display, req, &compatible) || !compatible) {
|
||||||
ret = drmModeAtomicCommit(display->drm_fd, req,
|
|
||||||
DRM_MODE_ATOMIC_TEST_ONLY, NULL);
|
|
||||||
if (ret != 0) {
|
|
||||||
drmModeAtomicSetCursor(req, cursor);
|
drmModeAtomicSetCursor(req, cursor);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue