diff --git a/driver.c b/driver.c index 4af2baa36e..2c372d509d 100644 --- a/driver.c +++ b/driver.c @@ -220,6 +220,7 @@ static void init_filter(void) if (*g_settings.video.filter_path == '\0') return; + SSNES_LOG("Loading bSNES filter from \"%s\"\n", g_settings.video.filter_path); g_extern.filter.lib = dylib_load(g_settings.video.filter_path); if (!g_extern.filter.lib) { @@ -227,8 +228,8 @@ static void init_filter(void) return; } - g_extern.filter.psize = dylib_proc(g_extern.filter.lib, "video_size"); - g_extern.filter.prender = dylib_proc(g_extern.filter.lib, "video_render"); + g_extern.filter.psize = dylib_proc(g_extern.filter.lib, "filter_size"); + g_extern.filter.prender = dylib_proc(g_extern.filter.lib, "filter_render"); if (!g_extern.filter.psize || !g_extern.filter.prender) { SSNES_ERR("Failed to find functions in filter...\n"); @@ -255,7 +256,7 @@ static void init_filter(void) g_extern.filter.colormap = malloc(32768 * sizeof(uint32_t)); assert(g_extern.filter.colormap); - // TODO: Taken from bSNES source. WTF does this do? + // Set up conversion map from 16-bit XBGR1555 to 32-bit RGBA. for (int i = 0; i < 32768; i++) { unsigned r = (i >> 10) & 31; @@ -265,7 +266,7 @@ static void init_filter(void) r = (r << 3) | (r >> 2); g = (g << 3) | (g >> 2); b = (b << 3) | (b >> 2); - g_extern.filter.colormap[i] = (r << 16) | (g << 8) | (b << 0); + g_extern.filter.colormap[i] = (r << 24) | (g << 16) | (b << 8); } } #endif @@ -345,6 +346,8 @@ void uninit_video_input(void) if ( driver.input_data != driver.video_data && driver.input ) driver.input->free(driver.input_data); + + deinit_filter(); } driver_t driver; diff --git a/dynamic.c b/dynamic.c index 33d8be2118..3e6e63fc37 100644 --- a/dynamic.c +++ b/dynamic.c @@ -192,10 +192,14 @@ dylib_t dylib_load(const char *path) void* dylib_proc(dylib_t lib, const char *proc) { #ifdef _WIN32 - return GetProcAddress(lib, proc); + void *sym = (void*)GetProcAddress(lib, proc); #else - return dlsym(lib, proc); + void *sym = dlsym(lib, proc); #endif + + if (!sym) + SSNES_WARN("Failed to load symbol \"%s\"\n", proc); + return sym; } void dylib_close(dylib_t lib) diff --git a/ssnes.c b/ssnes.c index a75d2f61a1..fdb0b008a9 100644 --- a/ssnes.c +++ b/ssnes.c @@ -104,9 +104,8 @@ static void video_frame(const uint16_t *data, unsigned width, unsigned height) unsigned owidth = width; unsigned oheight = height; g_extern.filter.psize(&owidth, &oheight); - g_extern.filter.prender(g_extern.filter.colormap, g_extern.filter.buffer, - g_extern.filter.pitch >> 2, data, (height == 448 || height == 478) ? 512 : 1024, width, height); + g_extern.filter.pitch, data, (height == 448 || height == 478) ? 1024 : 2048, width, height); if (!driver.video->frame(driver.video_data, g_extern.filter.buffer, owidth, oheight, g_extern.filter.pitch, msg)) g_extern.video_active = false; }