mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-06-13 14:32:57 -04:00
Merge branch 'page-flip-event-prop' into 'master'
Draft: backend/drm: add support for PAGE_FLIP_EVENT property See merge request wlroots/wlroots!5387
This commit is contained in:
commit
ba154c019b
5 changed files with 39 additions and 9 deletions
|
|
@ -582,6 +582,10 @@ static void atomic_connector_add(struct atomic *atom,
|
||||||
if (crtc->props.vrr_enabled != 0) {
|
if (crtc->props.vrr_enabled != 0) {
|
||||||
atomic_add(atom, crtc->id, crtc->props.vrr_enabled, state->vrr_enabled);
|
atomic_add(atom, crtc->id, crtc->props.vrr_enabled, state->vrr_enabled);
|
||||||
}
|
}
|
||||||
|
if (crtc->props.page_flip_event && state->page_flip_event) {
|
||||||
|
wlr_log(WLR_DEBUG, "YAAAY");
|
||||||
|
atomic_add(atom, crtc->id, crtc->props.page_flip_event, 1);
|
||||||
|
}
|
||||||
|
|
||||||
set_plane_props(atom, drm, crtc->primary, state->primary_fb, crtc->id,
|
set_plane_props(atom, drm, crtc->primary, state->primary_fb, crtc->id,
|
||||||
&state->primary_viewport.dst_box, &state->primary_viewport.src_box);
|
&state->primary_viewport.dst_box, &state->primary_viewport.src_box);
|
||||||
|
|
|
||||||
|
|
@ -503,7 +503,7 @@ void drm_page_flip_destroy(struct wlr_drm_page_flip *page_flip) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct wlr_drm_page_flip *drm_page_flip_create(struct wlr_drm_backend *drm,
|
static struct wlr_drm_page_flip *drm_page_flip_create(struct wlr_drm_backend *drm,
|
||||||
const struct wlr_drm_device_state *state) {
|
const struct wlr_drm_device_state *state, uint32_t flags) {
|
||||||
struct wlr_drm_page_flip *page_flip = calloc(1, sizeof(*page_flip));
|
struct wlr_drm_page_flip *page_flip = calloc(1, sizeof(*page_flip));
|
||||||
if (page_flip == NULL) {
|
if (page_flip == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -516,7 +516,11 @@ static struct wlr_drm_page_flip *drm_page_flip_create(struct wlr_drm_backend *dr
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < state->connectors_len; i++) {
|
for (size_t i = 0; i < state->connectors_len; i++) {
|
||||||
struct wlr_drm_connector *conn = state->connectors[i].connector;
|
const struct wlr_drm_connector_state *conn_state = &state->connectors[i];
|
||||||
|
struct wlr_drm_connector *conn = conn_state->connector;
|
||||||
|
if (!(flags & DRM_MODE_PAGE_FLIP_EVENT) && !conn_state->page_flip_event) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
page_flip->connectors[i] = (struct wlr_drm_page_flip_connector){
|
page_flip->connectors[i] = (struct wlr_drm_page_flip_connector){
|
||||||
.connector = conn,
|
.connector = conn,
|
||||||
.crtc_id = conn->crtc->id,
|
.crtc_id = conn->crtc->id,
|
||||||
|
|
@ -632,6 +636,16 @@ static void drm_connector_rollback_commit(const struct wlr_drm_connector_state *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool device_state_has_conn_page_flip_event(const struct wlr_drm_device_state *state) {
|
||||||
|
for (size_t i = 0; i < state->connectors_len; i++) {
|
||||||
|
const struct wlr_drm_connector_state *conn_state = &state->connectors[i];
|
||||||
|
if (conn_state->page_flip_event) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool drm_commit(struct wlr_drm_backend *drm,
|
static bool drm_commit(struct wlr_drm_backend *drm,
|
||||||
const struct wlr_drm_device_state *state,
|
const struct wlr_drm_device_state *state,
|
||||||
uint32_t flags, bool test_only) {
|
uint32_t flags, bool test_only) {
|
||||||
|
|
@ -639,8 +653,8 @@ static bool drm_commit(struct wlr_drm_backend *drm,
|
||||||
assert((flags & ~DRM_MODE_PAGE_FLIP_FLAGS) == 0);
|
assert((flags & ~DRM_MODE_PAGE_FLIP_FLAGS) == 0);
|
||||||
|
|
||||||
struct wlr_drm_page_flip *page_flip = NULL;
|
struct wlr_drm_page_flip *page_flip = NULL;
|
||||||
if (flags & DRM_MODE_PAGE_FLIP_EVENT) {
|
if ((flags & DRM_MODE_PAGE_FLIP_EVENT) || device_state_has_conn_page_flip_event(state)) {
|
||||||
page_flip = drm_page_flip_create(drm, state);
|
page_flip = drm_page_flip_create(drm, state, flags);
|
||||||
if (page_flip == NULL) {
|
if (page_flip == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -998,7 +1012,11 @@ static bool drm_connector_commit_state(struct wlr_drm_connector *conn,
|
||||||
|
|
||||||
uint32_t flags = 0;
|
uint32_t flags = 0;
|
||||||
if (!test_only && pending.active) {
|
if (!test_only && pending.active) {
|
||||||
flags |= DRM_MODE_PAGE_FLIP_EVENT;
|
if (conn->crtc->props.page_flip_event) {
|
||||||
|
pending.page_flip_event = true;
|
||||||
|
} else {
|
||||||
|
flags |= DRM_MODE_PAGE_FLIP_EVENT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (pending.base->tearing_page_flip) {
|
if (pending.base->tearing_page_flip) {
|
||||||
flags |= DRM_MODE_PAGE_FLIP_ASYNC;
|
flags |= DRM_MODE_PAGE_FLIP_ASYNC;
|
||||||
|
|
@ -1943,6 +1961,7 @@ bool commit_drm_device(struct wlr_drm_backend *drm,
|
||||||
|
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
bool modeset = false;
|
bool modeset = false;
|
||||||
|
uint32_t flags = 0;
|
||||||
size_t conn_states_len = 0;
|
size_t conn_states_len = 0;
|
||||||
for (size_t i = 0; i < output_states_len; i++) {
|
for (size_t i = 0; i < output_states_len; i++) {
|
||||||
const struct wlr_backend_output_state *output_state = &output_states[i];
|
const struct wlr_backend_output_state *output_state = &output_states[i];
|
||||||
|
|
@ -1975,6 +1994,14 @@ bool commit_drm_device(struct wlr_drm_backend *drm,
|
||||||
}
|
}
|
||||||
|
|
||||||
modeset |= output_state->base.allow_reconfiguration;
|
modeset |= output_state->base.allow_reconfiguration;
|
||||||
|
|
||||||
|
if (!test_only) {
|
||||||
|
if (conn->crtc->props.page_flip_event) {
|
||||||
|
conn_state->page_flip_event = true;
|
||||||
|
} else {
|
||||||
|
flags |= DRM_MODE_PAGE_FLIP_EVENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_only && drm->mgpu_renderer.wlr_rend) {
|
if (test_only && drm->mgpu_renderer.wlr_rend) {
|
||||||
|
|
@ -1984,10 +2011,6 @@ bool commit_drm_device(struct wlr_drm_backend *drm,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t flags = 0;
|
|
||||||
if (!test_only) {
|
|
||||||
flags |= DRM_MODE_PAGE_FLIP_EVENT;
|
|
||||||
}
|
|
||||||
struct wlr_drm_device_state dev_state = {
|
struct wlr_drm_device_state dev_state = {
|
||||||
.modeset = modeset,
|
.modeset = modeset,
|
||||||
.connectors = conn_states,
|
.connectors = conn_states,
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ static const struct prop_info crtc_info[] = {
|
||||||
{ "GAMMA_LUT_SIZE", INDEX(gamma_lut_size) },
|
{ "GAMMA_LUT_SIZE", INDEX(gamma_lut_size) },
|
||||||
{ "MODE_ID", INDEX(mode_id) },
|
{ "MODE_ID", INDEX(mode_id) },
|
||||||
{ "OUT_FENCE_PTR", INDEX(out_fence_ptr) },
|
{ "OUT_FENCE_PTR", INDEX(out_fence_ptr) },
|
||||||
|
{ "PAGE_FLIP_EVENT", INDEX(page_flip_event) },
|
||||||
{ "VRR_ENABLED", INDEX(vrr_enabled) },
|
{ "VRR_ENABLED", INDEX(vrr_enabled) },
|
||||||
#undef INDEX
|
#undef INDEX
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,7 @@ struct wlr_drm_connector_state {
|
||||||
bool vrr_enabled;
|
bool vrr_enabled;
|
||||||
uint32_t colorspace;
|
uint32_t colorspace;
|
||||||
uint32_t hdr_output_metadata;
|
uint32_t hdr_output_metadata;
|
||||||
|
bool page_flip_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ struct wlr_drm_crtc_props {
|
||||||
uint32_t active;
|
uint32_t active;
|
||||||
uint32_t mode_id;
|
uint32_t mode_id;
|
||||||
uint32_t out_fence_ptr;
|
uint32_t out_fence_ptr;
|
||||||
|
uint32_t page_flip_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wlr_drm_plane_props {
|
struct wlr_drm_plane_props {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue