mirror of
https://github.com/hyprwm/aquamarine.git
synced 2025-12-29 10:20:07 +01:00
drm: Avoid unnecessary modesetting (#183)
This commit is contained in:
parent
dc45d00900
commit
c0c56dde3e
4 changed files with 17 additions and 28 deletions
|
|
@ -18,8 +18,7 @@ using namespace Hyprutils::Memory;
|
||||||
#define WP CWeakPointer
|
#define WP CWeakPointer
|
||||||
|
|
||||||
Aquamarine::CDRMDumbBuffer::CDRMDumbBuffer(const SAllocatorBufferParams& params, Hyprutils::Memory::CWeakPointer<CDRMDumbAllocator> allocator_,
|
Aquamarine::CDRMDumbBuffer::CDRMDumbBuffer(const SAllocatorBufferParams& params, Hyprutils::Memory::CWeakPointer<CDRMDumbAllocator> allocator_,
|
||||||
Hyprutils::Memory::CSharedPointer<CSwapchain> swapchain) :
|
Hyprutils::Memory::CSharedPointer<CSwapchain> swapchain) : allocator(allocator_) {
|
||||||
allocator(allocator_) {
|
|
||||||
attrs.format = params.format;
|
attrs.format = params.format;
|
||||||
|
|
||||||
if (int ret = drmModeCreateDumbBuffer(allocator->drmFD(), params.size.x, params.size.y, 32, 0, &handle, &stride, &bufferLen); ret < 0) {
|
if (int ret = drmModeCreateDumbBuffer(allocator->drmFD(), params.size.x, params.size.y, 32, 0, &handle, &stride, &bufferLen); ret < 0) {
|
||||||
|
|
|
||||||
|
|
@ -62,8 +62,7 @@ static SDRMFormat guessFormatFrom(std::vector<SDRMFormat> formats, bool cursor,
|
||||||
}
|
}
|
||||||
|
|
||||||
Aquamarine::CGBMBuffer::CGBMBuffer(const SAllocatorBufferParams& params, Hyprutils::Memory::CWeakPointer<CGBMAllocator> allocator_,
|
Aquamarine::CGBMBuffer::CGBMBuffer(const SAllocatorBufferParams& params, Hyprutils::Memory::CWeakPointer<CGBMAllocator> allocator_,
|
||||||
Hyprutils::Memory::CSharedPointer<CSwapchain> swapchain) :
|
Hyprutils::Memory::CSharedPointer<CSwapchain> swapchain) : allocator(allocator_) {
|
||||||
allocator(allocator_) {
|
|
||||||
if (!allocator)
|
if (!allocator)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -100,8 +100,16 @@ 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)));
|
TRACE(backend->log(AQ_LOG_TRACE, std::format("atomic addConnector values: CRTC {}, mode {}", enable ? connector->crtc->id : 0, data.atomic.modeBlob)));
|
||||||
|
|
||||||
conn = connector;
|
conn = connector;
|
||||||
|
drmModeModeInfo* currentMode = connector->getCurrentMode();
|
||||||
|
bool modeDiffers = true;
|
||||||
|
if (currentMode) {
|
||||||
|
modeDiffers = memcmp(currentMode, &data.modeInfo, sizeof(drmModeModeInfo)) != 0;
|
||||||
|
free(currentMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modeDiffers)
|
||||||
addConnectorModeset(connector, data);
|
addConnectorModeset(connector, data);
|
||||||
|
|
||||||
addConnectorCursor(connector, data);
|
addConnectorCursor(connector, data);
|
||||||
|
|
||||||
add(connector->id, connector->props.crtc_id, enable ? connector->crtc->id : 0);
|
add(connector->id, connector->props.crtc_id, enable ? connector->crtc->id : 0);
|
||||||
|
|
@ -455,22 +463,7 @@ bool Aquamarine::CDRMAtomicImpl::commit(Hyprutils::Memory::CSharedPointer<SDRMCo
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Aquamarine::CDRMAtomicImpl::reset() {
|
bool Aquamarine::CDRMAtomicImpl::reset() {
|
||||||
CDRMAtomicRequest request(backend);
|
return true;
|
||||||
|
|
||||||
for (auto const& crtc : backend->crtcs) {
|
|
||||||
request.add(crtc->id, crtc->props.mode_id, 0);
|
|
||||||
request.add(crtc->id, crtc->props.active, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto const& conn : backend->connectors) {
|
|
||||||
request.add(conn->id, conn->props.crtc_id, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto const& plane : backend->planes) {
|
|
||||||
request.planeProps(plane, nullptr, 0, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
return request.commit(DRM_MODE_ATOMIC_ALLOW_MODESET);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Aquamarine::CDRMAtomicImpl::moveCursor(SP<SDRMConnector> connector, bool skipSchedule) {
|
bool Aquamarine::CDRMAtomicImpl::moveCursor(SP<SDRMConnector> connector, bool skipSchedule) {
|
||||||
|
|
|
||||||
|
|
@ -70,15 +70,13 @@ int main(int argc, char** argv, char** envp) {
|
||||||
});
|
});
|
||||||
|
|
||||||
newMouseListener = aqBackend->events.newPointer.listen([](const SP<Aquamarine::IPointer>& pointer) {
|
newMouseListener = aqBackend->events.newPointer.listen([](const SP<Aquamarine::IPointer>& pointer) {
|
||||||
mouseMotionListener = pointer->events.warp.listen([](const Aquamarine::IPointer::SWarpEvent& event) {
|
mouseMotionListener = pointer->events.warp.listen(
|
||||||
std::cout << "[Client] Mouse warped to " << std::format("{}", event.absolute) << "\n";
|
[](const Aquamarine::IPointer::SWarpEvent& event) { std::cout << "[Client] Mouse warped to " << std::format("{}", event.absolute) << "\n"; });
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
newKeyboardListener = aqBackend->events.newKeyboard.listen([](const SP<Aquamarine::IKeyboard>& keyboard) {
|
newKeyboardListener = aqBackend->events.newKeyboard.listen([](const SP<Aquamarine::IKeyboard>& keyboard) {
|
||||||
keyboardKeyListener = keyboard->events.key.listen([](const Aquamarine::IKeyboard::SKeyEvent& event) {
|
keyboardKeyListener = keyboard->events.key.listen(
|
||||||
std::cout << "[Client] Key " << std::format("{}", event.key) << " state: " << event.pressed << " \n";
|
[](const Aquamarine::IKeyboard::SKeyEvent& event) { std::cout << "[Client] Key " << std::format("{}", event.key) << " state: " << event.pressed << " \n"; });
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!aqBackend || !aqBackend->start()) {
|
if (!aqBackend || !aqBackend->start()) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue