diff --git a/desmume/src/frontend/posix/gtk/config_opts.h b/desmume/src/frontend/posix/gtk/config_opts.h
index 151d0f874..7fea1cc5c 100644
--- a/desmume/src/frontend/posix/gtk/config_opts.h
+++ b/desmume/src/frontend/posix/gtk/config_opts.h
@@ -60,6 +60,7 @@ OPT(core3D, int, 1, Config, Core3D)
OPT(textureDeposterize, bool, false, Config, 3DTextureDeposterization)
OPT(textureSmoothing, bool, false, Config, 3DTextureSmoothing)
OPT(textureUpscale, int, 1, Config, 3DTextureUpscaling)
+OPT(gpuScaleFactor, int, 1, Config, GPUScaleFactor)
OPT(highColorInterpolation, bool, true, Config, HighResolutionColorInterpolation)
OPT(multisampling, bool, false, Config, OpenGLMultisampling)
OPT(multisamplingSize, int, 0, Config, OpenGLMultisamplingSize)
diff --git a/desmume/src/frontend/posix/gtk/graphics.ui b/desmume/src/frontend/posix/gtk/graphics.ui
index 44eed71fc..b7847b0dd 100644
--- a/desmume/src/frontend/posix/gtk/graphics.ui
+++ b/desmume/src/frontend/posix/gtk/graphics.ui
@@ -94,6 +94,41 @@
1
+
+
+
+ 0
+ 2
+
+
+
+
+
+ 1
+ 2
+
+
0
- 2
+ 3
@@ -111,7 +146,7 @@
0
- 3
+ 4
@@ -121,7 +156,7 @@
1
- 3
+ 4
@@ -130,7 +165,7 @@
0
- 4
+ 5
@@ -146,7 +181,7 @@
1
- 4
+ 5
diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp
index 2cecb5313..4f01544a6 100644
--- a/desmume/src/frontend/posix/gtk/main.cpp
+++ b/desmume/src/frontend/posix/gtk/main.cpp
@@ -98,6 +98,7 @@
static int draw_count;
extern int _scanline_filter_a, _scanline_filter_b, _scanline_filter_c, _scanline_filter_d;
VideoFilter* video;
+int gpu_scale_factor = 1;
desmume::config::Config config;
@@ -1310,7 +1311,8 @@ static int ConfigureDrawingArea(GtkWidget *widget, GdkEventConfigure *event, gpo
static inline void gpu_screen_to_rgb(u32* dst)
{
- ColorspaceConvertBuffer555To8888Opaque(GPU->GetDisplayInfo().masterNativeBuffer16, dst, GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2);
+ ColorspaceConvertBuffer555To8888Opaque(GPU->GetDisplayInfo().masterNativeBuffer16, dst,
+ GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2 * gpu_scale_factor * gpu_scale_factor);
}
static inline void drawScreen(cairo_t* cr, u32* buf, gint w, gint h) {
@@ -1384,7 +1386,7 @@ static gboolean ExposeDrawingArea (GtkWidget *widget, GdkEventExpose *event, gpo
gint dstW = video->GetDstWidth();
gint dstH = video->GetDstHeight();
- gint dstScale = dstW * 2 / 256; // Actual scale * 2 to handle 1.5x filters
+ gint dstScale = dstW * 2 / GPU_FRAMEBUFFER_NATIVE_WIDTH; // Actual scale * 2 to handle 1.5x filters
gint gap = nds_screen.orientation == ORIENT_VERTICAL ? nds_screen.gap_size * dstScale / 2 : 0;
gint imgW, imgH;
@@ -1436,9 +1438,10 @@ static gboolean ExposeDrawingArea (GtkWidget *widget, GdkEventExpose *event, gpo
}
static void RedrawScreen() {
- ColorspaceConvertBuffer555To8888Opaque(GPU->GetDisplayInfo().masterNativeBuffer16, (uint32_t *)video->GetSrcBufferPtr(), GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2);
+ ColorspaceConvertBuffer555To8888Opaque(GPU->GetDisplayInfo().masterNativeBuffer16, (uint32_t *)video->GetSrcBufferPtr(),
+ GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2 * gpu_scale_factor * gpu_scale_factor);
#ifdef HAVE_LIBAGG
- aggDraw.hud->attach((u8*)video->GetSrcBufferPtr(), 256, 384, 1024);
+ aggDraw.hud->attach((u8*)video->GetSrcBufferPtr(), GPU_FRAMEBUFFER_NATIVE_WIDTH * gpu_scale_factor, GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2 * gpu_scale_factor, 1024);
osd->update();
DrawHUD();
osd->clear();
@@ -1987,7 +1990,7 @@ static void Edit_Joystick_Controls(GSimpleAction *action, GVariant *parameter, g
static void GraphicsSettingsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) {
GtkDialog *dialog;
GtkGrid *wGrid;
- GtkComboBox *coreCombo, *wScale, *wMultisample;
+ GtkComboBox *coreCombo, *wScale, *wGPUScale, *wMultisample;
GtkToggleButton *wPosterize, *wSmoothing, *wHCInterpolate;
GtkBuilder *builder = gtk_builder_new_from_resource("/org/desmume/DeSmuME/graphics.ui");
@@ -1995,6 +1998,7 @@ static void GraphicsSettingsDialog(GSimpleAction *action, GVariant *parameter, g
wGrid = GTK_GRID(gtk_builder_get_object(builder, "graphics_grid"));
coreCombo = GTK_COMBO_BOX(gtk_builder_get_object(builder, "core_combo"));
wScale = GTK_COMBO_BOX(gtk_builder_get_object(builder, "scale"));
+ wGPUScale = GTK_COMBO_BOX(gtk_builder_get_object(builder, "gpuscale"));
wMultisample = GTK_COMBO_BOX(gtk_builder_get_object(builder, "multisample"));
wPosterize = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "posterize"));
wSmoothing = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "smoothing"));
@@ -2010,6 +2014,9 @@ static void GraphicsSettingsDialog(GSimpleAction *action, GVariant *parameter, g
// The shift it work for scale up to 4. For scaling more than 4, a mapping function is required
gtk_combo_box_set_active(wScale, CommonSettings.GFX3D_Renderer_TextureScalingFactor >> 1);
+ //GPU scaling factor
+ gtk_combo_box_set_active(wGPUScale, gpu_scale_factor-1);
+
// 3D Texture Deposterization
gtk_toggle_button_set_active(wPosterize, CommonSettings.GFX3D_Renderer_TextureDeposterize);
@@ -2080,6 +2087,10 @@ static void GraphicsSettingsDialog(GSimpleAction *action, GVariant *parameter, g
default:
break;
}
+ gpu_scale_factor = gtk_combo_box_get_active(wGPUScale)+1;
+ config.gpuScaleFactor = gpu_scale_factor;
+ GPU->SetCustomFramebufferSize(GPU_FRAMEBUFFER_NATIVE_WIDTH * gpu_scale_factor, GPU_FRAMEBUFFER_NATIVE_HEIGHT * gpu_scale_factor);
+ video->SetSourceSize(GPU_FRAMEBUFFER_NATIVE_WIDTH * gpu_scale_factor, GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2 * gpu_scale_factor);
CommonSettings.GFX3D_Renderer_TextureDeposterize = config.textureDeposterize = gtk_toggle_button_get_active(wPosterize);
CommonSettings.GFX3D_Renderer_TextureSmoothing = config.textureSmoothing = gtk_toggle_button_get_active(wSmoothing);
CommonSettings.GFX3D_Renderer_TextureScalingFactor = config.textureUpscale = scale;
@@ -3026,8 +3037,11 @@ common_gtk_main(GApplication *app, gpointer user_data)
memset(&nds_screen, 0, sizeof(nds_screen));
nds_screen.orientation = ORIENT_VERTICAL;
+ gpu_scale_factor = config.gpuScaleFactor;
+
g_printerr("Using %d threads for video filter.\n", CommonSettings.num_cores);
- video = new VideoFilter(256, 384, VideoFilterTypeID_None, CommonSettings.num_cores);
+ GPU->SetCustomFramebufferSize(GPU_FRAMEBUFFER_NATIVE_WIDTH * gpu_scale_factor, GPU_FRAMEBUFFER_NATIVE_HEIGHT * gpu_scale_factor);
+ video = new VideoFilter(GPU_FRAMEBUFFER_NATIVE_WIDTH * gpu_scale_factor, GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2 * gpu_scale_factor, VideoFilterTypeID_None, CommonSettings.num_cores);
/* Fetch the main elements from the window */
GtkBuilder *builder = gtk_builder_new_from_resource("/org/desmume/DeSmuME/main.ui");
diff --git a/desmume/src/frontend/posix/gtk/sdl_3Demu.cpp b/desmume/src/frontend/posix/gtk/sdl_3Demu.cpp
index fb05b157c..b57d42de1 100644
--- a/desmume/src/frontend/posix/gtk/sdl_3Demu.cpp
+++ b/desmume/src/frontend/posix/gtk/sdl_3Demu.cpp
@@ -28,6 +28,8 @@ static bool sdl_init(void) { return is_sdl_initialized(); }
static SDL_Window *win = NULL;
static SDL_GLContext ctx = NULL;
+extern int gpu_scale_factor;
+
bool deinit_sdl_3Demu(void)
{
bool ret = false;
@@ -60,7 +62,8 @@ bool init_sdl_3Demu(void)
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
- win = SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 256, 192, SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN);
+ win = SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, GPU_FRAMEBUFFER_NATIVE_WIDTH * gpu_scale_factor,
+ GPU_FRAMEBUFFER_NATIVE_HEIGHT * gpu_scale_factor, SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN);
if (!win) {
fprintf(stderr, "SDL: Failed to create a window: %s\n", SDL_GetError());
return false;