diff --git a/src/backend/kms/render/gles.rs b/src/backend/kms/render/gles.rs index 5d79b1ee..3eb1e599 100644 --- a/src/backend/kms/render/gles.rs +++ b/src/backend/kms/render/gles.rs @@ -1,21 +1,30 @@ // SPDX-License-Identifier: GPL-3.0-only -use smithay::backend::{ - SwapBuffersError, - allocator::{ - Allocator, - dmabuf::{AnyError, Dmabuf, DmabufAllocator}, - gbm::GbmAllocator, - }, - drm::{CreateDrmNodeError, DrmNode}, - renderer::{ - RendererSuper, - gles::{GlesError, GlesRenderer}, - glow::GlowRenderer, - multigpu::{ApiDevice, Error as MultiError, GraphicsApi}, +use clap_lex::OsStrExt; +use rustix::path::Arg; +use smithay::{ + backend::{ + SwapBuffersError, + allocator::{ + Allocator, + dmabuf::{AnyError, Dmabuf, DmabufAllocator}, + gbm::GbmAllocator, + }, + drm::{CreateDrmNodeError, DrmNode}, + renderer::{ + RendererSuper, + gles::{GlesError, GlesRenderer, ffi}, + glow::GlowRenderer, + multigpu::{ApiDevice, Error as MultiError, GraphicsApi}, + }, }, + reexports::drm::control::Device, +}; +use std::{ + borrow::{Borrow, BorrowMut}, + cell::Cell, + ffi::{CStr, c_char}, }; -use std::{borrow::Borrow, cell::Cell}; use std::{ collections::HashMap, fmt, @@ -98,7 +107,7 @@ impl GbmGlowBackend { } } -impl GraphicsApi for GbmGlowBackend { +impl GraphicsApi for GbmGlowBackend { type Device = GbmGlowDevice; type Error = Error; @@ -123,11 +132,26 @@ impl GraphicsApi for GbmGlowBackend { .any(|renderer| renderer.node.dev_id() == node.dev_id()) }) .flat_map(|(node, (allocator, renderer))| { - let renderer = renderer.replace(None)?; + let mut renderer = renderer.replace(None)?; + let is_intel = allocator + .as_ref() + .get_driver() + .is_ok_and(|drv| drv.name().contains("i915")); + let intel_export_quirk = is_intel + && BorrowMut::::borrow_mut(&mut renderer) + .with_context(|gl| unsafe { + CStr::from_ptr(gl.GetString(ffi::RENDERER) as *const c_char) + }) + .is_ok_and(|name| { + name.as_str().is_ok_and(|name| { + name.contains("MTL") || name.contains("ARL") || name.contains("LNL") + }) + }); Some(GbmGlowDevice { node: *node, renderer, + intel_export_quirk, allocator: Box::new(DmabufAllocator(allocator.clone())), }) }) @@ -150,6 +174,7 @@ impl GraphicsApi for GbmGlowBackend { pub struct GbmGlowDevice { node: DrmNode, renderer: GlowRenderer, + intel_export_quirk: bool, allocator: Box>, } @@ -180,9 +205,14 @@ impl ApiDevice for GbmGlowDevice { fn can_do_cross_device_imports(&self) -> bool { !Borrow::::borrow(&self.renderer).is_software() } + + fn should_do_cross_device_exports(&self) -> bool { + !self.intel_export_quirk + } } -impl FromGlesError for MultiError, T> +impl FromGlesError + for MultiError, T> where T::Error: 'static, <::Renderer as RendererSuper>::Error: 'static,