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