From 5bba4e53b5f59fc0e97db575b58caf378b083f16 Mon Sep 17 00:00:00 2001 From: XProger Date: Mon, 24 Jun 2019 02:57:19 +0300 Subject: [PATCH] 3DS fix UI rendering, turn off MSAA for stereo renderer (bad performance) --- src/gapi/c3d.h | 23 +++++++++-------------- src/mesh.h | 3 +-- src/platform/3ds/main.cpp | 20 ++++++++++---------- src/utils.h | 5 +++-- 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/gapi/c3d.h b/src/gapi/c3d.h index fc1d424..97f7820 100644 --- a/src/gapi/c3d.h +++ b/src/gapi/c3d.h @@ -13,7 +13,7 @@ #define DISPLAY_BUFFER_COUNT 2 #define DISPLAY_TRANSFER_FLAGS (\ - GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_XY) \ + GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO) \ | GX_TRANSFER_FLIP_VERT(0) \ | GX_TRANSFER_OUT_TILED(0) \ | GX_TRANSFER_RAW_COPY(0) \ @@ -328,7 +328,7 @@ namespace GAPI { vCount *= COUNT(chunks); } - VAO = new C3D_BufInfo[aCount + 1]; + VAO = new C3D_BufInfo[aCount]; iBuffer = (Index*) linearAlloc(iCount * sizeof(Index)); vBuffer = (Vertex*) linearAlloc(vCount * sizeof(Vertex)); @@ -382,16 +382,12 @@ namespace GAPI { } void bind(const MeshRange &range) { - C3D_BufInfo *vao = VAO; + ASSERT(range.aIndex > -1); + C3D_BufInfo *vao = VAO + range.aIndex; - if (range.aIndex == -1) { - vao += aCount - 1; - initVAO(vao, vBuffer + range.vStart + getChunk().vStart); - // workaround for passing "info != &ctx->bufInfo" check inside C3D_SetBufInfo for the same VAO pointers - C3D_BufInfo dummyBufInfo; - C3D_SetBufInfo(&dummyBufInfo); + if (dynamic) { + initVAO(vao, vBuffer + getChunk().vStart + range.vStart); } else { - vao += range.aIndex; if (Core::active.VAO == vao) { return; } @@ -420,12 +416,11 @@ namespace GAPI { LOG("Version : %s\n", "1.0"); gfxInitDefault(); - gfxSet3D(true); consoleInit(GFX_BOTTOM, NULL); C3D_Init(C3D_DEFAULT_CMDBUF_SIZE); - defTarget[0] = C3D_RenderTargetCreate(240 * 2, 400 * 2, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); - defTarget[1] = C3D_RenderTargetCreate(240 * 2, 400 * 2, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); + defTarget[0] = C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); + defTarget[1] = C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); C3D_RenderTargetSetOutput(defTarget[0], GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); C3D_RenderTargetSetOutput(defTarget[1], GFX_TOP, GFX_RIGHT, DISPLAY_TRANSFER_FLAGS); curTarget = defTarget[0]; @@ -455,7 +450,7 @@ namespace GAPI { //C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR); //C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); - clearColor = 0x68B0D8FF; + clearColor = 0; //0x68B0D8FF; colorMask = GPU_WRITE_COLOR; depthMask = GPU_WRITE_DEPTH; diff --git a/src/mesh.h b/src/mesh.h index 9ecad6f..b8b0cba 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -1328,8 +1328,7 @@ struct MeshBuilder { } void renderBuffer(Index *indices, int iCount, Vertex *vertices, int vCount) { - if (!iCount) return; - ASSERT(vCount > 0); + if (iCount <= 0) return; dynRange.iStart = 0; dynRange.iCount = iCount; diff --git a/src/platform/3ds/main.cpp b/src/platform/3ds/main.cpp index 2d37cea..8df47ba 100644 --- a/src/platform/3ds/main.cpp +++ b/src/platform/3ds/main.cpp @@ -57,7 +57,8 @@ void inputUpdate() { hidScanInput(); - u64 mask = hidKeysDown() | hidKeysHeld(); + u64 down = hidKeysDown(); + u64 mask = down | hidKeysHeld(); for (int i = 1; i < jkMAX; i++) { Input::setJoyDown(0, JoyKey(jkNone + i), (mask & keys[i]) != 0); @@ -71,20 +72,24 @@ void inputUpdate() { if (fabsf(stickL.x) < 0.3f && fabsf(stickL.y) < 0.3f) stickL = vec2(0.0f); Input::setJoyPos(0, jkL, stickL); - if (hidKeysDown() & KEY_TOUCH) { + if (down & KEY_TOUCH) { + bottomScreenOn = !bottomScreenOn; gspLcdInit(); if (bottomScreenOn) { GSPLCD_PowerOffBacklight(GSPLCD_SCREEN_BOTTOM); - bottomScreenOn = false; } else { GSPLCD_PowerOnBacklight(GSPLCD_SCREEN_BOTTOM); - bottomScreenOn = true; } gspLcdExit(); } } void inputFree() { + if (!bottomScreenOn) { + gspLcdInit(); + GSPLCD_PowerOnBacklight(GSPLCD_SCREEN_BOTTOM); + gspLcdExit(); + } hidExit(); } @@ -180,7 +185,7 @@ int main() { osStartTime = Core::getTime(); - Game::init("PSXDATA/LEVEL1.PSX"); + Game::init(); while (aptMainLoop() && !Core::isQuit) { inputUpdate(); @@ -196,11 +201,6 @@ int main() { inputFree(); sndFree(); - if (!bottomScreenOn) { - gspLcdInit(); - GSPLCD_PowerOnBacklight(GSPLCD_SCREEN_BOTTOM); - gspLcdExit(); - } Game::deinit(); return 0; diff --git a/src/utils.h b/src/utils.h index 712062e..95aedcb 100644 --- a/src/utils.h +++ b/src/utils.h @@ -652,8 +652,8 @@ struct mat4 { if (rotate90) { e00 = e11 = 0.0f; - e01 = 2.0f / (r - l); - e10 = 2.0f / (b - t); + e10 = 2.0f / (l - r); + e01 = 2.0f / (t - b); } else { e00 = 2.0f / (r - l); e11 = 2.0f / (t - b); @@ -670,6 +670,7 @@ struct mat4 { case PROJ_NEG_ZERO : e22 = 1.0f / (znear - zfar); e23 = (znear + zfar) / (znear - zfar) * 0.5f - 0.5f; + e03 = -e03; break; case PROJ_ZERO_POS : e22 = 2.0f / (znear - zfar);