diff --git a/360/main.c b/360/main.c
index 4e4586fd38..14acd6c66b 100644
--- a/360/main.c
+++ b/360/main.c
@@ -138,6 +138,7 @@ static void set_default_settings (void)
g_console.emulator_initialized = 0;
g_console.mode_switch = MODE_MENU;
strlcpy(g_console.default_rom_startup_dir, "game:\\roms\\", sizeof(g_console.default_rom_startup_dir));
+ g_console.filter_type = D3DTEXF_LINEAR;
//g_extern
g_extern.state_slot = 0;
@@ -176,6 +177,7 @@ static void init_settings (void)
// g_console
CONFIG_GET_BOOL_CONSOLE(throttle_enable, "throttle_enable");
CONFIG_GET_STRING_CONSOLE(default_rom_startup_dir, "default_rom_startup_dir");
+ CONFIG_GET_INT_CONSOLE(filter_type, "filter_type");
// g_extern
CONFIG_GET_INT_EXTERN(state_slot, "state_slot");
@@ -203,6 +205,7 @@ static void save_settings (void)
// g_console
config_set_string(conf, "default_rom_startup_dir", g_console.default_rom_startup_dir);
config_set_bool(conf, "throttle_enable", g_console.throttle_enable);
+ config_set_int(conf, "filter_type", g_console.filter_type);
// g_extern
config_set_int(conf, "state_slot", g_extern.state_slot);
diff --git a/360/media/ssnes_settings.xui b/360/media/ssnes_settings.xui
index 99f7586e1c..0bb89ad9aa 100644
--- a/360/media/ssnes_settings.xui
+++ b/360/media/ssnes_settings.xui
@@ -45,7 +45,10 @@
215.000000
38.000000
24.447998,58.447998,0.000000
+XuiBackButton1
XuiBackButton1
+XuiBtnHWFilter
+XuiBtnHWFilter
Rewind
@@ -57,5 +60,17 @@
252.000000,58.000000,0.000000
+
+
+XuiBtnHWFilter
+215.000000
+38.000000
+24.447998,108.447998,0.000000
+XuiBackButton1
+XuiBackButton1
+XuiBtnRewind
+XuiBtnRewind
+
+
diff --git a/360/menu.cpp b/360/menu.cpp
index ddc778bb80..af24fa2f24 100644
--- a/360/menu.cpp
+++ b/360/menu.cpp
@@ -83,12 +83,33 @@ HRESULT CSSNESFileBrowser::OnInit(XUIMessageInit * pInitData, BOOL& bHandled)
return S_OK;
}
+static void set_filter_element(int index, CXuiControl * obj)
+{
+ switch(index)
+ {
+ case D3DTEXF_NONE:
+ obj->SetText(L"None");
+ break;
+ case D3DTEXF_POINT:
+ obj->SetText(L"Point filtering");
+ break;
+ case D3DTEXF_LINEAR:
+ obj->SetText(L"Linear interpolation");
+ break;
+ case D3DTEXF_ANISOTROPIC:
+ obj->SetText(L"Anisotropic filtering");
+ break;
+ }
+}
+
HRESULT CSSNESSettings::OnInit(XUIMessageInit * pInitData, BOOL& bHandled)
{
GetChildById(L"XuiBtnRewind", &m_rewind);
GetChildById(L"XuiCheckbox1", &m_rewind_cb);
GetChildById(L"XuiBackButton1", &m_back);
+ GetChildById(L"XuiBtnHWFilter", &m_hw_filter);
+ set_filter_element(g_console.filter_type, &m_hw_filter);
m_rewind_cb.SetCheck(g_settings.rewind_enable);
return S_OK;
}
@@ -157,6 +178,24 @@ HRESULT CSSNESSettings::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled )
g_settings.rewind_enable = !g_settings.rewind_enable;
m_rewind_cb.SetCheck(g_settings.rewind_enable);
}
+ else if ( hObjPressed == m_hw_filter)
+ {
+ switch(g_console.filter_type)
+ {
+ case D3DTEXF_NONE:
+ g_console.filter_type = D3DTEXF_LINEAR;
+ break;
+ case D3DTEXF_POINT:
+ g_console.filter_type = D3DTEXF_NONE;
+ break;
+ case D3DTEXF_LINEAR:
+ g_console.filter_type = D3DTEXF_ANISOTROPIC;
+ break;
+ case D3DTEXF_ANISOTROPIC:
+ g_console.filter_type = D3DTEXF_POINT;
+ break;
+ }
+ }
else if ( hObjPressed == m_back )
{
HRESULT hr = XuiSceneNavigateBack(app.hSSNESSettings, app.hMainScene, XUSER_INDEX_FOCUS);
@@ -168,6 +207,7 @@ HRESULT CSSNESSettings::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled )
NavigateBack(app.hMainScene);
}
+ set_filter_element(g_console.filter_type, &m_hw_filter);
bHandled = TRUE;
return S_OK;
}
diff --git a/360/menu.h b/360/menu.h
index ab9bd2d6fc..f1cc3c92d5 100644
--- a/360/menu.h
+++ b/360/menu.h
@@ -78,6 +78,7 @@ class CSSNESSettings: public CXuiSceneImpl
protected:
CXuiControl m_rewind;
CXuiCheckbox m_rewind_cb;
+ CXuiControl m_hw_filter;
CXuiControl m_back;
public:
HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled );
diff --git a/360/xdk360_video.cpp b/360/xdk360_video.cpp
index 5f0b2e616d..bcc7a36683 100644
--- a/360/xdk360_video.cpp
+++ b/360/xdk360_video.cpp
@@ -254,8 +254,8 @@ static bool xdk360_gfx_frame(void *data, const void *frame,
}
vid->xdk360_render_device->SetTexture(0, vid->lpTexture);
- vid->xdk360_render_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- vid->xdk360_render_device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+ vid->xdk360_render_device->SetSamplerState(0, D3DSAMP_MINFILTER, g_console.filter_type);
+ vid->xdk360_render_device->SetSamplerState(0, D3DSAMP_MAGFILTER, g_console.filter_type);
vid->xdk360_render_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
vid->xdk360_render_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
@@ -302,6 +302,7 @@ void xdk360_video_init(void)
video_info.force_aspect = false;
video_info.smooth = true;
video_info.input_scale = 2;
+
g_d3d = xdk360_gfx_init(&video_info, NULL, NULL);
}
diff --git a/general.h b/general.h
index 2378dd0792..cf528c44f5 100644
--- a/general.h
+++ b/general.h
@@ -183,7 +183,8 @@ struct console_settings
bool triple_buffering_enable;
float overscan_amount;
uint32_t aspect_ratio_index;
- uint32_t emulator_initialized;
+ uint32_t emulator_initialized;
+ uint32_t filter_type;
uint32_t screen_orientation;
uint32_t current_resolution_index;
uint32_t current_resolution_id;