fixed some shit related to pixel conversions/black screens...

master
xerox 3 years ago
parent daa4f9a04f
commit 8b718cd481

@ -241,11 +241,11 @@ void S9xLoadConfigFiles (char **argv, int argc)
// Display // Display
Settings.SupportHiRes = conf.GetBool("Display::HiRes", true); Settings.SupportHiRes = conf.GetBool("Display::HiRes", false);
Settings.Transparency = conf.GetBool("Display::Transparency", true); Settings.Transparency = conf.GetBool("Display::Transparency", true);
Settings.DisableGraphicWindows = !conf.GetBool("Display::GraphicWindows", true); Settings.DisableGraphicWindows = !conf.GetBool("Display::GraphicWindows", true);
Settings.DisplayTime = conf.GetBool("Display::DisplayTime", false); Settings.DisplayTime = conf.GetBool("Display::DisplayTime", false);
Settings.DisplayFrameRate = conf.GetBool("Display::DisplayFrameRate", false); Settings.DisplayFrameRate = conf.GetBool("Display::DisplayFrameRate", true);
Settings.DisplayWatchedAddresses = conf.GetBool("Display::DisplayWatchedAddresses", false); Settings.DisplayWatchedAddresses = conf.GetBool("Display::DisplayWatchedAddresses", false);
Settings.DisplayPressedKeys = conf.GetBool("Display::DisplayInput", false); Settings.DisplayPressedKeys = conf.GetBool("Display::DisplayInput", false);
Settings.DisplayMovieFrame = conf.GetBool("Display::DisplayFrameCount", false); Settings.DisplayMovieFrame = conf.GetBool("Display::DisplayFrameCount", false);

@ -67,6 +67,7 @@ HI_BOOL HiInitDisplay() {
stPubAttr.enIntfSync = VO_OUTPUT_640x480_60; stPubAttr.enIntfSync = VO_OUTPUT_640x480_60;
stPubAttr.enIntfType = VO_INTF_HDMI; stPubAttr.enIntfType = VO_INTF_HDMI;
stPubAttr.stSyncInfo.bSynm = HI_TRUE;
stPubAttr.u32BgColor = 0x000000; stPubAttr.u32BgColor = 0x000000;
stLayerAttr.bClusterMode = HI_FALSE; stLayerAttr.bClusterMode = HI_FALSE;
@ -165,10 +166,10 @@ HI_BOOL HiInitDisplay() {
} }
/* when we call RefreshScreen we will re-draw the entire screen... */ /* when we call RefreshScreen we will re-draw the entire screen... */
g_stCanvasBuf.UpdateRect.x = 0; g_stCanvasBuf.UpdateRect.x = (SCREEN_WIDTH - SCALE_WIDTH) / 2;
g_stCanvasBuf.UpdateRect.y = 0; g_stCanvasBuf.UpdateRect.y = 0;
g_stCanvasBuf.UpdateRect.w = SCREEN_WIDTH; g_stCanvasBuf.UpdateRect.w = SCALE_WIDTH;
g_stCanvasBuf.UpdateRect.h = SCREEN_HEIGHT; g_stCanvasBuf.UpdateRect.h = SCALE_HEIGHT;
/* meta data about the back buffer... */ /* meta data about the back buffer... */
g_stCanvasBuf.stCanvas.u32Height = SCREEN_HEIGHT; g_stCanvasBuf.stCanvas.u32Height = SCREEN_HEIGHT;
@ -190,5 +191,7 @@ HI_BOOL HiInitDisplay() {
} }
void RefreshScreen() { void RefreshScreen() {
int arg = 0;
ioctl(g_hFrameBuffer, FBIO_WAITFORVSYNC, &arg);
ioctl(g_hFrameBuffer, FBIO_REFRESH, &g_stCanvasBuf); ioctl(g_hFrameBuffer, FBIO_REFRESH, &g_stCanvasBuf);
} }

@ -1,3 +1,4 @@
#include <algorithm>
#include <ctype.h> #include <ctype.h>
#include <dirent.h> #include <dirent.h>
#include <errno.h> #include <errno.h>
@ -7,7 +8,6 @@
#include <string.h> #include <string.h>
#include <strings.h> #include <strings.h>
#include <unistd.h> #include <unistd.h>
#include <algorithm>
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/joystick.h> #include <linux/joystick.h>
@ -180,8 +180,7 @@ bool8 ReadJoysticks(void) {
switch (js_ev.type) { switch (js_ev.type) {
case JS_EVENT_AXIS: case JS_EVENT_AXIS:
S9xReportAxis(0x8000c000 | (i << 24) | js_ev.number, js_ev.value); S9xReportAxis(0x8000c000 | (i << 24) | js_ev.number, js_ev.value);
S9xReportAxis( S9xReportAxis(0x80008000 | (i << 24) | (js_mod[i] << 16) | js_ev.number,
0x80008000 | (i << 24) | (js_mod[i] << 16) | js_ev.number,
js_ev.value); js_ev.value);
js_latch = TRUE; js_latch = TRUE;
break; break;
@ -189,8 +188,8 @@ bool8 ReadJoysticks(void) {
case JS_EVENT_BUTTON: case JS_EVENT_BUTTON:
case JS_EVENT_BUTTON | JS_EVENT_INIT: case JS_EVENT_BUTTON | JS_EVENT_INIT:
S9xReportButton(0x80004000 | (i << 24) | js_ev.number, js_ev.value); S9xReportButton(0x80004000 | (i << 24) | js_ev.number, js_ev.value);
S9xReportButton( S9xReportButton(0x80000000 | (i << 24) | (js_mod[i] << 16) |
0x80000000 | (i << 24) | (js_mod[i] << 16) | js_ev.number, js_ev.number,
js_ev.value); js_ev.value);
js_latch = TRUE; js_latch = TRUE;
break; break;
@ -232,25 +231,17 @@ const char* S9xStringInput(const char* message) {
return (NULL); return (NULL);
} }
bool8 S9xContinueUpdate(int width, int height) { bool8 S9xContinueUpdate(int width, int height) { return true; }
return true;
}
bool S9xPollButton(uint32 id, bool* pressed) { bool S9xPollButton(uint32 id, bool *pressed) { return false; }
return false;
}
bool S9xPollAxis(uint32 id, int16* value) { bool S9xPollAxis(uint32 id, int16 *value) { return false; }
return false;
}
bool8 S9xOpenSnapshotFile(const char *filepath, bool8 read_only, STREAM *file) { bool8 S9xOpenSnapshotFile(const char *filepath, bool8 read_only, STREAM *file) {
return true; return true;
} }
bool8 S9xInitUpdate(void) { bool8 S9xInitUpdate(void) { return true; }
return true;
}
bool8 S9xDeinitUpdate(int width, int height) { bool8 S9xDeinitUpdate(int width, int height) {
TDE2_RECT_S stSrcRect, stDstRect, stScaleRect; TDE2_RECT_S stSrcRect, stDstRect, stScaleRect;
@ -302,6 +293,20 @@ bool8 S9xDeinitUpdate(int width, int height) {
stDst.u32PhyAddr = g_stCanvasBuf.stCanvas.u32PhyAddr; stDst.u32PhyAddr = g_stCanvasBuf.stCanvas.u32PhyAddr;
stOpt.bResize = HI_TRUE; stOpt.bResize = HI_TRUE;
s32Ret = HI_TDE2_Bitblit(s32Handle, &stScale, &stScaleRect, &stSrc,
&stSrcRect, &stScale, &stScaleRect, &stOpt);
// if the screen is black all pixel values will be 0. this will cause bitblit
// to fail because it doesnt understand pixel conversions with pixels that are all 0...
// so i just make R = 1, G = 1, and B = 1... simple fix... lol...
if (s32Ret < 0) {
for (int i = 0; i < SNES_WIDTH * SNES_HEIGHT; ++i) {
if (*(((uint16_t *)g_pSnesBackBufferVirt) + i) == NULL) {
*(((uint16_t *)g_pSnesBackBufferVirt) + i) =
BUILD_PIXEL2_RGB565(1, 1, 1);
}
}
s32Ret = HI_TDE2_Bitblit(s32Handle, &stScale, &stScaleRect, &stSrc, s32Ret = HI_TDE2_Bitblit(s32Handle, &stScale, &stScaleRect, &stSrc,
&stSrcRect, &stScale, &stScaleRect, &stOpt); &stSrcRect, &stScale, &stScaleRect, &stOpt);
@ -310,6 +315,7 @@ bool8 S9xDeinitUpdate(int width, int height) {
HI_TDE2_CancelJob(s32Handle); HI_TDE2_CancelJob(s32Handle);
return false; return false;
} }
}
s32Ret = s32Ret =
HI_TDE2_QuickCopy(s32Handle, &stScale, &stScaleRect, &stDst, &stDstRect); HI_TDE2_QuickCopy(s32Handle, &stScale, &stScaleRect, &stDst, &stDstRect);
@ -328,13 +334,12 @@ bool8 S9xDeinitUpdate(int width, int height) {
return false; return false;
} }
HI_TDE2_WaitAllDone();
RefreshScreen(); RefreshScreen();
return true; return true;
} }
bool8 S9xOpenSoundDevice(void) { bool8 S9xOpenSoundDevice(void) { return false; }
return false;
}
const char *S9xGetFilename(const char *ex, s9x_getdirtype dirtype) { const char *S9xGetFilename(const char *ex, s9x_getdirtype dirtype) {
static char s[PATH_MAX + 1]; static char s[PATH_MAX + 1];
@ -409,27 +414,6 @@ const char* S9xBasename(const char* path) {
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
/* default settings to get snes emulation working... */
memset(&Settings, 0, sizeof(Settings));
Settings.MouseMaster = TRUE;
Settings.SuperScopeMaster = TRUE;
Settings.JustifierMaster = TRUE;
Settings.MultiPlayer5Master = TRUE;
Settings.FrameTimePAL = 20000;
Settings.FrameTimeNTSC = 16667;
Settings.SixteenBitSound = TRUE;
Settings.Stereo = TRUE;
Settings.SoundPlaybackRate = 48000;
Settings.SoundInputRate = 31950;
Settings.SupportHiRes = FALSE;
Settings.Transparency = TRUE;
Settings.AutoDisplayMessages = TRUE;
Settings.InitialInfoStringTimeout = 120;
Settings.HDMATimingHack = 100;
Settings.BlockInvalidVRAMAccessMaster = TRUE;
Settings.SkipFrames = AUTO_FRAMERATE;
Settings.TurboSkipFrames = 15;
HI_MPI_SYS_MmzAlloc(&g_pScaleBufferPhys, &g_pScaleBufferVirt, NULL, NULL, HI_MPI_SYS_MmzAlloc(&g_pScaleBufferPhys, &g_pScaleBufferVirt, NULL, NULL,
2 * SCALE_WIDTH * SCALE_HEIGHT); 2 * SCALE_WIDTH * SCALE_HEIGHT);
@ -441,6 +425,7 @@ int main(int argc, char* argv[]) {
std::printf("[+] init back buffer and scale buffer...\n"); std::printf("[+] init back buffer and scale buffer...\n");
S9xLoadConfigFiles(argv, argc); S9xLoadConfigFiles(argv, argc);
Memory.Init(); Memory.Init();
S9xInitAPU(); S9xInitAPU();
S9xInitSound(0); S9xInitSound(0);
@ -452,7 +437,7 @@ int main(int argc, char* argv[]) {
HiInitDisplay(); HiInitDisplay();
std::printf("[+] init snes emulator...\n"); std::printf("[+] init snes emulator...\n");
Memory.LoadROM("super_mario.smc"); Memory.LoadROM("/mnt/usb-drive/super_mario.smc");
InitJoysticks(); InitJoysticks();
S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0);

Binary file not shown.
Loading…
Cancel
Save