+ static int old_layer_w, old_layer_h;
+ int fb_w = 256, fb_h = 240;
+ float mult;
+
+ if (Settings.sw_filter == SWFILTER_SCALE2X
+ || Settings.sw_filter == SWFILTER_EAGLE2X)
+ {
+ fb_w *= 2;
+ fb_h *= 2;
+ }
+
+ if (fb_w != old_layer_w || fb_h != old_layer_h)
+ {
+ layer_buf = vout_fbdev_resize(layer_fb, fb_w, fb_h, 16,
+ 0, 0, 0, 0, 3);
+ if (layer_buf == NULL) {
+ fprintf(stderr, "fatal: mode change %dx%x -> %dx%d failed\n",
+ old_layer_w, old_layer_h, fb_w, fb_h);
+ exit(1);
+ }
+
+ old_layer_w = fb_w;
+ old_layer_h = fb_h;
+ }
+
+ switch (Settings.scaling)
+ {
+ case SCALING_1X:
+ g_layer_w = fb_w;
+ g_layer_h = fb_h;
+ break;
+ case SCALING_PROPORTIONAL:
+ // assumes screen width > height
+ mult = (float)g_menuscreen_h / fb_h;
+ g_layer_w = (int)(fb_w * mult);
+ g_layer_h = g_menuscreen_h;
+ break;
+ case SCALING_FULLSCREEN:
+ g_layer_w = g_menuscreen_w;
+ g_layer_h = g_menuscreen_h;
+ break;
+ case SCALING_4_3:
+ default:
+ g_layer_w = g_menuscreen_h * 4 / 3;
+ g_layer_h = g_menuscreen_h;
+ break;
+ }
+ if (g_layer_w > g_menuscreen_w)
+ g_layer_w = g_menuscreen_w;
+ if (g_layer_h > g_menuscreen_h)
+ g_layer_h = g_menuscreen_h;
+ g_layer_x = g_menuscreen_w / 2 - g_layer_w / 2;
+ g_layer_y = g_menuscreen_h / 2 - g_layer_h / 2;
+
+ plat_target_set_filter(Settings.hw_filter);
+ plat_target_set_lcdrate(PAL);
+
+ // adjust since we run at 60Hz, and real NES doesn't
+ FCEUI_Sound(Settings.sound_rate + Settings.sound_rate / 980);
+
+ omap_enable_layer(1);