From 0bd97eb1ba2e6ad044eba9afbc94e1862b620e11 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 19 Aug 2014 17:05:47 +0200 Subject: [PATCH] (SoftFilter) Bump up API version - start supporting config files (stub for now) --- audio/dsp_filter.c | 1 - gfx/filter.c | 2 +- gfx/filters/2xbr.c | 4 ++- gfx/filters/2xsai.c | 4 ++- gfx/filters/blargg_ntsc_snes_composite.c | 4 ++- gfx/filters/blargg_ntsc_snes_rf.c | 4 ++- gfx/filters/blargg_ntsc_snes_rgb.c | 4 ++- gfx/filters/blargg_ntsc_snes_svideo.c | 4 ++- gfx/filters/darken.c | 4 ++- gfx/filters/epx.c | 4 ++- gfx/filters/lq2x.c | 4 ++- gfx/filters/phosphor2x.c | 4 ++- gfx/filters/scale2x.c | 4 ++- gfx/filters/softfilter.h | 34 ++++++++++++++++++++++-- gfx/filters/super2xsai.c | 4 ++- gfx/filters/supereagle.c | 4 ++- 16 files changed, 72 insertions(+), 17 deletions(-) diff --git a/audio/dsp_filter.c b/audio/dsp_filter.c index e6f7a28324..8edf2a9b01 100644 --- a/audio/dsp_filter.c +++ b/audio/dsp_filter.c @@ -101,7 +101,6 @@ static int get_int(void *userdata, const char *key_str, int *value, int default_ return got; } -// Yup, still C >__< #define get_array_setup() \ struct dsp_userdata *dsp = (struct dsp_userdata*)userdata; \ \ diff --git a/gfx/filter.c b/gfx/filter.c index 6a972950ea..d46ac6beea 100644 --- a/gfx/filter.c +++ b/gfx/filter.c @@ -227,7 +227,7 @@ rarch_softfilter_t *rarch_softfilter_new(const char *filter_path, filt->max_width = max_width; filt->max_height = max_height; - filt->impl_data = filt->impl->create(input_fmt, input_fmt, max_width, max_height, + filt->impl_data = filt->impl->create(NULL, input_fmt, input_fmt, max_width, max_height, threads != RARCH_SOFTFILTER_THREADS_AUTO ? threads : rarch_get_cpu_cores(), cpu_features); if (!filt->impl_data) { diff --git a/gfx/filters/2xbr.c b/gfx/filters/2xbr.c index 77758710d8..570a548af8 100644 --- a/gfx/filters/2xbr.c +++ b/gfx/filters/2xbr.c @@ -220,11 +220,13 @@ static void SetupFormat(void * data) } } -static void *twoxbr_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *twoxbr_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/2xsai.c b/gfx/filters/2xsai.c index cf63ebf923..614857c90d 100644 --- a/gfx/filters/2xsai.c +++ b/gfx/filters/2xsai.c @@ -63,11 +63,13 @@ static unsigned twoxsai_generic_threads(void *data) return filt->threads; } -static void *twoxsai_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *twoxsai_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/blargg_ntsc_snes_composite.c b/gfx/filters/blargg_ntsc_snes_composite.c index dfc7217677..750593e0ce 100644 --- a/gfx/filters/blargg_ntsc_snes_composite.c +++ b/gfx/filters/blargg_ntsc_snes_composite.c @@ -80,11 +80,13 @@ static void blargg_ntsc_snes_composite_initialize(void *data) filt->burst_toggle = (setup.merge_fields ? 0 : 1); } -static void *blargg_ntsc_snes_composite_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *blargg_ntsc_snes_composite_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/blargg_ntsc_snes_rf.c b/gfx/filters/blargg_ntsc_snes_rf.c index adf0137cb8..702a70144f 100644 --- a/gfx/filters/blargg_ntsc_snes_rf.c +++ b/gfx/filters/blargg_ntsc_snes_rf.c @@ -79,11 +79,13 @@ static void blargg_ntsc_snes_rf_initialize(void *data) filt->burst_toggle = (setup.merge_fields ? 0 : 1); } -static void *blargg_ntsc_snes_rf_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *blargg_ntsc_snes_rf_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/blargg_ntsc_snes_rgb.c b/gfx/filters/blargg_ntsc_snes_rgb.c index 8e8e274047..01607ea094 100644 --- a/gfx/filters/blargg_ntsc_snes_rgb.c +++ b/gfx/filters/blargg_ntsc_snes_rgb.c @@ -79,11 +79,13 @@ static void blargg_ntsc_snes_rgb_initialize(void *data) filt->burst_toggle = (setup.merge_fields ? 0 : 1); } -static void *blargg_ntsc_snes_rgb_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *blargg_ntsc_snes_rgb_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/blargg_ntsc_snes_svideo.c b/gfx/filters/blargg_ntsc_snes_svideo.c index 50b1b8bbca..e4f16eb149 100644 --- a/gfx/filters/blargg_ntsc_snes_svideo.c +++ b/gfx/filters/blargg_ntsc_snes_svideo.c @@ -79,11 +79,13 @@ static void blargg_ntsc_snes_svideo_initialize(void *data) filt->burst_toggle = (setup.merge_fields ? 0 : 1); } -static void *blargg_ntsc_snes_svideo_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *blargg_ntsc_snes_svideo_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/darken.c b/gfx/filters/darken.c index bfcc112578..a47bc12668 100644 --- a/gfx/filters/darken.c +++ b/gfx/filters/darken.c @@ -63,11 +63,13 @@ static unsigned darken_threads(void *data) return filt->threads; } -static void *darken_create(unsigned in_fmt, unsigned out_fmt, +static void *darken_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/epx.c b/gfx/filters/epx.c index 6d3afc5087..f521392e88 100644 --- a/gfx/filters/epx.c +++ b/gfx/filters/epx.c @@ -63,11 +63,13 @@ static unsigned epx_generic_threads(void *data) return filt->threads; } -static void *epx_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *epx_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/lq2x.c b/gfx/filters/lq2x.c index 383a758223..2101391fcc 100644 --- a/gfx/filters/lq2x.c +++ b/gfx/filters/lq2x.c @@ -63,11 +63,13 @@ static unsigned lq2x_generic_threads(void *data) return filt->threads; } -static void *lq2x_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *lq2x_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/phosphor2x.c b/gfx/filters/phosphor2x.c index a62c75b158..2055740440 100644 --- a/gfx/filters/phosphor2x.c +++ b/gfx/filters/phosphor2x.c @@ -216,7 +216,8 @@ static unsigned phosphor2x_generic_threads(void *data) return filt->threads; } -static void *phosphor2x_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *phosphor2x_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { @@ -227,6 +228,7 @@ static void *phosphor2x_generic_create(unsigned in_fmt, unsigned out_fmt, (void)out_fmt; (void)max_width; (void)max_height; + (void)config; if (!filt) return NULL; diff --git a/gfx/filters/scale2x.c b/gfx/filters/scale2x.c index ad0c31da82..427a7f9217 100644 --- a/gfx/filters/scale2x.c +++ b/gfx/filters/scale2x.c @@ -122,11 +122,13 @@ static unsigned scale2x_generic_threads(void *data) return filt->threads; } -static void *scale2x_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *scale2x_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/softfilter.h b/gfx/filters/softfilter.h index 31761bbd54..92bf8cb4c6 100644 --- a/gfx/filters/softfilter.h +++ b/gfx/filters/softfilter.h @@ -43,12 +43,42 @@ extern "C" { // Allows an implementation to pick different softfilter_implementation structs. typedef unsigned softfilter_simd_mask_t; +// Returns true if config key was found. Otherwise, returns false, and sets value to default value. +typedef int (*softfilter_config_get_float_t)(void *userdata, const char *key, float *value, float default_value); +typedef int (*softfilter_config_get_int_t)(void *userdata, const char *key, int *value, int default_value); + +// Allocates an array with values. free() with softfilter_config_free_t. +typedef int (*softfilter_config_get_float_array_t)(void *userdata, const char *key, + float **values, unsigned *out_num_values, + const float *default_values, unsigned num_default_values); + +typedef int (*softfilter_config_get_int_array_t)(void *userdata, const char *key, + int **values, unsigned *out_num_values, + const int *default_values, unsigned num_default_values); + +typedef int (*softfilter_config_get_string_t)(void *userdata, const char *key, char **output, const char *default_output); + +// Calls free() in host runtime. Sometimes needed on Windows. free() on NULL is fine. +typedef void (*softfilter_config_free_t)(void *ptr); + +struct softfilter_config +{ + softfilter_config_get_float_t get_float; + softfilter_config_get_int_t get_int; + + softfilter_config_get_float_array_t get_float_array; + softfilter_config_get_int_array_t get_int_array; + + softfilter_config_get_string_t get_string; + softfilter_config_free_t free; // Avoid problems where softfilter plug and host are linked against different C runtimes. +}; + // Dynamic library entrypoint. typedef const struct softfilter_implementation *(*softfilter_get_implementation_t)(softfilter_simd_mask_t); // The same SIMD mask argument is forwarded to create() callback as well to avoid having to keep lots of state around. const struct softfilter_implementation *softfilter_get_implementation(softfilter_simd_mask_t simd); -#define SOFTFILTER_API_VERSION 1 +#define SOFTFILTER_API_VERSION 2 // Required base color formats @@ -79,7 +109,7 @@ struct softfilter_work_packet // Create a filter with given input and output formats as well as maximum possible input size. // Input sizes can very per call to softfilter_process_t, but they will never be larger than the maximum. -typedef void *(*softfilter_create_t)(unsigned in_fmt, unsigned out_fmt, +typedef void *(*softfilter_create_t)(const struct softfilter_config *config, unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd); typedef void (*softfilter_destroy_t)(void *data); diff --git a/gfx/filters/super2xsai.c b/gfx/filters/super2xsai.c index c16ce544fe..68f7f0b6a8 100644 --- a/gfx/filters/super2xsai.c +++ b/gfx/filters/super2xsai.c @@ -63,11 +63,13 @@ static unsigned supertwoxsai_generic_threads(void *data) return filt->threads; } -static void *supertwoxsai_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *supertwoxsai_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt) diff --git a/gfx/filters/supereagle.c b/gfx/filters/supereagle.c index f3a294f134..005a55c789 100644 --- a/gfx/filters/supereagle.c +++ b/gfx/filters/supereagle.c @@ -63,11 +63,13 @@ static unsigned supereagle_generic_threads(void *data) return filt->threads; } -static void *supereagle_generic_create(unsigned in_fmt, unsigned out_fmt, +static void *supereagle_generic_create(const struct softfilter_config *config, + unsigned in_fmt, unsigned out_fmt, unsigned max_width, unsigned max_height, unsigned threads, softfilter_simd_mask_t simd) { (void)simd; + (void)config; struct filter_data *filt = (struct filter_data*)calloc(1, sizeof(*filt)); if (!filt)