Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid excessive atomic properties updates #95

Merged
merged 28 commits into from
Jan 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
8ed37dc
do not set cursor planeProps unless smth changed
UjinT34 Oct 6, 2024
b543f0a
do not skip cursor state flag setting
UjinT34 Oct 11, 2024
4926f72
drm: scan only cards and not outputs, safeguard against null renderer…
gulafaran Nov 13, 2024
a7395fb
props: bump version to 0.5.0
vaxerski Nov 16, 2024
8b8cd06
drm: Validate conn before dereference in CDRMAtomicRequest::commit() …
ziyao233 Nov 18, 2024
cd4ac41
buffer: remove useless forward def
vaxerski Dec 6, 2024
5c8d8e2
drm: clearer flow when rescanning connectors (#113)
ikalco Dec 7, 2024
cbd63d1
drm: allow multigpu blit from explicit to implicit (#114)
ikalco Dec 9, 2024
d6f0f83
version: bump to 0.5.1
vaxerski Dec 13, 2024
e3aaf17
flake.lock: update
fufexan Dec 16, 2024
3d0b67e
flake.nix: gcc13 -> gcc14 (#118)
khaneliman Dec 16, 2024
94f2739
drm: udev scan only drm_minor, not connectors (#119)
ikalco Dec 17, 2024
65cb916
drm: log errno set by drmModeAtomicCommit (#120)
ikalco Dec 18, 2024
ed142be
drm: moved null check for renderer to shouldBlit() (#109) (#121)
richen604 Dec 18, 2024
bbc2f55
drm: only fail INVALID format when enabled (#122)
ikalco Dec 21, 2024
8661f21
flake.lock: update
fufexan Dec 22, 2024
fd51e0d
drm: only clear buffers when fullReconfigure succeeds (#124)
ikalco Jan 1, 2025
d0257b1
core/drm: Add HDR Support (#112)
UjinT34 Jan 5, 2025
5ec428c
version: bump to 0.6.0
vaxerski Jan 5, 2025
b107177
drm: limit udev drm_minor to Linux after a132fa41be7e (#129)
jbeich Jan 7, 2025
e86e0fd
do not set cursor planeProps unless smth changed
UjinT34 Oct 6, 2024
ffecc0a
test separate cursor commits
UjinT34 Nov 10, 2024
778ba97
do not change hdr blob unless asked to
UjinT34 Jan 5, 2025
73ba82d
rebase
UjinT34 Jan 7, 2025
c4929f5
split atomic commit processing and move hdr & colorspace into modeset
UjinT34 Jan 9, 2025
9ea2325
Merge branch 'main' into fix-hw-vrr
UjinT34 Jan 9, 2025
93ef5f0
fix wide color gamut flag & cleanup
UjinT34 Jan 10, 2025
a6ac56a
remove unused debug var
UjinT34 Jan 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion include/aquamarine/backend/DRM.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ namespace Aquamarine {
bool gammad = false;
bool degammad = false;
bool ctmd = false;
bool hdrd = false;
bool hdrd = false; // true if hdr blob needs updating or clearing
} atomic;

void calculateMode(Hyprutils::Memory::CSharedPointer<SDRMConnector> connector);
Expand Down
4 changes: 4 additions & 0 deletions include/aquamarine/backend/drm/Atomic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,14 @@ namespace Aquamarine {
CDRMAtomicRequest(Hyprutils::Memory::CWeakPointer<CDRMBackend> backend);
~CDRMAtomicRequest();

void setConnector(Hyprutils::Memory::CSharedPointer<SDRMConnector> connector);
void addConnector(Hyprutils::Memory::CSharedPointer<SDRMConnector> connector, SDRMConnectorCommitData& data);
void addConnectorModeset(Hyprutils::Memory::CSharedPointer<SDRMConnector> connector, SDRMConnectorCommitData& data);
void addConnectorCursor(Hyprutils::Memory::CSharedPointer<SDRMConnector> connector, SDRMConnectorCommitData& data);
bool commit(uint32_t flagssss);
void add(uint32_t id, uint32_t prop, uint64_t val);
void planeProps(Hyprutils::Memory::CSharedPointer<SDRMPlane> plane, Hyprutils::Memory::CSharedPointer<CDRMFB> fb, uint32_t crtc, Hyprutils::Math::Vector2D pos);
void planePropsPos(Hyprutils::Memory::CSharedPointer<SDRMPlane> plane, Hyprutils::Math::Vector2D pos);

void rollback(SDRMConnectorCommitData& data);
void apply(SDRMConnectorCommitData& data);
Expand Down
3 changes: 3 additions & 0 deletions include/aquamarine/output/Output.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ namespace Aquamarine {
AQ_OUTPUT_STATE_CTM = (1 << 10),
AQ_OUTPUT_STATE_HDR = (1 << 11),
AQ_OUTPUT_STATE_DEGAMMA_LUT = (1 << 12),
AQ_OUTPUT_STATE_WCG = (1 << 13),
UjinT34 marked this conversation as resolved.
Show resolved Hide resolved
AQ_OUTPUT_STATE_CURSOR_SHAPE = (1 << 14),
AQ_OUTPUT_STATE_CURSOR_POS = (1 << 15),
};

struct SInternalState {
Expand Down
7 changes: 6 additions & 1 deletion src/backend/drm/DRM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1546,7 +1546,8 @@ bool Aquamarine::CDRMOutput::commitState(bool onlyTest) {
// which may result in some glitches
const bool NEEDS_RECONFIG = COMMITTED &
(COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_ENABLED | COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_FORMAT |
COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_MODE);
COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_MODE | COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_HDR |
COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_WCG);

const bool BLOCKING = NEEDS_RECONFIG || !(COMMITTED & COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_BUFFER);

Expand Down Expand Up @@ -1752,6 +1753,7 @@ bool Aquamarine::CDRMOutput::setCursor(SP<IBuffer> buffer, const Vector2D& hotsp
if (!connector->crtc)
return false;

state->internalState.committed |= COutputState::AQ_OUTPUT_STATE_CURSOR_SHAPE;
if (!buffer)
setCursorVisible(false);
else {
Expand Down Expand Up @@ -1826,6 +1828,9 @@ bool Aquamarine::CDRMOutput::setCursor(SP<IBuffer> buffer, const Vector2D& hotsp
void Aquamarine::CDRMOutput::moveCursor(const Vector2D& coord, bool skipSchedule) {
cursorPos = coord;
// cursorVisible = true;
// if (!skipSchedule)
state->internalState.committed |= COutputState::AQ_OUTPUT_STATE_CURSOR_POS;

backend->impl->moveCursor(connector, skipSchedule);
}

Expand Down
97 changes: 71 additions & 26 deletions src/backend/drm/impl/Atomic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ void Aquamarine::CDRMAtomicRequest::planeProps(Hyprutils::Memory::CSharedPointer
return;
}

TRACE(backend->log(AQ_LOG_TRACE,
std::format("atomic planeProps: prop blobs: src_x {}, src_y {}, src_w {}, src_h {}, crtc_w {}, crtc_h {}, fb_id {}, crtc_id {}, crtc_x {}, crtc_y {}",
plane->props.src_x, plane->props.src_y, plane->props.src_w, plane->props.src_h, plane->props.crtc_w, plane->props.crtc_h, plane->props.fb_id,
plane->props.crtc_id, plane->props.crtc_x, plane->props.crtc_y)));
TRACE(
backend->log(AQ_LOG_TRACE,
std::format("atomic planeProps: prop blobs: src_x {}, src_y {}, src_w {}, src_h {}, crtc_w {}, crtc_h {}, fb_id {}, crtc_id {}", plane->props.src_x,
plane->props.src_y, plane->props.src_w, plane->props.src_h, plane->props.crtc_w, plane->props.crtc_h, plane->props.fb_id, plane->props.crtc_id)));

// src_ are 16.16 fixed point (lol)
add(plane->id, plane->props.src_x, 0);
Expand All @@ -71,10 +71,24 @@ void Aquamarine::CDRMAtomicRequest::planeProps(Hyprutils::Memory::CSharedPointer
add(plane->id, plane->props.crtc_h, (uint32_t)fb->buffer->size.y);
add(plane->id, plane->props.fb_id, fb->id);
add(plane->id, plane->props.crtc_id, crtc);
planePropsPos(plane, pos);
}

void Aquamarine::CDRMAtomicRequest::planePropsPos(Hyprutils::Memory::CSharedPointer<SDRMPlane> plane, Hyprutils::Math::Vector2D pos) {

if (failed)
return;

TRACE(backend->log(AQ_LOG_TRACE, std::format("atomic planeProps: pos blobs: crtc_x {}, crtc_y {}", plane->props.crtc_x, plane->props.crtc_y)));

add(plane->id, plane->props.crtc_x, (uint64_t)pos.x);
add(plane->id, plane->props.crtc_y, (uint64_t)pos.y);
}

void Aquamarine::CDRMAtomicRequest::setConnector(Hyprutils::Memory::CSharedPointer<SDRMConnector> connector) {
conn = connector;
}

void Aquamarine::CDRMAtomicRequest::addConnector(Hyprutils::Memory::CSharedPointer<SDRMConnector> connector, SDRMConnectorCommitData& data) {
const auto& STATE = connector->output->state->state();
const bool enable = STATE.enabled && data.mainFB;
Expand All @@ -85,23 +99,17 @@ void Aquamarine::CDRMAtomicRequest::addConnector(Hyprutils::Memory::CSharedPoint

TRACE(backend->log(AQ_LOG_TRACE, std::format("atomic addConnector values: CRTC {}, mode {}", enable ? connector->crtc->id : 0, data.atomic.modeBlob)));

add(connector->id, connector->props.crtc_id, enable ? connector->crtc->id : 0);
conn = connector;

if (data.modeset) {
add(connector->crtc->id, connector->crtc->props.mode_id, data.atomic.modeBlob);
data.atomic.blobbed = true;
}
addConnectorModeset(connector, data);
addConnectorCursor(connector, data);

if (data.modeset && enable && connector->props.link_status)
add(connector->id, connector->props.link_status, DRM_MODE_LINK_STATUS_GOOD);
add(connector->id, connector->props.crtc_id, enable ? connector->crtc->id : 0);

// TODO: allow to send aq a content type, maybe? Wayland has a protocol for this.
if (enable && connector->props.content_type)
add(connector->id, connector->props.content_type, DRM_MODE_CONTENT_TYPE_GRAPHICS);

if (data.modeset && enable && connector->props.max_bpc && connector->maxBpcBounds.at(1))
add(connector->id, connector->props.max_bpc, 8); // FIXME: this isnt always 8

add(connector->crtc->id, connector->crtc->props.active, enable);

if (enable) {
Expand Down Expand Up @@ -133,21 +141,57 @@ void Aquamarine::CDRMAtomicRequest::addConnector(Hyprutils::Memory::CSharedPoint

if (connector->crtc->primary->props.fb_damage_clips)
add(connector->crtc->primary->id, connector->crtc->primary->props.fb_damage_clips, data.atomic.fbDamage);

if (connector->crtc->cursor) {
if (!connector->output->cursorVisible)
planeProps(connector->crtc->cursor, nullptr, 0, {});
else
planeProps(connector->crtc->cursor, data.cursorFB, connector->crtc->id, connector->output->cursorPos - connector->output->cursorHotspot);
}

} else {
planeProps(connector->crtc->primary, nullptr, 0, {});
if (connector->crtc->cursor)
planeProps(connector->crtc->cursor, nullptr, 0, {});
}
}

conn = connector;
void Aquamarine::CDRMAtomicRequest::addConnectorModeset(Hyprutils::Memory::CSharedPointer<SDRMConnector> connector, SDRMConnectorCommitData& data) {
if (!data.modeset)
return;

const auto& STATE = connector->output->state->state();
const bool enable = STATE.enabled && data.mainFB;

add(connector->crtc->id, connector->crtc->props.mode_id, data.atomic.modeBlob);
data.atomic.blobbed = true;

if (!enable)
return;

if (connector->props.link_status)
add(connector->id, connector->props.link_status, DRM_MODE_LINK_STATUS_GOOD);

if (connector->props.max_bpc && connector->maxBpcBounds.at(1))
add(connector->id, connector->props.max_bpc, 8); // FIXME: this isnt always 8

if (connector->props.Colorspace && connector->colorspace.BT2020_RGB)
add(connector->id, connector->props.Colorspace, STATE.wideColorGamut ? connector->colorspace.BT2020_RGB : connector->colorspace.Default);

if (connector->props.hdr_output_metadata && data.atomic.hdrd)
add(connector->id, connector->props.hdr_output_metadata, data.atomic.hdrBlob);
}

void Aquamarine::CDRMAtomicRequest::addConnectorCursor(Hyprutils::Memory::CSharedPointer<SDRMConnector> connector, SDRMConnectorCommitData& data) {
if (!connector->crtc->cursor)
return;

const auto& STATE = connector->output->state->state();
const bool enable = STATE.enabled && data.mainFB;

if (enable) {
if (STATE.committed & COutputState::AQ_OUTPUT_STATE_CURSOR_SHAPE || STATE.committed & COutputState::AQ_OUTPUT_STATE_CURSOR_POS) {
TRACE(backend->log(AQ_LOG_TRACE, STATE.committed & COutputState::AQ_OUTPUT_STATE_CURSOR_SHAPE ? "atomic addConnector cursor shape" : "atomic addConnector cursor pos"));
if (STATE.committed & COutputState::AQ_OUTPUT_STATE_CURSOR_SHAPE) {
if (!connector->output->cursorVisible)
planeProps(connector->crtc->cursor, nullptr, 0, {});
else
planeProps(connector->crtc->cursor, data.cursorFB, connector->crtc->id, connector->output->cursorPos - connector->output->cursorHotspot);
} else if (connector->output->cursorVisible)
planePropsPos(connector->crtc->cursor, connector->output->cursorPos - connector->output->cursorHotspot);
}
} else
planeProps(connector->crtc->cursor, nullptr, 0, {});
}

bool Aquamarine::CDRMAtomicRequest::commit(uint32_t flagssss) {
Expand Down Expand Up @@ -320,10 +364,11 @@ bool Aquamarine::CDRMAtomicImpl::prepareConnector(Hyprutils::Memory::CSharedPoin
else {
if (!data.hdrMetadata->hdmi_metadata_type1.eotf) {
data.atomic.hdrBlob = 0;
data.atomic.hdrd = false;
data.atomic.hdrd = true;
} else if (drmModeCreatePropertyBlob(connector->backend->gpu->fd, &data.hdrMetadata.value(), sizeof(hdr_output_metadata), &data.atomic.hdrBlob)) {
connector->backend->backend->log(AQ_LOG_ERROR, "atomic drm: failed to create a hdr metadata blob");
data.atomic.hdrBlob = 0;
data.atomic.hdrd = false;
} else {
data.atomic.hdrd = true;
TRACE(connector->backend->backend->log(
Expand Down
3 changes: 2 additions & 1 deletion src/backend/drm/impl/Legacy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ bool Aquamarine::CDRMLegacyImpl::commitInternal(Hyprutils::Memory::CSharedPointe

// TODO: gamma

if (data.cursorFB && connector->crtc->cursor && connector->output->cursorVisible && enable) {
if (data.cursorFB && connector->crtc->cursor && connector->output->cursorVisible && enable &&
(STATE.committed & COutputState::AQ_OUTPUT_STATE_CURSOR_SHAPE || STATE.committed & COutputState::AQ_OUTPUT_STATE_CURSOR_POS)) {
uint32_t boHandle = 0;
auto attrs = data.cursorFB->buffer->dmabuf();

Expand Down
1 change: 1 addition & 0 deletions src/output/Output.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ void Aquamarine::COutputState::setCTM(const Hyprutils::Math::Mat3x3& ctm) {

void Aquamarine::COutputState::setWideColorGamut(bool wcg) {
internalState.wideColorGamut = wcg;
internalState.committed |= AQ_OUTPUT_STATE_WCG;
}

void Aquamarine::COutputState::setHDRMetadata(const hdr_output_metadata& metadata) {
Expand Down
Loading