From 0e86b4314fc9cb626a45a01ee4543e2e78931392 Mon Sep 17 00:00:00 2001 From: DaMarkov Date: Mon, 7 Feb 2022 18:10:32 +0100 Subject: [PATCH 1/7] Changed output directoy. Directoy is now relative to the project and not the solution. Needed to add GLidenN64 to different solution files. --- projects/msvc/GLideN64.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/msvc/GLideN64.vcxproj b/projects/msvc/GLideN64.vcxproj index a3690940..0b33db57 100644 --- a/projects/msvc/GLideN64.vcxproj +++ b/projects/msvc/GLideN64.vcxproj @@ -46,7 +46,7 @@ AllRules.ruleset - $(SolutionDir)..\..\..\external\$(Platform)\ + $(MSBuildProjectDirectory)\..\..\..\external\$(Platform)\ $(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\ From dca837e446aba086790545f58df3643617b5e802 Mon Sep 17 00:00:00 2001 From: DaMarkov Date: Mon, 7 Feb 2022 19:05:38 +0100 Subject: [PATCH 2/7] Also changed the output folder of the other projects. --- projects/msvc/libGLideNHQ.vcxproj | 2 +- projects/msvc/osal.vcxproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/msvc/libGLideNHQ.vcxproj b/projects/msvc/libGLideNHQ.vcxproj index 10b1a3d1..0786b0cd 100644 --- a/projects/msvc/libGLideNHQ.vcxproj +++ b/projects/msvc/libGLideNHQ.vcxproj @@ -46,7 +46,7 @@ $(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\ libGLideNHQ .lib - $(SolutionDir)..\..\..\external\$(Platform)\ + $(MSBuildProjectDirectory)..\..\..\..\external\$(Platform)\ diff --git a/projects/msvc/osal.vcxproj b/projects/msvc/osal.vcxproj index 7f56ce24..02b325ff 100644 --- a/projects/msvc/osal.vcxproj +++ b/projects/msvc/osal.vcxproj @@ -47,7 +47,7 @@ - $(SolutionDir)..\..\..\external\$(Platform)\ + $(MSBuildProjectDirectory)\..\..\..\external\$(Platform)\ $(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\ @@ -101,7 +101,7 @@ - + osal From e5332785fc9dcad6d130f22e6dcbcbb2ac2e670b Mon Sep 17 00:00:00 2001 From: DaMarkov Date: Tue, 8 Feb 2022 03:44:17 +0100 Subject: [PATCH 3/7] Changed GLideN64 so it works with framebuffer emulation enabled with OOT. --- projects/msvc/GLideN64.vcxproj | 1 + src/FrameBuffer.cpp | 8 +- src/FrameBuffer.h | 2 +- .../GLSL/glsl_SpecialShadersFactory.cpp | 3 +- src/VI.cpp | 9 +- src/native/Native.cpp | 173 +++++++++++++++++- 6 files changed, 182 insertions(+), 14 deletions(-) diff --git a/projects/msvc/GLideN64.vcxproj b/projects/msvc/GLideN64.vcxproj index 0b33db57..b999b415 100644 --- a/projects/msvc/GLideN64.vcxproj +++ b/projects/msvc/GLideN64.vcxproj @@ -193,6 +193,7 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)") true stdcpp17 MultiThreadedDebug + Disabled diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index 2186923b..6acb3cf7 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -677,7 +677,8 @@ void FrameBufferList::setBufferChanged(f32 _maxY) void FrameBufferList::clearBuffersChanged() { gDP.colorImage.changed = FALSE; - FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); + //FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); + FrameBuffer* pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN); if (pBuffer != nullptr) pBuffer->m_changed = false; } @@ -1229,7 +1230,7 @@ bool FrameBufferList::RdpUpdate::update(RdpUpdateResult & _result) if ((vitype & 2) == 0) { prevwasblank = true; - return false; + //return false;//HACK } prevwasblank = false; @@ -1247,7 +1248,8 @@ bool FrameBufferList::RdpUpdate::update(RdpUpdateResult & _result) _result.vi_maxhpass = hres_clamped ? 0 : 7; _result.vi_width = _SHIFTR(*REG.VI_WIDTH, 0, 12); _result.vi_lowerfield = lowerfield; - _result.vi_origin = _SHIFTR(*REG.VI_ORIGIN, 0, 24); + //_result.vi_origin = _SHIFTR(*REG.VI_ORIGIN, 0, 24); + _result.vi_origin = *REG.VI_ORIGIN;//This is incorrect REG.VI_ORIGIN should contain only 24 bits of the frame buffer address _result.vi_fsaa = (*REG.VI_STATUS & 512) == 0; _result.vi_divot = (*REG.VI_STATUS & VI_STATUS_DIVOT_ENABLED) != 0; return true; diff --git a/src/FrameBuffer.h b/src/FrameBuffer.h index f02ae614..19246c9b 100644 --- a/src/FrameBuffer.h +++ b/src/FrameBuffer.h @@ -145,7 +145,7 @@ public: static FrameBufferList & get(); -private: +//private: FrameBufferList() : m_pCurrent(nullptr), m_pCopy(nullptr), m_prevColorImageHeight(0) {} FrameBufferList(const FrameBufferList &) = delete; diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_SpecialShadersFactory.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_SpecialShadersFactory.cpp index 839054c4..f51e956d 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_SpecialShadersFactory.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_SpecialShadersFactory.cpp @@ -684,7 +684,8 @@ namespace glsl { void activate() override { FXAAShaderBase::activate(); - FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); + //FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); + FrameBuffer* pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN); if (pBuffer != nullptr && pBuffer->m_pTexture != nullptr && (m_width != pBuffer->m_pTexture->width || m_height != pBuffer->m_pTexture->height)) { m_width = pBuffer->m_pTexture->width; diff --git a/src/VI.cpp b/src/VI.cpp index 8239eff9..f9f1da5a 100644 --- a/src/VI.cpp +++ b/src/VI.cpp @@ -254,7 +254,8 @@ void VI_UpdateScreen() if (config.frameBufferEmulation.enable) { - FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); + //FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); + FrameBuffer* pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN); if (pBuffer == nullptr) { gDP.changed |= CHANGED_CPU_FB_WRITE; } else if (!FBInfo::fbInfo.isSupported() && @@ -289,7 +290,8 @@ void VI_UpdateScreen() } const u32 size = *REG.VI_STATUS & VI_STATUS_TYPE_32; if (VI.height > 0 && size > G_IM_SIZ_8b && VI.width > 0) - frameBufferList().saveBuffer(*REG.VI_ORIGIN & 0xffffff, G_IM_FMT_RGBA, size, VI.width, true); + frameBufferList().saveBuffer(*REG.VI_ORIGIN, G_IM_FMT_RGBA, size, VI.width, true); + //frameBufferList().saveBuffer(*REG.VI_ORIGIN & 0xffffff, G_IM_FMT_RGBA, size, VI.width, true); } } // if ((((*REG.VI_STATUS) & 3) > 0) && (gDP.colorImage.changed || bCFB)) { // Does not work in release build!!! @@ -298,7 +300,8 @@ void VI_UpdateScreen() VI_UpdateSize(); bVIUpdated = true; } - FrameBuffer_CopyFromRDRAM(*REG.VI_ORIGIN & 0xffffff, bCFB); + //FrameBuffer_CopyFromRDRAM(*REG.VI_ORIGIN & 0xffffff, bCFB); + FrameBuffer_CopyFromRDRAM(*REG.VI_ORIGIN, bCFB); } frameBufferList().renderBuffer(); frameBufferList().clearBuffersChanged(); diff --git a/src/native/Native.cpp b/src/native/Native.cpp index 769c15f9..83d948ed 100644 --- a/src/native/Native.cpp +++ b/src/native/Native.cpp @@ -7,13 +7,18 @@ #include "DebugDump.h" #include "Config.h" #include "DisplayWindow.h" +#include "FrameBuffer.h" +#include "FrameBufferInfo.h" #include #include "settings.h" -#define START_WIDTH 1280 -#define START_HEIGHT 720 +//#define START_WIDTH 1280 +//#define START_HEIGHT 720 -static u64 g_width = START_WIDTH; +#define START_WIDTH 320 +#define START_HEIGHT 240 + +static u64 g_width = START_WIDTH; static u64 g_height = START_HEIGHT; extern "C" { @@ -97,7 +102,7 @@ extern "C" config.video.windowedWidth = g_width; config.video.windowedHeight = g_height; dwnd().setWindowSize(g_width, g_height); - (*REG.VI_ORIGIN)++; + //(*REG.VI_ORIGIN)++; } } @@ -106,6 +111,111 @@ void _CheckInterrupts() { +//Copied over from OOT - needs cleanup +struct Gfx; +struct OSThread; +typedef void* OSMesg; + +typedef struct OSMesgQueue { + /* 0x00 */ OSThread* mtqueue; + /* 0x04 */ OSThread* fullqueue; + /* 0x08 */ s32 validCount; + /* 0x0C */ s32 first; + /* 0x10 */ s32 msgCount; + /* 0x14 */ OSMesg* msg; +} OSMesgQueue; // size = 0x18 + +typedef struct { + /* 0x0000 */ u32 size; + /* 0x0004 */ Gfx* bufp; + /* 0x0008 */ Gfx* p; + /* 0x000C */ Gfx* d; +} TwoHeadGfxArena; // size = 0x10 + +typedef struct CfbInfo { + /* 0x00 */ u32* fb1;//Address to the frame buffer + /* 0x04 */ u32* swapBuffer; + /* 0x08 */ OSViMode* viMode; + /* 0x0C */ u32 features; + /* 0x10 */ u8 unk_10; + /* 0x11 */ s8 updateRate; + /* 0x12 */ s8 updateRate2; + /* 0x13 */ u8 unk_13; + /* 0x14 */ f32 xScale; + /* 0x18 */ f32 yScale; +} CfbInfo; // size = 0x1C + +typedef union { + OSTask_t t; + long long int force_structure_alignment; +} OSTask; + +typedef struct OSScTask { + /* 0x00 */ struct OSScTask* next; + /* 0x04 */ u32 state; + /* 0x08 */ u32 flags; + /* 0x0C */ CfbInfo* framebuffer; + /* 0x10 */ OSTask list; + /* 0x50 */ OSMesgQueue* msgQ; + /* 0x54 */ OSMesg msg; +} OSScTask; + +typedef struct GraphicsContext { + /* 0x0000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0" + /* 0x0004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1" + /* 0x0008 */ char unk_008[0x08]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3" + /* 0x0010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4" + /* 0x0014 */ u32 unk_014; + /* 0x0018 */ char unk_018[0x20]; + /* 0x0038 */ OSMesg msgBuff[0x08]; + /* 0x0058 */ OSMesgQueue* schedMsgQ; + /* 0x005C */ OSMesgQueue queue; + /* 0x0074 */ char unk_074[0x04]; + /* 0x0078 */ OSScTask task; // size of OSScTask might be wrong + /* 0x00D0 */ char unk_0D0[0xE0]; + /* 0x01B0 */ Gfx* workBuffer; + /* 0x01B4 */ TwoHeadGfxArena work; + /* 0x01C4 */ char unk_01C4[0xC0]; + /* 0x0284 */ OSViMode* viMode; + /* 0x0288 */ char unk_0288[0x20]; // Unused, could this be Zelda 2/3 ? + /* 0x02A8 */ TwoHeadGfxArena overlay; // "Zelda 4" + /* 0x02B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0" + /* 0x02C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1" + /* 0x02D8 */ u32 gfxPoolIdx; + /* 0x02DC */ u32* curFrameBuffer; + /* 0x02E0 */ char unk_2E0[0x04]; + /* 0x02E4 */ u32 viFeatures; + /* 0x02E8 */ s32 fbIdx; + /* 0x02EC */ void (*callback)(struct GraphicsContext*, void*); + /* 0x02F0 */ void* callbackParam; + /* 0x02F4 */ f32 xScale; + /* 0x02F8 */ f32 yScale; + /* 0x02FC */ char unk_2FC[0x04]; +} GraphicsContext; // size = 0x300 + +#define REG_GROUPS 29 // number of REG groups, i.e. REG, SREG, OREG, etc. +#define REG_PAGES 6 +#define REG_PER_PAGE 16 +#define REG_PER_GROUP REG_PAGES * REG_PER_PAGE + +typedef struct { + /* 0x00 */ s32 regPage; // 1 is first page + /* 0x04 */ s32 regGroup; // "register" group (R, RS, RO, RP etc.) + /* 0x08 */ s32 regCur; // selected register within page + /* 0x0C */ s32 dpadLast; + /* 0x10 */ s32 repeat; + /* 0x14 */ s16 data[REG_GROUPS * REG_PER_GROUP]; // 0xAE0 entries +} GameInfo; // size = 0x15D4 + + +#define BASE_REG(n, r) GameInfo->data[n * REG_PER_GROUP + r] + +#define SREG(r) BASE_REG(1, r) + +#define R_UPDATE_RATE SREG(30) +//End of copy + + extern "C" { void gfx_init(const char* romName, OSViMode* viMode) { REG.VI_STATUS = &viMode->comRegs.ctrl; @@ -133,9 +243,10 @@ extern "C" { api().RomOpen(romName); - config.frameBufferEmulation.enable = 0; - config.frameBufferEmulation.aspect = Config::aAdjust; + config.frameBufferEmulation.enable = 0;//Frame buffer disabled, will be enabled by OOT + //config.frameBufferEmulation.aspect = Config::aAdjust; + config.generalEmulation.hacks |= hack_subscreen | hack_ZeldaMonochrome; } void gfx_shutdown() { @@ -152,6 +263,56 @@ extern "C" { api().UpdateScreen(); //Sleep(30); } + + int gfx_fbe_is_enabled() { + return config.frameBufferEmulation.enable; + } + + void gfx_fbe_enable(int enable) { + config.frameBufferEmulation.enable = enable; + //gfx_resize(g_width, g_height); + } + + void gfx_fbe_sync(GraphicsContext* gfxCtx, GameInfo* GameInfo) { + if (!config.frameBufferEmulation.enable) + return; + + CfbInfo* cfb = gfxCtx->task.framebuffer;//Current frame buffer (according the the game) + FrameBufferList& frameBuffers = FrameBufferList::get();//GLideN64's frame buffer list + + if (!frameBuffers.getCurrent()) + return; + + gfxCtx->curFrameBuffer = &frameBuffers.getCurrent()->m_startAddress; + gfxCtx->viMode->fldRegs->origin = frameBuffers.getCurrent()->m_startAddress; + + cfb->fb1 = gfxCtx->curFrameBuffer; + cfb->swapBuffer = gfxCtx->curFrameBuffer; + + cfb->viMode = gfxCtx->viMode; + cfb->features = gfxCtx->viFeatures; + cfb->xScale = gfxCtx->xScale; + cfb->xScale = gfxCtx->yScale; + cfb->unk_10 = 0; + cfb->updateRate = R_UPDATE_RATE; + + + REG.VI_STATUS = &cfb->viMode->comRegs.ctrl; + REG.VI_WIDTH = &cfb->viMode->comRegs.width; + REG.VI_TIMING = &cfb->viMode->comRegs.burst; + REG.VI_V_SYNC = &cfb->viMode->comRegs.vSync; + REG.VI_H_SYNC = &cfb->viMode->comRegs.hSync; + REG.VI_LEAP = &cfb->viMode->comRegs.leap; + REG.VI_H_START = &cfb->viMode->comRegs.hStart; + REG.VI_X_SCALE = &cfb->viMode->comRegs.xScale; + REG.VI_V_CURRENT_LINE = &cfb->viMode->comRegs.vCurrent; + + REG.VI_ORIGIN = &cfb->viMode->fldRegs->origin;//This is incorrect REG.VI_ORIGIN should contain only 24 bits of the frame buffer address + REG.VI_Y_SCALE = &cfb->viMode->fldRegs->yScale; + REG.VI_V_START = &cfb->viMode->fldRegs->vStart; + REG.VI_V_BURST = &cfb->viMode->fldRegs->vBurst; + REG.VI_INTR = &cfb->viMode->fldRegs->vIntr; + } } Config config; From e6cdd229fd931cacf87f31f1bfe4c2d396dd87e1 Mon Sep 17 00:00:00 2001 From: DaMarkov Date: Tue, 8 Feb 2022 07:27:55 +0100 Subject: [PATCH 4/7] Changed the project files back. --- projects/msvc/GLideN64.vcxproj | 3 +-- projects/msvc/libGLideNHQ.vcxproj | 2 +- projects/msvc/osal.vcxproj | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/projects/msvc/GLideN64.vcxproj b/projects/msvc/GLideN64.vcxproj index b999b415..a3690940 100644 --- a/projects/msvc/GLideN64.vcxproj +++ b/projects/msvc/GLideN64.vcxproj @@ -46,7 +46,7 @@ AllRules.ruleset - $(MSBuildProjectDirectory)\..\..\..\external\$(Platform)\ + $(SolutionDir)..\..\..\external\$(Platform)\ $(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\ @@ -193,7 +193,6 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)") true stdcpp17 MultiThreadedDebug - Disabled diff --git a/projects/msvc/libGLideNHQ.vcxproj b/projects/msvc/libGLideNHQ.vcxproj index 0786b0cd..10b1a3d1 100644 --- a/projects/msvc/libGLideNHQ.vcxproj +++ b/projects/msvc/libGLideNHQ.vcxproj @@ -46,7 +46,7 @@ $(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\ libGLideNHQ .lib - $(MSBuildProjectDirectory)..\..\..\..\external\$(Platform)\ + $(SolutionDir)..\..\..\external\$(Platform)\ diff --git a/projects/msvc/osal.vcxproj b/projects/msvc/osal.vcxproj index 02b325ff..7f56ce24 100644 --- a/projects/msvc/osal.vcxproj +++ b/projects/msvc/osal.vcxproj @@ -47,7 +47,7 @@ - $(MSBuildProjectDirectory)\..\..\..\external\$(Platform)\ + $(SolutionDir)..\..\..\external\$(Platform)\ $(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\ @@ -101,7 +101,7 @@ - + osal From 311608c42d262c1c684dd5aa61b801d4f4651962 Mon Sep 17 00:00:00 2001 From: DaMarkov Date: Tue, 8 Feb 2022 14:01:30 +0100 Subject: [PATCH 5/7] Used NATIVE compiler flag to make changes for OOT optional. --- src/FrameBuffer.cpp | 11 ++++- src/FrameBuffer.h | 2 +- .../GLSL/glsl_SpecialShadersFactory.cpp | 5 ++- src/VI.cpp | 20 ++++++--- src/native/Native.cpp | 44 ++++++++----------- 5 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index 6acb3cf7..411c63ea 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -677,8 +677,11 @@ void FrameBufferList::setBufferChanged(f32 _maxY) void FrameBufferList::clearBuffersChanged() { gDP.colorImage.changed = FALSE; - //FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); +#ifndef NATIVE + FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); +#else FrameBuffer* pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN); +#endif if (pBuffer != nullptr) pBuffer->m_changed = false; } @@ -1230,7 +1233,11 @@ bool FrameBufferList::RdpUpdate::update(RdpUpdateResult & _result) if ((vitype & 2) == 0) { prevwasblank = true; - //return false;//HACK +#ifdef NATIVE + //return false;//HACK, REG.VI_STATUS might be set up incorrectly +#else + return false +#endif } prevwasblank = false; diff --git a/src/FrameBuffer.h b/src/FrameBuffer.h index 19246c9b..f02ae614 100644 --- a/src/FrameBuffer.h +++ b/src/FrameBuffer.h @@ -145,7 +145,7 @@ public: static FrameBufferList & get(); -//private: +private: FrameBufferList() : m_pCurrent(nullptr), m_pCopy(nullptr), m_prevColorImageHeight(0) {} FrameBufferList(const FrameBufferList &) = delete; diff --git a/src/Graphics/OpenGLContext/GLSL/glsl_SpecialShadersFactory.cpp b/src/Graphics/OpenGLContext/GLSL/glsl_SpecialShadersFactory.cpp index f51e956d..c81be336 100644 --- a/src/Graphics/OpenGLContext/GLSL/glsl_SpecialShadersFactory.cpp +++ b/src/Graphics/OpenGLContext/GLSL/glsl_SpecialShadersFactory.cpp @@ -684,8 +684,11 @@ namespace glsl { void activate() override { FXAAShaderBase::activate(); - //FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); +#ifndef NATIVE + FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); +#else FrameBuffer* pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN); +#endif if (pBuffer != nullptr && pBuffer->m_pTexture != nullptr && (m_width != pBuffer->m_pTexture->width || m_height != pBuffer->m_pTexture->height)) { m_width = pBuffer->m_pTexture->width; diff --git a/src/VI.cpp b/src/VI.cpp index f9f1da5a..01847ec2 100644 --- a/src/VI.cpp +++ b/src/VI.cpp @@ -253,9 +253,11 @@ void VI_UpdateScreen() } if (config.frameBufferEmulation.enable) { - - //FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); +#ifndef NATIVE + FrameBuffer * pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN & 0xffffff); +#else FrameBuffer* pBuffer = frameBufferList().findBuffer(*REG.VI_ORIGIN); +#endif if (pBuffer == nullptr) { gDP.changed |= CHANGED_CPU_FB_WRITE; } else if (!FBInfo::fbInfo.isSupported() && @@ -289,9 +291,14 @@ void VI_UpdateScreen() bVIUpdated = true; } const u32 size = *REG.VI_STATUS & VI_STATUS_TYPE_32; - if (VI.height > 0 && size > G_IM_SIZ_8b && VI.width > 0) + if (VI.height > 0 && size > G_IM_SIZ_8b && VI.width > 0) + { +#ifndef NATIVE + frameBufferList().saveBuffer(*REG.VI_ORIGIN & 0xffffff, G_IM_FMT_RGBA, size, VI.width, true); +#else frameBufferList().saveBuffer(*REG.VI_ORIGIN, G_IM_FMT_RGBA, size, VI.width, true); - //frameBufferList().saveBuffer(*REG.VI_ORIGIN & 0xffffff, G_IM_FMT_RGBA, size, VI.width, true); +#endif + } } } // if ((((*REG.VI_STATUS) & 3) > 0) && (gDP.colorImage.changed || bCFB)) { // Does not work in release build!!! @@ -300,8 +307,11 @@ void VI_UpdateScreen() VI_UpdateSize(); bVIUpdated = true; } - //FrameBuffer_CopyFromRDRAM(*REG.VI_ORIGIN & 0xffffff, bCFB); +#ifndef NATIVE + FrameBuffer_CopyFromRDRAM(*REG.VI_ORIGIN & 0xffffff, bCFB); +#else FrameBuffer_CopyFromRDRAM(*REG.VI_ORIGIN, bCFB); +#endif } frameBufferList().renderBuffer(); frameBufferList().clearBuffersChanged(); diff --git a/src/native/Native.cpp b/src/native/Native.cpp index 83d948ed..edde6776 100644 --- a/src/native/Native.cpp +++ b/src/native/Native.cpp @@ -12,11 +12,8 @@ #include #include "settings.h" -//#define START_WIDTH 1280 -//#define START_HEIGHT 720 - -#define START_WIDTH 320 -#define START_HEIGHT 240 +#define START_WIDTH 1280 +#define START_HEIGHT 720 static u64 g_width = START_WIDTH; static u64 g_height = START_HEIGHT; @@ -99,10 +96,9 @@ extern "C" { g_width = width; g_height = height; - config.video.windowedWidth = g_width; + config.video.windowedWidth = g_width; config.video.windowedHeight = g_height; dwnd().setWindowSize(g_width, g_height); - //(*REG.VI_ORIGIN)++; } } @@ -218,21 +214,21 @@ typedef struct { extern "C" { void gfx_init(const char* romName, OSViMode* viMode) { - REG.VI_STATUS = &viMode->comRegs.ctrl; - REG.VI_WIDTH = &viMode->comRegs.width; - REG.VI_TIMING = &viMode->comRegs.burst; - REG.VI_V_SYNC = &viMode->comRegs.vSync; - REG.VI_H_SYNC = &viMode->comRegs.hSync; - REG.VI_LEAP = &viMode->comRegs.leap; + REG.VI_STATUS = &viMode->comRegs.ctrl; + REG.VI_WIDTH = &viMode->comRegs.width; + REG.VI_TIMING = &viMode->comRegs.burst; + REG.VI_V_SYNC = &viMode->comRegs.vSync; + REG.VI_H_SYNC = &viMode->comRegs.hSync; + REG.VI_LEAP = &viMode->comRegs.leap; REG.VI_H_START = &viMode->comRegs.hStart; REG.VI_X_SCALE = &viMode->comRegs.xScale; REG.VI_V_CURRENT_LINE = &viMode->comRegs.vCurrent; - REG.VI_ORIGIN = &viMode->fldRegs->origin; + REG.VI_ORIGIN = &viMode->fldRegs->origin; REG.VI_Y_SCALE = &viMode->fldRegs->yScale; REG.VI_V_START = &viMode->fldRegs->vStart; REG.VI_V_BURST = &viMode->fldRegs->vBurst; - REG.VI_INTR = &viMode->fldRegs->vIntr; + REG.VI_INTR = &viMode->fldRegs->vIntr; CheckInterrupts = _CheckInterrupts; @@ -242,11 +238,7 @@ extern "C" { RDRAMSize = (word)-1; api().RomOpen(romName); - - config.frameBufferEmulation.enable = 0;//Frame buffer disabled, will be enabled by OOT //config.frameBufferEmulation.aspect = Config::aAdjust; - - config.generalEmulation.hacks |= hack_subscreen | hack_ZeldaMonochrome; } void gfx_shutdown() { @@ -289,7 +281,7 @@ extern "C" { cfb->fb1 = gfxCtx->curFrameBuffer; cfb->swapBuffer = gfxCtx->curFrameBuffer; - cfb->viMode = gfxCtx->viMode; + cfb->viMode = gfxCtx->viMode; cfb->features = gfxCtx->viFeatures; cfb->xScale = gfxCtx->xScale; cfb->xScale = gfxCtx->yScale; @@ -297,12 +289,12 @@ extern "C" { cfb->updateRate = R_UPDATE_RATE; - REG.VI_STATUS = &cfb->viMode->comRegs.ctrl; - REG.VI_WIDTH = &cfb->viMode->comRegs.width; - REG.VI_TIMING = &cfb->viMode->comRegs.burst; - REG.VI_V_SYNC = &cfb->viMode->comRegs.vSync; - REG.VI_H_SYNC = &cfb->viMode->comRegs.hSync; - REG.VI_LEAP = &cfb->viMode->comRegs.leap; + REG.VI_STATUS = &cfb->viMode->comRegs.ctrl; + REG.VI_WIDTH = &cfb->viMode->comRegs.width; + REG.VI_TIMING = &cfb->viMode->comRegs.burst; + REG.VI_V_SYNC = &cfb->viMode->comRegs.vSync; + REG.VI_H_SYNC = &cfb->viMode->comRegs.hSync; + REG.VI_LEAP = &cfb->viMode->comRegs.leap; REG.VI_H_START = &cfb->viMode->comRegs.hStart; REG.VI_X_SCALE = &cfb->viMode->comRegs.xScale; REG.VI_V_CURRENT_LINE = &cfb->viMode->comRegs.vCurrent; From 187d1a9caa0958953ec92b596a2a23edb762f6e5 Mon Sep 17 00:00:00 2001 From: DaMarkov Date: Tue, 8 Feb 2022 15:05:07 +0100 Subject: [PATCH 6/7] Moved structs into Native.h. --- src/native/Native.cpp | 107 ------------------------------------------ src/native/Native.h | 103 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 107 deletions(-) diff --git a/src/native/Native.cpp b/src/native/Native.cpp index edde6776..ed17b7bb 100644 --- a/src/native/Native.cpp +++ b/src/native/Native.cpp @@ -105,113 +105,6 @@ extern "C" void _CheckInterrupts() { } - - -//Copied over from OOT - needs cleanup -struct Gfx; -struct OSThread; -typedef void* OSMesg; - -typedef struct OSMesgQueue { - /* 0x00 */ OSThread* mtqueue; - /* 0x04 */ OSThread* fullqueue; - /* 0x08 */ s32 validCount; - /* 0x0C */ s32 first; - /* 0x10 */ s32 msgCount; - /* 0x14 */ OSMesg* msg; -} OSMesgQueue; // size = 0x18 - -typedef struct { - /* 0x0000 */ u32 size; - /* 0x0004 */ Gfx* bufp; - /* 0x0008 */ Gfx* p; - /* 0x000C */ Gfx* d; -} TwoHeadGfxArena; // size = 0x10 - -typedef struct CfbInfo { - /* 0x00 */ u32* fb1;//Address to the frame buffer - /* 0x04 */ u32* swapBuffer; - /* 0x08 */ OSViMode* viMode; - /* 0x0C */ u32 features; - /* 0x10 */ u8 unk_10; - /* 0x11 */ s8 updateRate; - /* 0x12 */ s8 updateRate2; - /* 0x13 */ u8 unk_13; - /* 0x14 */ f32 xScale; - /* 0x18 */ f32 yScale; -} CfbInfo; // size = 0x1C - -typedef union { - OSTask_t t; - long long int force_structure_alignment; -} OSTask; - -typedef struct OSScTask { - /* 0x00 */ struct OSScTask* next; - /* 0x04 */ u32 state; - /* 0x08 */ u32 flags; - /* 0x0C */ CfbInfo* framebuffer; - /* 0x10 */ OSTask list; - /* 0x50 */ OSMesgQueue* msgQ; - /* 0x54 */ OSMesg msg; -} OSScTask; - -typedef struct GraphicsContext { - /* 0x0000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0" - /* 0x0004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1" - /* 0x0008 */ char unk_008[0x08]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3" - /* 0x0010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4" - /* 0x0014 */ u32 unk_014; - /* 0x0018 */ char unk_018[0x20]; - /* 0x0038 */ OSMesg msgBuff[0x08]; - /* 0x0058 */ OSMesgQueue* schedMsgQ; - /* 0x005C */ OSMesgQueue queue; - /* 0x0074 */ char unk_074[0x04]; - /* 0x0078 */ OSScTask task; // size of OSScTask might be wrong - /* 0x00D0 */ char unk_0D0[0xE0]; - /* 0x01B0 */ Gfx* workBuffer; - /* 0x01B4 */ TwoHeadGfxArena work; - /* 0x01C4 */ char unk_01C4[0xC0]; - /* 0x0284 */ OSViMode* viMode; - /* 0x0288 */ char unk_0288[0x20]; // Unused, could this be Zelda 2/3 ? - /* 0x02A8 */ TwoHeadGfxArena overlay; // "Zelda 4" - /* 0x02B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0" - /* 0x02C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1" - /* 0x02D8 */ u32 gfxPoolIdx; - /* 0x02DC */ u32* curFrameBuffer; - /* 0x02E0 */ char unk_2E0[0x04]; - /* 0x02E4 */ u32 viFeatures; - /* 0x02E8 */ s32 fbIdx; - /* 0x02EC */ void (*callback)(struct GraphicsContext*, void*); - /* 0x02F0 */ void* callbackParam; - /* 0x02F4 */ f32 xScale; - /* 0x02F8 */ f32 yScale; - /* 0x02FC */ char unk_2FC[0x04]; -} GraphicsContext; // size = 0x300 - -#define REG_GROUPS 29 // number of REG groups, i.e. REG, SREG, OREG, etc. -#define REG_PAGES 6 -#define REG_PER_PAGE 16 -#define REG_PER_GROUP REG_PAGES * REG_PER_PAGE - -typedef struct { - /* 0x00 */ s32 regPage; // 1 is first page - /* 0x04 */ s32 regGroup; // "register" group (R, RS, RO, RP etc.) - /* 0x08 */ s32 regCur; // selected register within page - /* 0x0C */ s32 dpadLast; - /* 0x10 */ s32 repeat; - /* 0x14 */ s16 data[REG_GROUPS * REG_PER_GROUP]; // 0xAE0 entries -} GameInfo; // size = 0x15D4 - - -#define BASE_REG(n, r) GameInfo->data[n * REG_PER_GROUP + r] - -#define SREG(r) BASE_REG(1, r) - -#define R_UPDATE_RATE SREG(30) -//End of copy - - extern "C" { void gfx_init(const char* romName, OSViMode* viMode) { REG.VI_STATUS = &viMode->comRegs.ctrl; diff --git a/src/native/Native.h b/src/native/Native.h index d31a8c6e..f74ab24c 100644 --- a/src/native/Native.h +++ b/src/native/Native.h @@ -52,6 +52,109 @@ typedef struct { /* 0x3C */ u32 yield_data_size; } OSTask_t; // size = 0x40 +//Copied over from OOT - needs cleanup +struct Gfx; +struct OSThread; +typedef void* OSMesg; + +typedef struct OSMesgQueue { + /* 0x00 */ OSThread* mtqueue; + /* 0x04 */ OSThread* fullqueue; + /* 0x08 */ s32 validCount; + /* 0x0C */ s32 first; + /* 0x10 */ s32 msgCount; + /* 0x14 */ OSMesg* msg; +} OSMesgQueue; // size = 0x18 + +typedef struct { + /* 0x0000 */ u32 size; + /* 0x0004 */ Gfx* bufp; + /* 0x0008 */ Gfx* p; + /* 0x000C */ Gfx* d; +} TwoHeadGfxArena; // size = 0x10 + +typedef struct CfbInfo { + /* 0x00 */ u32* fb1;//Address to the frame buffer + /* 0x04 */ u32* swapBuffer; + /* 0x08 */ OSViMode* viMode; + /* 0x0C */ u32 features; + /* 0x10 */ u8 unk_10; + /* 0x11 */ s8 updateRate; + /* 0x12 */ s8 updateRate2; + /* 0x13 */ u8 unk_13; + /* 0x14 */ f32 xScale; + /* 0x18 */ f32 yScale; +} CfbInfo; // size = 0x1C + +typedef union { + OSTask_t t; + long long int force_structure_alignment; +} OSTask; + +typedef struct OSScTask { + /* 0x00 */ struct OSScTask* next; + /* 0x04 */ u32 state; + /* 0x08 */ u32 flags; + /* 0x0C */ CfbInfo* framebuffer; + /* 0x10 */ OSTask list; + /* 0x50 */ OSMesgQueue* msgQ; + /* 0x54 */ OSMesg msg; +} OSScTask; + +typedef struct GraphicsContext { + /* 0x0000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0" + /* 0x0004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1" + /* 0x0008 */ char unk_008[0x08]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3" + /* 0x0010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4" + /* 0x0014 */ u32 unk_014; + /* 0x0018 */ char unk_018[0x20]; + /* 0x0038 */ OSMesg msgBuff[0x08]; + /* 0x0058 */ OSMesgQueue* schedMsgQ; + /* 0x005C */ OSMesgQueue queue; + /* 0x0074 */ char unk_074[0x04]; + /* 0x0078 */ OSScTask task; // size of OSScTask might be wrong + /* 0x00D0 */ char unk_0D0[0xE0]; + /* 0x01B0 */ Gfx* workBuffer; + /* 0x01B4 */ TwoHeadGfxArena work; + /* 0x01C4 */ char unk_01C4[0xC0]; + /* 0x0284 */ OSViMode* viMode; + /* 0x0288 */ char unk_0288[0x20]; // Unused, could this be Zelda 2/3 ? + /* 0x02A8 */ TwoHeadGfxArena overlay; // "Zelda 4" + /* 0x02B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0" + /* 0x02C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1" + /* 0x02D8 */ u32 gfxPoolIdx; + /* 0x02DC */ u32* curFrameBuffer; + /* 0x02E0 */ char unk_2E0[0x04]; + /* 0x02E4 */ u32 viFeatures; + /* 0x02E8 */ s32 fbIdx; + /* 0x02EC */ void (*callback)(struct GraphicsContext*, void*); + /* 0x02F0 */ void* callbackParam; + /* 0x02F4 */ f32 xScale; + /* 0x02F8 */ f32 yScale; + /* 0x02FC */ char unk_2FC[0x04]; +} GraphicsContext; // size = 0x300 + +#define REG_GROUPS 29 // number of REG groups, i.e. REG, SREG, OREG, etc. +#define REG_PAGES 6 +#define REG_PER_PAGE 16 +#define REG_PER_GROUP REG_PAGES * REG_PER_PAGE + +typedef struct { + /* 0x00 */ s32 regPage; // 1 is first page + /* 0x04 */ s32 regGroup; // "register" group (R, RS, RO, RP etc.) + /* 0x08 */ s32 regCur; // selected register within page + /* 0x0C */ s32 dpadLast; + /* 0x10 */ s32 repeat; + /* 0x14 */ s16 data[REG_GROUPS * REG_PER_GROUP]; // 0xAE0 entries +} GameInfo; // size = 0x15D4 + + +#define BASE_REG(n, r) GameInfo->data[n * REG_PER_GROUP + r] + +#define SREG(r) BASE_REG(1, r) + +#define R_UPDATE_RATE SREG(30) + extern "C" { void gfx_init(const char* romName, OSViMode* viMode); void gfx_shutdown(); From 19533b5d18a0bfafd74628d0a2a4041ca7d88a7d Mon Sep 17 00:00:00 2001 From: DaMarkov Date: Tue, 8 Feb 2022 16:58:56 +0100 Subject: [PATCH 7/7] Cleanup and missed on change in FrameBuffer.cpp. --- src/FrameBuffer.cpp | 5 ++++- src/native/Native.cpp | 12 +++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index 411c63ea..ebadd77f 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -1255,8 +1255,11 @@ bool FrameBufferList::RdpUpdate::update(RdpUpdateResult & _result) _result.vi_maxhpass = hres_clamped ? 0 : 7; _result.vi_width = _SHIFTR(*REG.VI_WIDTH, 0, 12); _result.vi_lowerfield = lowerfield; - //_result.vi_origin = _SHIFTR(*REG.VI_ORIGIN, 0, 24); +#ifndef NATIVE + _result.vi_origin = _SHIFTR(*REG.VI_ORIGIN, 0, 24); +#else _result.vi_origin = *REG.VI_ORIGIN;//This is incorrect REG.VI_ORIGIN should contain only 24 bits of the frame buffer address +#endif _result.vi_fsaa = (*REG.VI_STATUS & 512) == 0; _result.vi_divot = (*REG.VI_STATUS & VI_STATUS_DIVOT_ENABLED) != 0; return true; diff --git a/src/native/Native.cpp b/src/native/Native.cpp index ed17b7bb..acc8f191 100644 --- a/src/native/Native.cpp +++ b/src/native/Native.cpp @@ -131,7 +131,6 @@ extern "C" { RDRAMSize = (word)-1; api().RomOpen(romName); - //config.frameBufferEmulation.aspect = Config::aAdjust; } void gfx_shutdown() { @@ -155,7 +154,6 @@ extern "C" { void gfx_fbe_enable(int enable) { config.frameBufferEmulation.enable = enable; - //gfx_resize(g_width, g_height); } void gfx_fbe_sync(GraphicsContext* gfxCtx, GameInfo* GameInfo) { @@ -171,15 +169,15 @@ extern "C" { gfxCtx->curFrameBuffer = &frameBuffers.getCurrent()->m_startAddress; gfxCtx->viMode->fldRegs->origin = frameBuffers.getCurrent()->m_startAddress; - cfb->fb1 = gfxCtx->curFrameBuffer; + cfb->fb1 = gfxCtx->curFrameBuffer; cfb->swapBuffer = gfxCtx->curFrameBuffer; cfb->viMode = gfxCtx->viMode; cfb->features = gfxCtx->viFeatures; - cfb->xScale = gfxCtx->xScale; - cfb->xScale = gfxCtx->yScale; - cfb->unk_10 = 0; - cfb->updateRate = R_UPDATE_RATE; + cfb->xScale = gfxCtx->xScale; + cfb->xScale = gfxCtx->yScale; + cfb->unk_10 = 0; + cfb->updateRate = (s8)R_UPDATE_RATE; REG.VI_STATUS = &cfb->viMode->comRegs.ctrl;