aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2019-05-12 15:01:40 +0200
committerArisotura <thetotalworm@gmail.com>2019-05-12 15:01:40 +0200
commitc88981b5892ed3faf7cd19302c398debe27d94ed (patch)
treec6cf9164ff072c6a2b7a5908a5d394d4dc2cab85 /src
parent939a37638995a2f4504400c7b365aacf66536473 (diff)
split framebuffer.
setup doublebuffering inside GPU.cpp. avoid copying a whole framebuffer every frame. better performance at higher res.
Diffstat (limited to 'src')
-rw-r--r--src/GPU.cpp94
-rw-r--r--src/GPU.h5
-rw-r--r--src/libui_sdl/DlgVideoSettings.cpp2
-rw-r--r--src/libui_sdl/main.cpp27
4 files changed, 91 insertions, 37 deletions
diff --git a/src/GPU.cpp b/src/GPU.cpp
index f272129..636c430 100644
--- a/src/GPU.cpp
+++ b/src/GPU.cpp
@@ -71,9 +71,9 @@ u32 VRAMMap_TexPal[8];
u32 VRAMMap_ARM7[2];
-u32* Framebuffer;
-int FBScale;
-int FBScreenStride;
+int FrontBuffer;
+u32* Framebuffer[2][2];
+int FBScale[2];
GPU2D* GPU2D_A;
GPU2D* GPU2D_B;
@@ -85,8 +85,12 @@ bool Init()
GPU2D_B = new GPU2D(1);
if (!GPU3D::Init()) return false;
+ FrontBuffer = 0;
+ Framebuffer[0][0] = NULL; Framebuffer[0][1] = NULL;
+ Framebuffer[1][0] = NULL; Framebuffer[1][1] = NULL;
+ FBScale[0] = -1; FBScale[1] = -1;
//SetFramebufferScale(1);
- SetFramebufferScale(2);
+ SetFramebufferScale(1, 1);
return true;
}
@@ -97,7 +101,10 @@ void DeInit()
delete GPU2D_B;
GPU3D::DeInit();
- if (Framebuffer) delete[] Framebuffer;
+ if (Framebuffer[0][0]) delete[] Framebuffer[0][0];
+ if (Framebuffer[0][1]) delete[] Framebuffer[0][1];
+ if (Framebuffer[1][0]) delete[] Framebuffer[1][0];
+ if (Framebuffer[1][1]) delete[] Framebuffer[1][1];
}
void Reset()
@@ -145,22 +152,32 @@ void Reset()
VRAMMap_ARM7[0] = 0;
VRAMMap_ARM7[1] = 0;
- for (int i = 0; i < 256*192*2; i++)
+ for (int i = 0; i < (256*192)<<(FBScale[0]*2); i++)
{
- Framebuffer[i] = 0xFFFFFFFF;
+ Framebuffer[0][0][i] = 0xFFFFFFFF;
+ Framebuffer[1][0][i] = 0xFFFFFFFF;
+ }
+ for (int i = 0; i < (256*192)<<(FBScale[1]*2); i++)
+ {
+ Framebuffer[0][1][i] = 0xFFFFFFFF;
+ Framebuffer[1][1][i] = 0xFFFFFFFF;
}
GPU2D_A->Reset();
GPU2D_B->Reset();
GPU3D::Reset();
- GPU2D_A->SetFramebuffer(&Framebuffer[FBScreenStride]);
- GPU2D_B->SetFramebuffer(&Framebuffer[0]);
+ int backbuf = FrontBuffer ? 0 : 1;
+ GPU2D_A->SetFramebuffer(Framebuffer[backbuf][1]);
+ GPU2D_B->SetFramebuffer(Framebuffer[backbuf][0]);
}
void Stop()
{
- memset(Framebuffer, 0, FBScreenStride*2*sizeof(u32));
+ memset(Framebuffer[0][0], 0, (256*192)<<(FBScale[0]*2));
+ memset(Framebuffer[0][1], 0, (256*192)<<(FBScale[1]*2));
+ memset(Framebuffer[1][0], 0, (256*192)<<(FBScale[0]*2));
+ memset(Framebuffer[1][1], 0, (256*192)<<(FBScale[1]*2));
}
void DoSavestate(Savestate* file)
@@ -215,13 +232,46 @@ void DoSavestate(Savestate* file)
GPU3D::DoSavestate(file);
}
-void SetFramebufferScale(int scale)
+void AssignFramebuffers()
+{
+ int backbuf = FrontBuffer ? 0 : 1;
+ if (NDS::PowerControl9 & (1<<15))
+ {
+ GPU2D_A->SetFramebuffer(Framebuffer[backbuf][0]);
+ GPU2D_B->SetFramebuffer(Framebuffer[backbuf][1]);
+ }
+ else
+ {
+ GPU2D_A->SetFramebuffer(Framebuffer[backbuf][1]);
+ GPU2D_B->SetFramebuffer(Framebuffer[backbuf][0]);
+ }
+}
+
+void SetFramebufferScale(int top, int bottom)
{
- FBScale = scale;
- FBScreenStride = (256*scale) * (192*scale);
+ if (top != FBScale[0])
+ {
+ FBScale[0] = top;
- if (Framebuffer) delete[] Framebuffer;
- Framebuffer = new u32[FBScreenStride * 2];
+ int fbsize = (256 * 192) << (FBScale[0] * 2);
+ if (Framebuffer[0][0]) delete[] Framebuffer[0][0];
+ if (Framebuffer[1][0]) delete[] Framebuffer[1][0];
+ Framebuffer[0][0] = new u32[fbsize];
+ Framebuffer[1][0] = new u32[fbsize];
+ }
+
+ if (bottom != FBScale[1])
+ {
+ FBScale[1] = bottom;
+
+ int fbsize = (256 * 192) << (FBScale[1] * 2);
+ if (Framebuffer[0][1]) delete[] Framebuffer[0][1];
+ if (Framebuffer[1][1]) delete[] Framebuffer[1][1];
+ Framebuffer[0][1] = new u32[fbsize];
+ Framebuffer[1][1] = new u32[fbsize];
+ }
+
+ AssignFramebuffers();
}
@@ -682,16 +732,7 @@ void SetPowerCnt(u32 val)
GPU2D_B->SetEnabled(val & (1<<9));
GPU3D::SetEnabled(val & (1<<3), val & (1<<2));
- if (val & (1<<15))
- {
- GPU2D_A->SetFramebuffer(&Framebuffer[0]);
- GPU2D_B->SetFramebuffer(&Framebuffer[FBScreenStride]);
- }
- else
- {
- GPU2D_A->SetFramebuffer(&Framebuffer[FBScreenStride]);
- GPU2D_B->SetFramebuffer(&Framebuffer[0]);
- }
+ AssignFramebuffers();
}
@@ -762,6 +803,9 @@ void StartHBlank(u32 line)
void FinishFrame(u32 lines)
{
+ FrontBuffer = FrontBuffer ? 0 : 1;
+ AssignFramebuffers();
+
TotalScanlines = lines;
}
diff --git a/src/GPU.h b/src/GPU.h
index a430a32..2e47fc4 100644
--- a/src/GPU.h
+++ b/src/GPU.h
@@ -61,7 +61,8 @@ extern u32 VRAMMap_Texture[4];
extern u32 VRAMMap_TexPal[8];
extern u32 VRAMMap_ARM7[2];
-extern u32* Framebuffer;
+extern int FrontBuffer;
+extern u32* Framebuffer[2][2];
extern GPU2D* GPU2D_A;
extern GPU2D* GPU2D_B;
@@ -74,7 +75,7 @@ void Stop();
void DoSavestate(Savestate* file);
-void SetFramebufferScale(int scale);
+void SetFramebufferScale(int top, int bottom);
void MapVRAM_AB(u32 bank, u8 cnt);
diff --git a/src/libui_sdl/DlgVideoSettings.cpp b/src/libui_sdl/DlgVideoSettings.cpp
index ed33cb5..b6544ed 100644
--- a/src/libui_sdl/DlgVideoSettings.cpp
+++ b/src/libui_sdl/DlgVideoSettings.cpp
@@ -160,7 +160,7 @@ void Open()
uiRadioButtons* rbApplyScalingTo = uiNewRadioButtons();
uiRadioButtonsAppend(rbApplyScalingTo, "Both screens");
- uiRadioButtonsAppend(rbApplyScalingTo, "Emphasized screen");
+ uiRadioButtonsAppend(rbApplyScalingTo, "Emphasized screen (see 'Screen sizing')");
uiRadioButtonsAppend(rbApplyScalingTo, "Top screen");
uiRadioButtonsAppend(rbApplyScalingTo, "Bottom screen");
uiBoxAppend(in_ctrl, uiControl(rbApplyScalingTo), 0);
diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp
index a8a5ceb..c8454ed 100644
--- a/src/libui_sdl/main.cpp
+++ b/src/libui_sdl/main.cpp
@@ -95,7 +95,8 @@ char PrevSRAMPath[1024]; // for savestate 'undo load'
bool SavestateLoaded;
bool ScreenDrawInited = false;
-uiDrawBitmap* ScreenBitmap = NULL;
+uiDrawBitmap* ScreenBitmap[2] = {NULL,NULL};
+SDL_mutex* ScreenMutex;
u32* ScreenBuffer;
int ScreenScale;
@@ -555,7 +556,7 @@ int EmuThreadFunc(void* burp)
}
}
- memcpy(ScreenBuffer, GPU::Framebuffer, (256*ScreenScale)*(384*ScreenScale)*4);
+ //memcpy(ScreenBuffer, GPU::Framebuffer, (256*ScreenScale)*(384*ScreenScale)*4);
uiAreaQueueRedrawAll(MainDrawArea);
// framerate limiter based off SDL2_gfx
@@ -636,24 +637,27 @@ void OnAreaDraw(uiAreaHandler* handler, uiArea* area, uiAreaDrawParams* params)
if (!ScreenDrawInited)
{
ScreenDrawInited = true;
- ScreenBitmap = uiDrawNewBitmap(params->Context, 256*ScreenScale, 384*ScreenScale);
+ ScreenBitmap[0] = uiDrawNewBitmap(params->Context, 256*ScreenScale, 384*ScreenScale);
+ ScreenBitmap[1] = uiDrawNewBitmap(params->Context, 256*ScreenScale, 384*ScreenScale);
}
- if (!ScreenBitmap) return;
+ if (!ScreenBitmap[0] || !ScreenBitmap[1]) return;
uiRect top = {0, 0, 256*ScreenScale, 192*ScreenScale};
- uiRect bot = {0, 192*ScreenScale, 256*ScreenScale, 192*ScreenScale};
+ uiRect bot = {0, 0, 256*ScreenScale, 192*ScreenScale};
- if (ScreenBuffer) uiDrawBitmapUpdate(ScreenBitmap, ScreenBuffer);
+ int frontbuf = GPU::FrontBuffer;
+ uiDrawBitmapUpdate(ScreenBitmap[0], GPU::Framebuffer[frontbuf][0]);
+ uiDrawBitmapUpdate(ScreenBitmap[1], GPU::Framebuffer[frontbuf][1]);
uiDrawSave(params->Context);
uiDrawTransform(params->Context, &TopScreenTrans);
- uiDrawBitmapDraw(params->Context, ScreenBitmap, &top, &TopScreenRect, Config::ScreenFilter==1);
+ uiDrawBitmapDraw(params->Context, ScreenBitmap[0], &top, &TopScreenRect, Config::ScreenFilter==1);
uiDrawRestore(params->Context);
uiDrawSave(params->Context);
uiDrawTransform(params->Context, &BottomScreenTrans);
- uiDrawBitmapDraw(params->Context, ScreenBitmap, &bot, &BottomScreenRect, Config::ScreenFilter==1);
+ uiDrawBitmapDraw(params->Context, ScreenBitmap[1], &bot, &BottomScreenRect, Config::ScreenFilter==1);
uiDrawRestore(params->Context);
}
@@ -1993,6 +1997,8 @@ int main(int argc, char** argv)
uiMenuItemDisable(MenuItem_Reset);
uiMenuItemDisable(MenuItem_Stop);
+ ScreenMutex = SDL_CreateMutex();
+
uiAreaHandler areahandler;
areahandler.Draw = OnAreaDraw;
areahandler.MouseEvent = OnAreaMouseEvent;
@@ -2131,7 +2137,10 @@ int main(int argc, char** argv)
Config::Save();
- if (ScreenBitmap) uiDrawFreeBitmap(ScreenBitmap);
+ SDL_DestroyMutex(ScreenMutex);
+
+ if (ScreenBitmap[0]) uiDrawFreeBitmap(ScreenBitmap[0]);
+ if (ScreenBitmap[1]) uiDrawFreeBitmap(ScreenBitmap[1]);
uiUninit();
SDL_Quit();