@@ -14,7 +14,7 @@ use indexmap::IndexMap;
1414use render:: gles:: GbmGlowBackend ;
1515use smithay:: {
1616 backend:: {
17- allocator:: { Buffer , dmabuf:: Dmabuf , format:: FormatSet } ,
17+ allocator:: { dmabuf:: Dmabuf , format:: FormatSet } ,
1818 drm:: { DrmDeviceFd , DrmNode , NodeType , VrrSupport , output:: DrmOutputRenderElements } ,
1919 egl:: { EGLContext , EGLDevice , EGLDisplay } ,
2020 input:: InputEvent ,
@@ -41,7 +41,7 @@ use smithay::{
4141 } ,
4242} ;
4343use surface:: GbmDrmOutput ;
44- use tracing:: { debug, error, info, trace , warn} ;
44+ use tracing:: { debug, error, info, warn} ;
4545
4646use std:: {
4747 collections:: { HashMap , HashSet } ,
@@ -487,78 +487,55 @@ impl KmsState {
487487
488488 pub fn dmabuf_imported (
489489 & mut self ,
490- _client : Option < Client > ,
490+ client : Option < Client > ,
491491 global : & DmabufGlobal ,
492492 dmabuf : Dmabuf ,
493493 ) -> Result < DrmNode > {
494- let ( expected_node , mut other_nodes ) = self
494+ let device = self
495495 . drm_devices
496496 . values_mut ( )
497- . partition :: < Vec < _ > , _ > ( |device| {
497+ . find ( |device| {
498498 device
499499 . socket
500500 . as_ref ( )
501501 . map ( |s| & s. dmabuf_global == global)
502502 . unwrap_or ( false )
503- } ) ;
504- other_nodes. retain ( |device| device. socket . is_some ( ) ) ;
505-
506- let mut last_err = anyhow:: anyhow!( "Dmabuf cannot be imported on any gpu" ) ;
507- for device in expected_node. into_iter ( ) . chain ( other_nodes. into_iter ( ) ) {
508- let mut _egl = None ;
509- let egl_display = if let Some ( egl_display) = device
510- . inner
511- . egl
512- . as_ref ( )
513- . map ( |internals| & internals. display )
514- {
515- egl_display
516- } else {
517- _egl =
518- Some ( init_egl ( & device. inner . gbm ) . context ( "Failed to initialize egl context" ) ?) ;
519- & _egl. as_ref ( ) . unwrap ( ) . display
520- } ;
521-
522- if !egl_display
523- . dmabuf_texture_formats ( )
524- . contains ( & dmabuf. format ( ) )
525- {
526- trace ! (
527- "Skipping import of dmabuf on {:?}: unsupported format" ,
528- device. inner. render_node
503+ } )
504+ . context ( "Couldn't find gpu for dmabuf global" ) ?;
505+
506+ let new_client = if let Some ( client) = client {
507+ let new = device. inner . active_clients . insert ( client. id ( ) ) ;
508+ device. inner . update_egl (
509+ self . primary_node . read ( ) . unwrap ( ) . as_ref ( ) ,
510+ self . api . as_mut ( ) ,
511+ ) ? && new
512+ } else {
513+ false
514+ } ;
515+
516+ let egl = device
517+ . inner
518+ . egl
519+ . as_ref ( )
520+ . context ( "EGL initialization Error" ) ?;
521+ egl. display
522+ . create_image_from_dmabuf ( & dmabuf)
523+ . inspect ( |image| unsafe {
524+ smithay:: backend:: egl:: ffi:: egl:: DestroyImageKHR (
525+ * * egl. display . get_display_handle ( ) ,
526+ * image,
529527 ) ;
530- continue ;
531- }
528+ } )
529+ . context ( "Failed to create EGLImage from dmabuf" ) ? ;
532530
533- let result = egl_display
534- . create_image_from_dmabuf ( & dmabuf)
535- . map ( |image| {
536- unsafe {
537- smithay:: backend:: egl:: ffi:: egl:: DestroyImageKHR (
538- * * egl_display. get_display_handle ( ) ,
539- image,
540- ) ;
541- } ;
542- device. inner . render_node
543- } )
544- . map_err ( Into :: into) ;
531+ let node = device. inner . render_node ;
532+ dmabuf. set_node ( node) ;
545533
546- match result {
547- Ok ( node) => {
548- dmabuf. set_node ( node) ; // so the MultiRenderer knows what node to use
549- return Ok ( node) ;
550- }
551- Err ( err) => {
552- trace ! (
553- ?err,
554- "Failed to import dmabuf on {:?}" , device. inner. render_node
555- ) ;
556- last_err = err;
557- }
558- }
534+ if new_client {
535+ self . refresh_used_devices ( ) ?;
559536 }
560537
561- Err ( last_err )
538+ Ok ( node )
562539 }
563540
564541 pub fn schedule_render ( & mut self , output : & Output ) {
0 commit comments