forked from quickshell/quickshell
wayland/screencopy: handle buffer creation failures
This commit is contained in:
parent
ab096b7e78
commit
91c9db581e
4 changed files with 30 additions and 0 deletions
|
@ -69,6 +69,11 @@ bool WlBufferManager::isReady() const { return this->p->mReady; }
|
||||||
qCDebug(logBuffer) << " Format" << format;
|
qCDebug(logBuffer) << " Format" << format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (request.width == 0 || request.height == 0) {
|
||||||
|
qCWarning(logBuffer) << "Cannot create zero-sized buffer.";
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
if (!dmabufDisabled) {
|
if (!dmabufDisabled) {
|
||||||
if (auto* buf = this->p->dmabuf.createDmabuf(request)) return buf;
|
if (auto* buf = this->p->dmabuf.createDmabuf(request)) return buf;
|
||||||
qCWarning(logBuffer) << "DMA buffer creation failed, falling back to SHM.";
|
qCWarning(logBuffer) << "DMA buffer creation failed, falling back to SHM.";
|
||||||
|
|
|
@ -103,6 +103,16 @@ void HyprlandScreencopyContext::hyprland_toplevel_export_frame_v1_flags(uint32_t
|
||||||
|
|
||||||
void HyprlandScreencopyContext::hyprland_toplevel_export_frame_v1_buffer_done() {
|
void HyprlandScreencopyContext::hyprland_toplevel_export_frame_v1_buffer_done() {
|
||||||
auto* backbuffer = this->mSwapchain.createBackbuffer(this->request);
|
auto* backbuffer = this->mSwapchain.createBackbuffer(this->request);
|
||||||
|
|
||||||
|
if (!backbuffer || !backbuffer->buffer()) {
|
||||||
|
qCWarning(logScreencopy) << "Backbuffer creation failed for screencopy. Skipping frame.";
|
||||||
|
|
||||||
|
// Try again. This will be spammy if the compositor continuously sends bad frames.
|
||||||
|
this->destroy();
|
||||||
|
this->captureFrame();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this->copy(backbuffer->buffer(), this->copiedFirstFrame ? 0 : 1);
|
this->copy(backbuffer->buffer(), this->copiedFirstFrame ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,12 @@ void IccScreencopyContext::doCapture() {
|
||||||
auto newBuffer = false;
|
auto newBuffer = false;
|
||||||
auto* backbuffer = this->mSwapchain.createBackbuffer(this->request, &newBuffer);
|
auto* backbuffer = this->mSwapchain.createBackbuffer(this->request, &newBuffer);
|
||||||
|
|
||||||
|
if (!backbuffer || !backbuffer->buffer()) {
|
||||||
|
qCWarning(logIcc) << "Backbuffer creation failed for screencopy. Waiting for updated buffer "
|
||||||
|
"creation parameters before trying again.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this->IccCaptureFrame::init(this->IccCaptureSession::create_frame());
|
this->IccCaptureFrame::init(this->IccCaptureSession::create_frame());
|
||||||
this->IccCaptureFrame::attach_buffer(backbuffer->buffer());
|
this->IccCaptureFrame::attach_buffer(backbuffer->buffer());
|
||||||
|
|
||||||
|
|
|
@ -111,6 +111,15 @@ void WlrScreencopyContext::zwlr_screencopy_frame_v1_flags(uint32_t flags) {
|
||||||
void WlrScreencopyContext::zwlr_screencopy_frame_v1_buffer_done() {
|
void WlrScreencopyContext::zwlr_screencopy_frame_v1_buffer_done() {
|
||||||
auto* backbuffer = this->mSwapchain.createBackbuffer(this->request);
|
auto* backbuffer = this->mSwapchain.createBackbuffer(this->request);
|
||||||
|
|
||||||
|
if (!backbuffer || !backbuffer->buffer()) {
|
||||||
|
qCWarning(logScreencopy) << "Backbuffer creation failed for screencopy. Skipping frame.";
|
||||||
|
|
||||||
|
// Try again. This will be spammy if the compositor continuously sends bad frames.
|
||||||
|
this->destroy();
|
||||||
|
this->captureFrame();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this->copiedFirstFrame) {
|
if (this->copiedFirstFrame) {
|
||||||
this->copy_with_damage(backbuffer->buffer());
|
this->copy_with_damage(backbuffer->buffer());
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue