Allow bilinear filtering in GTK output driver.

This commit is contained in:
Brandon Wright 2010-11-18 06:31:27 -06:00
parent a37db4c09d
commit 5a5d3f9192
6 changed files with 2308 additions and 2292 deletions

View File

@ -162,6 +162,7 @@ Snes9xConfig::load_defaults (void)
ntsc_setup = snes_ntsc_composite; ntsc_setup = snes_ntsc_composite;
ntsc_scanline_intensity = 1; ntsc_scanline_intensity = 1;
scanline_filter_intensity = 0; scanline_filter_intensity = 0;
bilinear_filter = 0;
netplay_activated = FALSE; netplay_activated = FALSE;
netplay_server_up = FALSE; netplay_server_up = FALSE;
netplay_is_server = FALSE; netplay_is_server = FALSE;
@ -175,7 +176,6 @@ Snes9xConfig::load_defaults (void)
modal_dialogs = 1; modal_dialogs = 1;
#ifdef USE_OPENGL #ifdef USE_OPENGL
bilinear_filter = 0;
sync_to_vblank = 1; sync_to_vblank = 1;
use_pbos = 1; use_pbos = 1;
pbo_format = 0; pbo_format = 0;
@ -323,9 +323,9 @@ Snes9xConfig::save_config_file (void)
xml_out_int (xml, "ntsc_scanline_intensity", ntsc_scanline_intensity); xml_out_int (xml, "ntsc_scanline_intensity", ntsc_scanline_intensity);
xml_out_int (xml, "scanline_filter_intensity", scanline_filter_intensity); xml_out_int (xml, "scanline_filter_intensity", scanline_filter_intensity);
xml_out_int (xml, "hw_accel", hw_accel); xml_out_int (xml, "hw_accel", hw_accel);
xml_out_int (xml, "bilinear_filter", bilinear_filter);
#ifdef USE_OPENGL #ifdef USE_OPENGL
xml_out_int (xml, "bilinear_filter", bilinear_filter);
xml_out_int (xml, "sync_to_vblank", sync_to_vblank); xml_out_int (xml, "sync_to_vblank", sync_to_vblank);
xml_out_int (xml, "sync_every_frame", sync_every_frame); xml_out_int (xml, "sync_every_frame", sync_every_frame);
xml_out_int (xml, "use_pbos", use_pbos); xml_out_int (xml, "use_pbos", use_pbos);
@ -499,9 +499,7 @@ Snes9xConfig::set_option (const char *name, const char *value)
} }
else if (!strcasecmp (name, "bilinear_filter")) else if (!strcasecmp (name, "bilinear_filter"))
{ {
#ifdef USE_OPENGL
bilinear_filter = atoi (value); bilinear_filter = atoi (value);
#endif
} }
else if (!strcasecmp (name, "sync_to_vblank")) else if (!strcasecmp (name, "sync_to_vblank"))
{ {

View File

@ -81,6 +81,7 @@ class Snes9xConfig
float ntsc_merge_fields; float ntsc_merge_fields;
unsigned int ntsc_scanline_intensity; unsigned int ntsc_scanline_intensity;
unsigned int scanline_filter_intensity; unsigned int scanline_filter_intensity;
unsigned char bilinear_filter;
unsigned char hw_accel; unsigned char hw_accel;
unsigned char allow_opengl; unsigned char allow_opengl;
unsigned char allow_xv; unsigned char allow_xv;
@ -138,7 +139,6 @@ class Snes9xConfig
#ifdef USE_OPENGL #ifdef USE_OPENGL
unsigned char bilinear_filter;
unsigned char sync_to_vblank; unsigned char sync_to_vblank;
unsigned char opengl_activated; unsigned char opengl_activated;
unsigned char use_pbos; unsigned char use_pbos;

View File

@ -62,6 +62,7 @@ S9xGTKDisplayDriver::update (int width, int height)
x = width; y = height; w = c_width; h = c_height; x = width; y = height; w = c_width; h = c_height;
S9xApplyAspect (x, y, w, h); S9xApplyAspect (x, y, w, h);
output (final_buffer, final_pitch, x, y, width, height, w, h); output (final_buffer, final_pitch, x, y, width, height, w, h);
return; return;
@ -77,7 +78,7 @@ S9xGTKDisplayDriver::output (void *src,
int dst_width, int dst_width,
int dst_height) int dst_height)
{ {
if (width > gdk_buffer_width || height > gdk_buffer_height) if (width != gdk_buffer_width || height != gdk_buffer_height)
{ {
gdk_buffer_width = width; gdk_buffer_width = width;
gdk_buffer_height = height; gdk_buffer_height = height;
@ -97,6 +98,14 @@ S9xGTKDisplayDriver::output (void *src,
NULL); NULL);
} }
if (last_known_width != dst_width || last_known_height != dst_height)
{
clear ();
last_known_width = dst_width;
last_known_height = dst_height;
}
S9xConvert (src, S9xConvert (src,
padded_buffer[2], padded_buffer[2],
src_pitch, src_pitch,
@ -120,11 +129,15 @@ S9xGTKDisplayDriver::output (void *src,
(double) height / (double) dst_height); (double) height / (double) dst_height);
cairo_matrix_translate (&matrix, -x, -y); cairo_matrix_translate (&matrix, -x, -y);
cairo_pattern_set_matrix (pattern, &matrix); cairo_pattern_set_matrix (pattern, &matrix);
cairo_pattern_set_filter (pattern, CAIRO_FILTER_NEAREST); cairo_pattern_set_filter (pattern,
config->bilinear_filter
? CAIRO_FILTER_BILINEAR
: CAIRO_FILTER_NEAREST);
} }
cairo_rectangle (cr, x, y, dst_width, dst_height); cairo_rectangle (cr, x, y, dst_width, dst_height);
cairo_fill (cr); cairo_fill (cr);
cairo_destroy (cr); cairo_destroy (cr);
window->set_mouseable_area (x, y, width, height); window->set_mouseable_area (x, y, width, height);

View File

@ -32,6 +32,8 @@ class S9xGTKDisplayDriver : public S9xDisplayDriver
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
int gdk_buffer_width; int gdk_buffer_width;
int gdk_buffer_height; int gdk_buffer_height;
int last_known_width;
int last_known_height;
}; };
#endif /* __GTK_DISPLAY_DRIVER_GTK_H */ #endif /* __GTK_DISPLAY_DRIVER_GTK_H */

View File

@ -341,14 +341,17 @@ event_hw_accel_changed (GtkComboBox *widget, gpointer data)
switch (value) switch (value)
{ {
case HWA_NONE: case HWA_NONE:
gtk_widget_show (window->get_widget ("bilinear_filter"));
gtk_widget_hide (window->get_widget ("opengl_frame")); gtk_widget_hide (window->get_widget ("opengl_frame"));
gtk_widget_hide (window->get_widget ("xv_frame")); gtk_widget_hide (window->get_widget ("xv_frame"));
break; break;
case HWA_OPENGL: case HWA_OPENGL:
gtk_widget_show (window->get_widget ("bilinear_filter"));
gtk_widget_show (window->get_widget ("opengl_frame")); gtk_widget_show (window->get_widget ("opengl_frame"));
gtk_widget_hide (window->get_widget ("xv_frame")); gtk_widget_hide (window->get_widget ("xv_frame"));
break; break;
case HWA_XV: case HWA_XV:
gtk_widget_hide (window->get_widget ("bilinear_filter"));
gtk_widget_show (window->get_widget ("xv_frame")); gtk_widget_show (window->get_widget ("xv_frame"));
gtk_widget_hide (window->get_widget ("opengl_frame")); gtk_widget_hide (window->get_widget ("opengl_frame"));
break; break;
@ -717,8 +720,9 @@ Snes9xPreferences::move_settings_to_dialog (void)
set_combo ("frameskip_combo", set_combo ("frameskip_combo",
Settings.SkipFrames == AUTO_FRAMERATE ? Settings.SkipFrames == AUTO_FRAMERATE ?
0 : Settings.SkipFrames + 1); 0 : Settings.SkipFrames + 1);
#ifdef USE_OPENGL
set_check ("bilinear_filter", config->bilinear_filter); set_check ("bilinear_filter", config->bilinear_filter);
#ifdef USE_OPENGL
set_check ("sync_to_vblank", config->sync_to_vblank); set_check ("sync_to_vblank", config->sync_to_vblank);
set_check ("sync_every_frame", config->sync_every_frame); set_check ("sync_every_frame", config->sync_every_frame);
set_check ("use_pbos", config->use_pbos); set_check ("use_pbos", config->use_pbos);
@ -826,6 +830,7 @@ Snes9xPreferences::get_settings_from_dialog (void)
config->ntsc_scanline_intensity = get_combo ("ntsc_scanline_intensity"); config->ntsc_scanline_intensity = get_combo ("ntsc_scanline_intensity");
config->scanline_filter_intensity = get_combo ("scanline_filter_intensity"); config->scanline_filter_intensity = get_combo ("scanline_filter_intensity");
config->hw_accel = hw_accel_value (get_combo ("hw_accel")); config->hw_accel = hw_accel_value (get_combo ("hw_accel"));
config->bilinear_filter = get_check ("bilinear_filter");
config->num_threads = get_spin ("num_threads"); config->num_threads = get_spin ("num_threads");
config->default_esc_behavior = get_combo ("default_esc_behavior"); config->default_esc_behavior = get_combo ("default_esc_behavior");
config->prevent_screensaver = get_check ("prevent_screensaver"); config->prevent_screensaver = get_check ("prevent_screensaver");
@ -845,7 +850,6 @@ Snes9xPreferences::get_settings_from_dialog (void)
gfx_needs_restart = 1; gfx_needs_restart = 1;
} }
config->bilinear_filter = get_check ("bilinear_filter");
config->sync_to_vblank = get_check ("sync_to_vblank"); config->sync_to_vblank = get_check ("sync_to_vblank");
config->use_pbos = get_check ("use_pbos"); config->use_pbos = get_check ("use_pbos");
config->npot_textures = get_check ("npot_textures"); config->npot_textures = get_check ("npot_textures");

File diff suppressed because it is too large Load Diff