static bool append_softfilter_plugs(rarch_softfilter_t *filt, struct string_list *list) { unsigned i; softfilter_simd_mask_t mask = cpu_features_get(); (void)list; filt->plugs = (struct rarch_soft_plug*) calloc(ARRAY_SIZE(soft_plugs_builtin), sizeof(*filt->plugs)); if (!filt->plugs) return false; filt->num_plugs = ARRAY_SIZE(soft_plugs_builtin); for (i = 0; i < ARRAY_SIZE(soft_plugs_builtin); i++) { filt->plugs[i].impl = soft_plugs_builtin[i](mask); if (!filt->plugs[i].impl) return false; } return true; }
static bool append_softfilter_plugs(rarch_softfilter_t *filt, struct string_list *list) { unsigned i; softfilter_simd_mask_t mask = cpu_features_get(); for (i = 0; i < list->size; i++) { softfilter_get_implementation_t cb; const struct softfilter_implementation *impl = NULL; struct rarch_soft_plug *new_plugs = NULL; dylib_t lib = dylib_load(list->elems[i].data); if (!lib) continue; cb = (softfilter_get_implementation_t) dylib_proc(lib, "softfilter_get_implementation"); if (!cb) { dylib_close(lib); continue; } impl = cb(mask); if (!impl) { dylib_close(lib); continue; } if (impl->api_version != SOFTFILTER_API_VERSION) { dylib_close(lib); continue; } new_plugs = (struct rarch_soft_plug*) realloc(filt->plugs, sizeof(*filt->plugs) * (filt->num_plugs + 1)); if (!new_plugs) { dylib_close(lib); return false; } RARCH_LOG("[SoftFilter]: Found plug: %s (%s).\n", impl->ident, impl->short_ident); filt->plugs = new_plugs; filt->plugs[filt->num_plugs].lib = lib; filt->plugs[filt->num_plugs].impl = impl; filt->num_plugs++; } return true; }
static resampler_simd_mask_t resampler_get_cpu_features(void) { return cpu_features_get(); }
rarch_softfilter_t *rarch_softfilter_new(const char *filter_config, unsigned threads, enum retro_pixel_format in_pixel_format, unsigned max_width, unsigned max_height) { softfilter_simd_mask_t cpu_features = cpu_features_get(); char basedir[PATH_MAX_LENGTH]; #ifdef HAVE_DYLIB char ext_name[PATH_MAX_LENGTH]; #endif struct string_list *plugs = NULL; rarch_softfilter_t *filt = NULL; (void)basedir; filt = (rarch_softfilter_t*)calloc(1, sizeof(*filt)); if (!filt) return NULL; filt->conf = config_file_new(filter_config); if (!filt->conf) { RARCH_ERR("[SoftFilter]: Did not find config: %s\n", filter_config); goto error; } #if defined(HAVE_DYLIB) fill_pathname_basedir(basedir, filter_config, sizeof(basedir)); if (!frontend_driver_get_core_extension(ext_name, sizeof(ext_name))) goto error; plugs = dir_list_new(basedir, ext_name, false, false, false, false); if (!plugs) { RARCH_ERR("[SoftFilter]: Could not build up string list...\n"); goto error; } #endif if (!append_softfilter_plugs(filt, plugs)) { RARCH_ERR("[SoftFitler]: Failed to append softfilter plugins...\n"); goto error; } if (plugs) string_list_free(plugs); plugs = NULL; if (!create_softfilter_graph(filt, in_pixel_format, max_width, max_height, cpu_features, threads)) { RARCH_ERR("[SoftFitler]: Failed to create softfilter graph...\n"); goto error; } return filt; error: if (plugs) string_list_free(plugs); plugs = NULL; rarch_softfilter_free(filt); return NULL; }