@@ -91,7 +91,6 @@ std::shared_ptr<cros_gralloc_driver> cros_gralloc_driver::get_instance()
9191	return  s_instance;
9292}
9393
94- #ifndef  DRV_EXTERNAL
9594static  struct  driver  *init_try_node (int  idx, char  const  *str)
9695{
9796	int  fd;
@@ -132,6 +131,27 @@ static struct driver *init_try_nodes()
132131	uint32_t  min_card_node = DRM_CARD_NODE_START;
133132	uint32_t  max_card_node = (min_card_node + num_nodes);
134133
134+ 	char  lib_name[PROPERTY_VALUE_MAX];
135+ 	property_get (" vendor.gralloc.minigbm.backend" " auto" 
136+ 
137+ 	if  (strcmp (lib_name, " dmaheaps" 0 ) {
138+ 		ALOGI (" Initializing dma-buf heaps backend" 
139+ 		drv = drv_create (DRV_DMAHEAPS_DRIVER);
140+ 		if  (drv)
141+ 			return  drv;
142+ 
143+ 		ALOGE (" Failed to initialize dma-buf heap backend." 
144+ 	}
145+ 
146+ 	if  (strcmp (lib_name, " gbm_mesa" 0 ) {
147+ 		ALOGI (" Initializing gbm_mesa backend" 
148+ 		drv = drv_create (DRV_GBM_MESA_DRIVER);
149+ 		if  (drv)
150+ 			return  drv;
151+ 
152+ 		ALOGE (" Failed to initialize gbm_mesa backend." 
153+ 	}
154+ 
135155	//  Try render nodes...
136156	for  (uint32_t  i = min_render_node; i < max_render_node; i++) {
137157		drv = init_try_node (i, render_nodes_fmt);
@@ -146,18 +166,19 @@ static struct driver *init_try_nodes()
146166			return  drv;
147167	}
148168
149- 	return  nullptr ;
150- }
169+ 	/*  Fallback to gbm_mesa which is a way smarter than dumb_driver */ 
170+ 	if  (strcmp (lib_name, " gbm_mesa" 0 ) {
171+ 		ALOGI (" Falling-back to gbm_mesa backend" 
172+ 		drv = drv_create (DRV_GBM_MESA_DRIVER);
173+ 		if  (drv)
174+ 			return  drv;
175+ 	}
151176
152- # else 
177+ 	 ALOGE ( " Failed for find suitable backend " ); 
153178
154- static  struct  driver  *init_try_nodes ()
155- {
156- 	return  drv_create (-1 );
179+ 	return  nullptr ;
157180}
158181
159- #endif 
160- 
161182static  void  drv_destroy_and_close (struct  driver  *drv)
162183{
163184	int  fd = drv_get_fd (drv);
0 commit comments