mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2024-06-02 19:47:32 -04:00
Compare commits
11 commits
29b6002b75
...
0c7480d854
Author | SHA1 | Date | |
---|---|---|---|
0c7480d854 | |||
10798c3464 | |||
ee2c6cc7c2 | |||
474bf6e784 | |||
35cea5e1d7 | |||
6112aa120a | |||
341f403061 | |||
546e8c4ad8 | |||
c33cd1f35f | |||
ea4293f40b | |||
7ba7422ff8 |
|
@ -8,6 +8,7 @@ endif()
|
||||||
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
|
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||||||
|
set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_SOURCE_DIR}/cmake/DefaultBuildFlags.cmake")
|
||||||
|
|
||||||
option(USE_VCPKG "Use vcpkg for dependency packages" OFF)
|
option(USE_VCPKG "Use vcpkg for dependency packages" OFF)
|
||||||
if (USE_VCPKG)
|
if (USE_VCPKG)
|
||||||
|
@ -78,14 +79,6 @@ if (ENABLE_LTO)
|
||||||
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU)
|
|
||||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Og")
|
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
string(REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
|
|
||||||
string(REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
|
|
||||||
|
|
||||||
if (NOT APPLE)
|
if (NOT APPLE)
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s")
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s")
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -6,10 +6,9 @@
|
||||||
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-%23ff554d.svg"></a>
|
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-%23ff554d.svg"></a>
|
||||||
<a href="https://kiwiirc.com/client/irc.badnik.net/?nick=IRC-Source_?#melonds" alt="IRC channel: #melonds"><img src="https://img.shields.io/badge/IRC%20chat-%23melonds-%23dd2e44.svg"></a>
|
<a href="https://kiwiirc.com/client/irc.badnik.net/?nick=IRC-Source_?#melonds" alt="IRC channel: #melonds"><img src="https://img.shields.io/badge/IRC%20chat-%23melonds-%23dd2e44.svg"></a>
|
||||||
<br>
|
<br>
|
||||||
<a href="https://github.com/melonDS-emu/melonDS/actions?query=workflow%3A%22CMake+Build+%28Windows+x86-64%29%22+event%3Apush"><img src="https://img.shields.io/github/actions/workflow/status/melonDS-emu/melonDS/build-windows.yml?label=Windows%20x86-64&logo=GitHub&branch=master"></img></a>
|
<a href="https://github.com/melonDS-emu/melonDS/actions/workflows/build-windows.yml?query=event%3Apush"><img src="https://github.com/melonDS-emu/melonDS/actions/workflows/build-windows.yml/badge.svg" /></a>
|
||||||
<a href="https://github.com/melonDS-emu/melonDS/actions?query=workflow%3A%22CMake+Build+%28Ubuntu+x86-64%29%22+event%3Apush"><img src="https://img.shields.io/github/actions/workflow/status/melonDS-emu/melonDS/build-ubuntu.yml?label=Linux%20x86-64&logo=GitHub"></img></a>
|
<a href="https://github.com/melonDS-emu/melonDS/actions/workflows/build-ubuntu.yml?query=event%3Apush"><img src="https://github.com/melonDS-emu/melonDS/actions/workflows/build-ubuntu.yml/badge.svg" /></a>
|
||||||
<a href="https://github.com/melonDS-emu/melonDS/actions?query=workflow%3A%22CMake+Build+%28Ubuntu+aarch64%29%22+event%3Apush"><img src="https://img.shields.io/github/actions/workflow/status/melonDS-emu/melonDS/build-ubuntu-aarch64.yml?label=Linux%20ARM64&logo=GitHub"></img></a>
|
<a href="https://github.com/melonDS-emu/melonDS/actions/workflows/build-macos.yml?query=event%3Apush"><img src="https://github.com/melonDS-emu/melonDS/actions/workflows/build-macos.yml/badge.svg" /></a>
|
||||||
<a href="https://github.com/melonDS-emu/melonDS/actions/workflows/build-macos-universal.yml?query=event%3Apush"><img src="https://img.shields.io/github/actions/workflow/status/melonDS-emu/melonDS/build-macos.yml?label=macOS%20Universal&logo=GitHub"></img></a>
|
|
||||||
</p>
|
</p>
|
||||||
DS emulator, sorta
|
DS emulator, sorta
|
||||||
|
|
||||||
|
|
9
cmake/DefaultBuildFlags.cmake
Normal file
9
cmake/DefaultBuildFlags.cmake
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
if (CMAKE_C_COMPILER_ID STREQUAL GNU)
|
||||||
|
set(CMAKE_C_FLAGS_DEBUG_INIT "-g -Og")
|
||||||
|
endif()
|
||||||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU)
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG_INIT "-g -Og")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELEASE_INIT "${CMAKE_C_FLAGS_RELEASE_INIT}")
|
||||||
|
string(REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELEASE_INIT "${CMAKE_CXX_FLAGS_RELEASE_INIT}")
|
18
src/CP15.cpp
18
src/CP15.cpp
|
@ -186,10 +186,14 @@ void ARMv5::UpdatePURegion(u32 n)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 start = rgn >> 12;
|
// notes:
|
||||||
u32 sz = 2 << ((rgn >> 1) & 0x1F);
|
// * min size of a pu region is 4KiB (12 bits)
|
||||||
u32 end = start + (sz >> 12);
|
// * size is calculated as size + 1, but the 12 lsb of address space are ignored, therefore we need it as size + 1 - 12, or size - 11
|
||||||
// TODO: check alignment of start
|
// * pu regions are aligned based on their size
|
||||||
|
u32 size = std::max((int)((rgn>>1) & 0x1F) - 11, 0); // obtain the size, subtract 11 and clamp to a min of 0.
|
||||||
|
u32 start = ((rgn >> 12) >> size) << size; // determine the start offset, and use shifts to force alignment with a multiple of the size.
|
||||||
|
u32 end = start + (1<<size); // add 1 left shifted by size to start to determine end point
|
||||||
|
// dont need to bounds check the end point because the force alignment inherently prevents it from breaking
|
||||||
|
|
||||||
u8 usermask = 0;
|
u8 usermask = 0;
|
||||||
u8 privmask = 0;
|
u8 privmask = 0;
|
||||||
|
@ -239,7 +243,7 @@ void ARMv5::UpdatePURegion(u32 n)
|
||||||
"PU region %d: %08X-%08X, user=%02X priv=%02X, %08X/%08X\n",
|
"PU region %d: %08X-%08X, user=%02X priv=%02X, %08X/%08X\n",
|
||||||
n,
|
n,
|
||||||
start << 12,
|
start << 12,
|
||||||
end << 12,
|
(end << 12) - 1,
|
||||||
usermask,
|
usermask,
|
||||||
privmask,
|
privmask,
|
||||||
PU_DataRW,
|
PU_DataRW,
|
||||||
|
@ -579,12 +583,12 @@ void ARMv5::CP15Write(u32 id, u32 val)
|
||||||
|
|
||||||
std::snprintf(log_output,
|
std::snprintf(log_output,
|
||||||
sizeof(log_output),
|
sizeof(log_output),
|
||||||
"PU: region %d = %08X : %s, %08X-%08X\n",
|
"PU: region %d = %08X : %s, start: %08X size: %02X\n",
|
||||||
(id >> 4) & 0xF,
|
(id >> 4) & 0xF,
|
||||||
val,
|
val,
|
||||||
val & 1 ? "enabled" : "disabled",
|
val & 1 ? "enabled" : "disabled",
|
||||||
val & 0xFFFFF000,
|
val & 0xFFFFF000,
|
||||||
(val & 0xFFFFF000) + (2 << ((val & 0x3E) >> 1))
|
(val & 0x3E) >> 1
|
||||||
);
|
);
|
||||||
Log(LogLevel::Debug, "%s", log_output);
|
Log(LogLevel::Debug, "%s", log_output);
|
||||||
// Some implementations of Log imply a newline, so we build up the line before printing it
|
// Some implementations of Log imply a newline, so we build up the line before printing it
|
||||||
|
|
|
@ -591,6 +591,20 @@ void SoftRenderer::PlotTranslucentPixel(const GPU3D& gpu3d, u32 pixeladdr, u32 c
|
||||||
AttrBuffer[pixeladdr] = attr;
|
AttrBuffer[pixeladdr] = attr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoftRenderer::CheckForLine(RendererPolygon* rp) const
|
||||||
|
{
|
||||||
|
Polygon* polygon = rp->PolyData;
|
||||||
|
|
||||||
|
// check for line polygons
|
||||||
|
if (polygon->Vertices[rp->CurVL]->FinalPosition[0] == polygon->Vertices[rp->CurVR]->FinalPosition[0]
|
||||||
|
&& polygon->Vertices[rp->CurVL]->FinalPosition[1] == polygon->Vertices[rp->CurVR]->FinalPosition[1]
|
||||||
|
&& polygon->Vertices[rp->NextVL]->FinalPosition[0] == polygon->Vertices[rp->NextVR]->FinalPosition[0]
|
||||||
|
&& polygon->Vertices[rp->NextVL]->FinalPosition[1] == polygon->Vertices[rp->NextVR]->FinalPosition[1])
|
||||||
|
rp->Line = true;
|
||||||
|
else
|
||||||
|
rp->Line = false;
|
||||||
|
}
|
||||||
|
|
||||||
void SoftRenderer::SetupPolygonLeftEdge(SoftRenderer::RendererPolygon* rp, s32 y) const
|
void SoftRenderer::SetupPolygonLeftEdge(SoftRenderer::RendererPolygon* rp, s32 y) const
|
||||||
{
|
{
|
||||||
Polygon* polygon = rp->PolyData;
|
Polygon* polygon = rp->PolyData;
|
||||||
|
@ -695,6 +709,7 @@ void SoftRenderer::SetupPolygon(SoftRenderer::RendererPolygon* rp, Polygon* poly
|
||||||
{
|
{
|
||||||
SetupPolygonLeftEdge(rp, ytop);
|
SetupPolygonLeftEdge(rp, ytop);
|
||||||
SetupPolygonRightEdge(rp, ytop);
|
SetupPolygonRightEdge(rp, ytop);
|
||||||
|
CheckForLine(rp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -723,15 +738,23 @@ void SoftRenderer::RenderShadowMaskScanline(const GPU3D& gpu3d, RendererPolygon*
|
||||||
|
|
||||||
if (polygon->YTop != polygon->YBottom)
|
if (polygon->YTop != polygon->YBottom)
|
||||||
{
|
{
|
||||||
if (y >= polygon->Vertices[rp->NextVL]->FinalPosition[1] && rp->CurVL != polygon->VBottom)
|
bool updateLeftSlope = (y >= polygon->Vertices[rp->NextVL]->FinalPosition[1] && rp->CurVL != polygon->VBottom);
|
||||||
|
bool updateRightSlope = (y >= polygon->Vertices[rp->NextVR]->FinalPosition[1] && rp->CurVR != polygon->VBottom);
|
||||||
|
|
||||||
|
if (updateLeftSlope)
|
||||||
{
|
{
|
||||||
SetupPolygonLeftEdge(rp, y);
|
SetupPolygonLeftEdge(rp, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (y >= polygon->Vertices[rp->NextVR]->FinalPosition[1] && rp->CurVR != polygon->VBottom)
|
if (updateRightSlope)
|
||||||
{
|
{
|
||||||
SetupPolygonRightEdge(rp, y);
|
SetupPolygonRightEdge(rp, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updateLeftSlope || updateRightSlope)
|
||||||
|
{
|
||||||
|
CheckForLine(rp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vertex *vlcur, *vlnext, *vrcur, *vrnext;
|
Vertex *vlcur, *vlnext, *vrcur, *vrnext;
|
||||||
|
@ -812,7 +835,7 @@ void SoftRenderer::RenderShadowMaskScanline(const GPU3D& gpu3d, RendererPolygon*
|
||||||
{
|
{
|
||||||
l_filledge = ((rp->SlopeL.Negative || !rp->SlopeL.XMajor)
|
l_filledge = ((rp->SlopeL.Negative || !rp->SlopeL.XMajor)
|
||||||
|| (y == polygon->YBottom-1) && rp->SlopeL.XMajor && (vlnext->FinalPosition[0] != vrnext->FinalPosition[0]))
|
|| (y == polygon->YBottom-1) && rp->SlopeL.XMajor && (vlnext->FinalPosition[0] != vrnext->FinalPosition[0]))
|
||||||
|| (rp->SlopeL.Increment == rp->SlopeR.Increment) && (xstart+l_edgelen == xend+1);
|
|| rp->Line;
|
||||||
r_filledge = (!rp->SlopeR.Negative && rp->SlopeR.XMajor) || (rp->SlopeR.Increment==0)
|
r_filledge = (!rp->SlopeR.Negative && rp->SlopeR.XMajor) || (rp->SlopeR.Increment==0)
|
||||||
|| (y == polygon->YBottom-1) && rp->SlopeR.XMajor && (vlnext->FinalPosition[0] != vrnext->FinalPosition[0]);
|
|| (y == polygon->YBottom-1) && rp->SlopeR.XMajor && (vlnext->FinalPosition[0] != vrnext->FinalPosition[0]);
|
||||||
}
|
}
|
||||||
|
@ -948,15 +971,23 @@ void SoftRenderer::RenderPolygonScanline(const GPU& gpu, RendererPolygon* rp, s3
|
||||||
|
|
||||||
if (polygon->YTop != polygon->YBottom)
|
if (polygon->YTop != polygon->YBottom)
|
||||||
{
|
{
|
||||||
if (y >= polygon->Vertices[rp->NextVL]->FinalPosition[1] && rp->CurVL != polygon->VBottom)
|
bool updateLeftSlope = (y >= polygon->Vertices[rp->NextVL]->FinalPosition[1] && rp->CurVL != polygon->VBottom);
|
||||||
|
bool updateRightSlope = (y >= polygon->Vertices[rp->NextVR]->FinalPosition[1] && rp->CurVR != polygon->VBottom);
|
||||||
|
|
||||||
|
if (updateLeftSlope)
|
||||||
{
|
{
|
||||||
SetupPolygonLeftEdge(rp, y);
|
SetupPolygonLeftEdge(rp, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (y >= polygon->Vertices[rp->NextVR]->FinalPosition[1] && rp->CurVR != polygon->VBottom)
|
if (updateRightSlope)
|
||||||
{
|
{
|
||||||
SetupPolygonRightEdge(rp, y);
|
SetupPolygonRightEdge(rp, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updateLeftSlope || updateRightSlope)
|
||||||
|
{
|
||||||
|
CheckForLine(rp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vertex *vlcur, *vlnext, *vrcur, *vrnext;
|
Vertex *vlcur, *vlnext, *vrcur, *vrnext;
|
||||||
|
@ -1009,7 +1040,7 @@ void SoftRenderer::RenderPolygonScanline(const GPU& gpu, RendererPolygon* rp, s3
|
||||||
// * the bottom-most pixel of negative x-major slopes are filled if they are next to a flat bottom edge
|
// * the bottom-most pixel of negative x-major slopes are filled if they are next to a flat bottom edge
|
||||||
// edges are always filled if antialiasing/edgemarking are enabled,
|
// edges are always filled if antialiasing/edgemarking are enabled,
|
||||||
// if the pixels are translucent and alpha blending is enabled, or if the polygon is wireframe
|
// if the pixels are translucent and alpha blending is enabled, or if the polygon is wireframe
|
||||||
// checkme: do swapped line polygons exist?
|
// checkme: do swapped line polygons exist? if they do then they likely should also be filled
|
||||||
if ((gpu.GPU3D.RenderDispCnt & ((1<<4)|(1<<5))) || ((polyalpha < 31) && (gpu.GPU3D.RenderDispCnt & (1<<3))) || wireframe)
|
if ((gpu.GPU3D.RenderDispCnt & ((1<<4)|(1<<5))) || ((polyalpha < 31) && (gpu.GPU3D.RenderDispCnt & (1<<3))) || wireframe)
|
||||||
{
|
{
|
||||||
l_filledge = true;
|
l_filledge = true;
|
||||||
|
@ -1054,7 +1085,7 @@ void SoftRenderer::RenderPolygonScanline(const GPU& gpu, RendererPolygon* rp, s3
|
||||||
{
|
{
|
||||||
l_filledge = ((rp->SlopeL.Negative || !rp->SlopeL.XMajor)
|
l_filledge = ((rp->SlopeL.Negative || !rp->SlopeL.XMajor)
|
||||||
|| (y == polygon->YBottom-1) && rp->SlopeL.XMajor && (vlnext->FinalPosition[0] != vrnext->FinalPosition[0]))
|
|| (y == polygon->YBottom-1) && rp->SlopeL.XMajor && (vlnext->FinalPosition[0] != vrnext->FinalPosition[0]))
|
||||||
|| (rp->SlopeL.Increment == rp->SlopeR.Increment) && (xstart+l_edgelen == xend+1);
|
|| rp->Line;
|
||||||
r_filledge = (!rp->SlopeR.Negative && rp->SlopeR.XMajor) || (rp->SlopeR.Increment==0)
|
r_filledge = (!rp->SlopeR.Negative && rp->SlopeR.XMajor) || (rp->SlopeR.Increment==0)
|
||||||
|| (y == polygon->YBottom-1) && rp->SlopeR.XMajor && (vlnext->FinalPosition[0] != vrnext->FinalPosition[0]);
|
|| (y == polygon->YBottom-1) && rp->SlopeR.XMajor && (vlnext->FinalPosition[0] != vrnext->FinalPosition[0]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -451,6 +451,7 @@ private:
|
||||||
s32 XL, XR;
|
s32 XL, XR;
|
||||||
u32 CurVL, CurVR;
|
u32 CurVL, CurVR;
|
||||||
u32 NextVL, NextVR;
|
u32 NextVL, NextVR;
|
||||||
|
bool Line;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -458,6 +459,7 @@ private:
|
||||||
void TextureLookup(const GPU& gpu, u32 texparam, u32 texpal, s16 s, s16 t, u16* color, u8* alpha) const;
|
void TextureLookup(const GPU& gpu, u32 texparam, u32 texpal, s16 s, s16 t, u16* color, u8* alpha) const;
|
||||||
u32 RenderPixel(const GPU& gpu, const Polygon* polygon, u8 vr, u8 vg, u8 vb, s16 s, s16 t) const;
|
u32 RenderPixel(const GPU& gpu, const Polygon* polygon, u8 vr, u8 vg, u8 vb, s16 s, s16 t) const;
|
||||||
void PlotTranslucentPixel(const GPU3D& gpu3d, u32 pixeladdr, u32 color, u32 z, u32 polyattr, u32 shadow);
|
void PlotTranslucentPixel(const GPU3D& gpu3d, u32 pixeladdr, u32 color, u32 z, u32 polyattr, u32 shadow);
|
||||||
|
void CheckForLine(RendererPolygon* rp) const;
|
||||||
void SetupPolygonLeftEdge(RendererPolygon* rp, s32 y) const;
|
void SetupPolygonLeftEdge(RendererPolygon* rp, s32 y) const;
|
||||||
void SetupPolygonRightEdge(RendererPolygon* rp, s32 y) const;
|
void SetupPolygonRightEdge(RendererPolygon* rp, s32 y) const;
|
||||||
void SetupPolygon(RendererPolygon* rp, Polygon* polygon) const;
|
void SetupPolygon(RendererPolygon* rp, Polygon* polygon) const;
|
||||||
|
|
|
@ -948,8 +948,8 @@ u32 DecompressROM(const u8* inContent, const u32 inSize, unique_ptr<u8[]>& outCo
|
||||||
|
|
||||||
if (realSize != ZSTD_CONTENTSIZE_UNKNOWN)
|
if (realSize != ZSTD_CONTENTSIZE_UNKNOWN)
|
||||||
{
|
{
|
||||||
outContent = make_unique<u8[]>(realSize);
|
auto newOutContent = make_unique<u8[]>(realSize);
|
||||||
u64 decompressed = ZSTD_decompress(outContent.get(), realSize, inContent, inSize);
|
u64 decompressed = ZSTD_decompress(newOutContent.get(), realSize, inContent, inSize);
|
||||||
|
|
||||||
if (ZSTD_isError(decompressed))
|
if (ZSTD_isError(decompressed))
|
||||||
{
|
{
|
||||||
|
@ -957,6 +957,7 @@ u32 DecompressROM(const u8* inContent, const u32 inSize, unique_ptr<u8[]>& outCo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
outContent = std::move(newOutContent);
|
||||||
return realSize;
|
return realSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1011,7 +1012,6 @@ u32 DecompressROM(const u8* inContent, const u32 inSize, unique_ptr<u8[]>& outCo
|
||||||
}
|
}
|
||||||
} while (inBuf.pos < inBuf.size);
|
} while (inBuf.pos < inBuf.size);
|
||||||
|
|
||||||
ZSTD_freeDStream(dStream);
|
|
||||||
outContent = make_unique<u8[]>(outBuf.pos);
|
outContent = make_unique<u8[]>(outBuf.pos);
|
||||||
memcpy(outContent.get(), outBuf.dst, outBuf.pos);
|
memcpy(outContent.get(), outBuf.dst, outBuf.pos);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue