@@ -359,26 +359,33 @@ static void _opencl_write_device_config(const int devid)
359359
360360 gchar key [256 ] = { 0 };
361361 gchar dat [512 ] = { 0 };
362- g_snprintf (key , 254 , "%s%s" , DT_CLDEVICE_HEAD , cl -> dev [devid ].cname );
363- g_snprintf (dat , 510 , "%i %i %i %i %i %.3f %.3f" ,
362+ g_snprintf (key , sizeof ( key ) , "%s%s" , DT_CLDEVICE_HEAD , cl -> dev [devid ].cname );
363+ g_snprintf (dat , sizeof ( dat ) , "%i %i %i %i %i %.3f %.3f" ,
364364 cl -> dev [devid ].micro_nap ,
365365 cl -> dev [devid ].pinned_memory ,
366366
367367 // this used to define the number of slots, now a bool and using DT_OPENCL_EVENTS if true
368368 cl -> dev [devid ].use_events ? 1 : 0 ,
369369 cl -> dev [devid ].asyncmode ,
370370 cl -> dev [devid ].disabled ,
371- cl -> dev [ devid ]. advantage ,
371+ 0.0f ,
372372 cl -> dev [devid ].unified_fraction );
373373 dt_print_nts (DT_DEBUG_OPENCL | DT_DEBUG_VERBOSE ,
374- "\n[opencl_write_device_config] writing data '%s' for '%s'\n" , dat , key );
374+ "[opencl_write_device_config] writing data '%s' for '%s'\n" , dat , key );
375+ dt_conf_set_string (key , dat );
376+
377+ // write per device list of modules that should not use OpenCL
378+ g_snprintf (key , sizeof (key ), "%s%s_nocl" , DT_CLDEVICE_HEAD , cl -> dev [devid ].cname );
379+ g_snprintf (dat , sizeof (dat ), "%s" , cl -> dev [devid ].avoid ? cl -> dev [devid ].avoid : "" );
380+ dt_print_nts (DT_DEBUG_OPENCL | DT_DEBUG_VERBOSE ,
381+ "[opencl_write_device_config] writing data '%s' for '%s'\n" , dat , key );
375382 dt_conf_set_string (key , dat );
376383
377384 // Also take care of extended device data, these are not only device
378385 // specific but also depend on the devid to support systems with two
379386 // similar cards.
380- g_snprintf (key , 254 , "%s%s_id%i" , DT_CLDEVICE_HEAD , cl -> dev [devid ].cname , devid );
381- g_snprintf (dat , 510 , "%i" , cl -> dev [devid ].headroom );
387+ g_snprintf (key , sizeof ( key ) , "%s%s_id%i" , DT_CLDEVICE_HEAD , cl -> dev [devid ].cname , devid );
388+ g_snprintf (dat , sizeof ( dat ) , "%i" , cl -> dev [devid ].headroom );
382389 dt_print_nts (DT_DEBUG_OPENCL | DT_DEBUG_VERBOSE ,
383390 "[opencl_write_device_config] writing data '%s' for '%s'\n" , dat , key );
384391 dt_conf_set_string (key , dat );
@@ -413,7 +420,7 @@ static gboolean _opencl_read_device_config(const int devid)
413420 dt_opencl_t * cl = darktable .opencl ;
414421 dt_opencl_device_t * cldid = & cl -> dev [devid ];
415422 gchar key [256 ] = { 0 };
416- g_snprintf (key , 254 , "%s%s" , DT_CLDEVICE_HEAD , cl -> dev [devid ].cname );
423+ g_snprintf (key , sizeof ( key ) , "%s%s" , DT_CLDEVICE_HEAD , cl -> dev [devid ].cname );
417424
418425 const gboolean existing_device = dt_conf_key_not_empty (key );
419426 gboolean safety_ok = TRUE;
@@ -435,7 +442,6 @@ static gboolean _opencl_read_device_config(const int devid)
435442 cldid -> pinned_memory = pinned_memory ? TRUE : FALSE;
436443 cldid -> asyncmode = asyncmode ? TRUE : FALSE;
437444 cldid -> disabled = disabled ? TRUE : FALSE;
438- cldid -> advantage = advantage ;
439445 cldid -> unified_fraction = unified_fraction ;
440446 }
441447
@@ -444,12 +450,14 @@ static gboolean _opencl_read_device_config(const int devid)
444450 cldid -> unified_fraction = 0.25f ;
445451 if ((cldid -> micro_nap < 0 ) || (cldid -> micro_nap > 1000000 ))
446452 cldid -> micro_nap = 250 ;
447- if ((cldid -> advantage < 0.0f ) || (cldid -> advantage > 10000.0f ))
448- cldid -> advantage = 0.0f ;
453+
454+ // Also read the per-device list of modules to be avoided for OpenCL
455+ g_snprintf (key , sizeof (key ), "%s%s_nocl" , DT_CLDEVICE_HEAD , cl -> dev [devid ].cname );
456+ cldid -> avoid = dt_conf_key_not_empty (key ) ? dt_conf_get_string (key ) : NULL ;
449457
450458 // Also take care of extended device data, these are not only device
451459 // specific but also depend on the devid
452- g_snprintf (key , 254 , "%s%s_id%i" , DT_CLDEVICE_HEAD , cldid -> cname , devid );
460+ g_snprintf (key , sizeof ( key ) , "%s%s_id%i" , DT_CLDEVICE_HEAD , cldid -> cname , devid );
453461 if (dt_conf_key_not_empty (key ))
454462 {
455463 const gchar * dat = dt_conf_get_string_const (key );
@@ -516,6 +524,7 @@ static gboolean _opencl_device_init(dt_opencl_t *cl,
516524 cl -> dev [dev ].cname = NULL ;
517525 cl -> dev [dev ].options = NULL ;
518526 cl -> dev [dev ].cflags = NULL ;
527+ cl -> dev [dev ].avoid = NULL ;
519528 cl -> dev [dev ].memory_in_use = 0 ;
520529 cl -> dev [dev ].peak_memory = 0 ;
521530 cl -> dev [dev ].used_available = 0 ;
@@ -528,7 +537,6 @@ static gboolean _opencl_device_init(dt_opencl_t *cl,
528537 cl -> dev [dev ].clmem_error = FALSE;
529538 cl -> dev [dev ].clroundup_wd = 16 ;
530539 cl -> dev [dev ].clroundup_ht = 16 ;
531- cl -> dev [dev ].advantage = 0.0f ;
532540 cl -> dev [dev ].use_events = TRUE;
533541 cl -> dev [dev ].asyncmode = FALSE;
534542 cl -> dev [dev ].disabled = FALSE;
@@ -853,8 +861,8 @@ static gboolean _opencl_device_init(dt_opencl_t *cl,
853861 if (cl -> dev [dev ].max_global_mem < (uint64_t )800ul * DT_MEGA )
854862 {
855863 dt_print_nts (DT_DEBUG_OPENCL ,
856- " *** insufficient global memory (%" PRIu64 " MB) ***\n" ,
857- cl -> dev [dev ].max_global_mem / DT_MEGA );
864+ " *** insufficient global memory %zu MB) ***\n" ,
865+ ( size_t ) cl -> dev [dev ].max_global_mem / DT_MEGA );
858866 res = TRUE;
859867 cl -> dev [dev ].disabled |= TRUE;
860868 goto end ;
@@ -875,18 +883,15 @@ static gboolean _opencl_device_init(dt_opencl_t *cl,
875883 }
876884
877885 dt_print_nts (DT_DEBUG_OPENCL ,
878- " GLOBAL MEM SIZE: %.0f MB\n" ,
879- (double )cl -> dev [dev ].max_global_mem / (double )DT_MEGA );
886+ " GLOBAL MEM SIZE: %zu MB\n" , (size_t )(cl -> dev [dev ].max_global_mem / DT_MEGA ));
880887 dt_print_nts (DT_DEBUG_OPENCL ,
881- " MAX IMAGE ALLOC: %.0f MB\n" ,
882- (double )cl -> dev [dev ].max_mem_alloc / (double )DT_MEGA );
888+ " MAX IMAGE ALLOC: %zu MB\n" , (size_t )(cl -> dev [dev ].max_mem_alloc / DT_MEGA ));
883889 dt_print_nts (DT_DEBUG_OPENCL ,
884- " MAX IMAGE SIZE: %zd x %zd\n" ,
885- cl -> dev [dev ].max_image_width , cl -> dev [dev ].max_image_height );
890+ " MAX IMAGE SIZE: %zu x %zu\n" , cl -> dev [dev ].max_image_width , cl -> dev [dev ].max_image_height );
886891 dt_print_nts (DT_DEBUG_OPENCL ,
887- " MAX CONSTANT BUFFER: %.0f KB\n" , (double ) cl -> dev [dev ].max_mem_constant / 1024.0 );
892+ " MAX CONSTANT BUFFER: %zu KB\n" , (size_t )( cl -> dev [dev ].max_mem_constant / 1024 ) );
888893 dt_print_nts (DT_DEBUG_OPENCL ,
889- " LOCAL MEM SIZE: %zu KB\n" , cl -> dev [dev ].local_size / 1024lu );
894+ " LOCAL MEM SIZE: %zu KB\n" , ( size_t )( cl -> dev [dev ].local_size / 1024 ) );
890895 dt_print_nts (DT_DEBUG_OPENCL ,
891896 " ADDRESS ALIGN: %d B\n" , cl -> dev [dev ].alignsize / 8 );
892897 dt_print_nts (DT_DEBUG_OPENCL ,
@@ -961,10 +966,10 @@ static gboolean _opencl_device_init(dt_opencl_t *cl,
961966 " EVENTS HANDLED: %s\n" , STR_YESNO (cl -> dev [dev ].use_events ));
962967 dt_print_nts (DT_DEBUG_OPENCL ,
963968 " OPENCL FAST MODE: %s\n" , STR_YESNO (fastopencl ));
964- dt_print_nts (DT_DEBUG_OPENCL ,
965- " TILING ADVANTAGE: %.3f\n" , cl -> dev [dev ].advantage );
966969 dt_print_nts (DT_DEBUG_OPENCL ,
967970 " DEFAULT DEVICE: %s\n" , STR_YESNO (type & CL_DEVICE_TYPE_DEFAULT ));
971+ dt_print_nts (DT_DEBUG_OPENCL ,
972+ " AVOIDED MODULES: %s\n" , cl -> dev [dev ].avoid ? cl -> dev [dev ].avoid : "none" );
968973
969974 if (cl -> dev [dev ].disabled )
970975 {
@@ -1221,6 +1226,7 @@ static void _cleanup_cl_device_mem(dt_opencl_t *cl, const int i)
12211226 free ((void * )(cl -> dev [i ].cname ));
12221227 free ((void * )(cl -> dev [i ].options ));
12231228 free ((void * )(cl -> dev [i ].cflags ));
1229+ g_free ((void * )(cl -> dev [i ].avoid ));
12241230}
12251231
12261232void dt_opencl_init (dt_opencl_t * cl ,
@@ -1607,7 +1613,7 @@ void dt_opencl_init(dt_opencl_t *cl,
16071613 dt_opencl_scheduling_profile_t profile = _opencl_get_scheduling_profile ();
16081614 _opencl_apply_scheduling_profile (profile );
16091615
1610- // let's keep track on unified memory devices
1616+ // let's report unified memory per device
16111617 dt_sys_resources_t * res = & darktable .dtresources ;
16121618 for (int i = 0 ; i < cl -> num_devs ; i ++ )
16131619 {
@@ -3598,9 +3604,9 @@ void dt_opencl_memory_statistics(int devid,
35983604 {
35993605 dt_print (DT_DEBUG_OPENCL ,"[opencl memory] device '%s' id=%d: %.1fMB in use, %.1fMB available GPU mem of %.1fMB" ,
36003606 cl -> dev [devid ].fullname , devid ,
3601- (float )cl -> dev [devid ].memory_in_use /( 1024 * 1024 ) ,
3602- (float )cl -> dev [devid ].used_available /( 1024 * 1024 ) ,
3603- (float )cl -> dev [devid ].max_global_mem /( 1024 * 1024 ) );
3607+ (float )cl -> dev [devid ].memory_in_use / DT_MEGA ,
3608+ (float )cl -> dev [devid ].used_available / DT_MEGA ,
3609+ (float )cl -> dev [devid ].max_global_mem / DT_MEGA );
36043610 if (cl -> dev [devid ].memory_in_use > darktable .opencl -> dev [devid ].used_available )
36053611 {
36063612 dt_print (DT_DEBUG_OPENCL ,
0 commit comments