1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-06-25 22:09:35 +00:00

Implement Debugger.

This commit is contained in:
Sergey Lipskiy 2017-06-16 15:36:07 +07:00
parent 0f01e1e333
commit c907c3013a
13 changed files with 1495 additions and 4 deletions

View File

@ -276,6 +276,7 @@
<ClCompile Include="..\..\src\convert.cpp" />
<ClCompile Include="..\..\src\CRC_OPT.cpp" />
<ClCompile Include="..\..\src\DebugDump.cpp" />
<ClCompile Include="..\..\src\Debugger.cpp" />
<ClCompile Include="..\..\src\DepthBuffer.cpp" />
<ClCompile Include="..\..\src\DepthBufferRender\ClipPolygon.cpp" />
<ClCompile Include="..\..\src\DepthBufferRender\DepthBufferRender.cpp" />
@ -415,6 +416,7 @@
<ClInclude Include="..\..\src\CRC.h" />
<ClInclude Include="..\..\src\CRC32.h" />
<ClInclude Include="..\..\src\DebugDump.h" />
<ClInclude Include="..\..\src\Debugger.h" />
<ClInclude Include="..\..\src\DepthBuffer.h" />
<ClInclude Include="..\..\src\DepthBufferRender\ClipPolygon.h" />
<ClInclude Include="..\..\src\DepthBufferRender\DepthBufferRender.h" />

View File

@ -359,6 +359,9 @@
<ClCompile Include="..\..\src\DebugDump.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\Debugger.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\3DMath.h">
@ -664,5 +667,8 @@
<ClInclude Include="..\..\src\DebugDump.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\Debugger.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -15,6 +15,7 @@ set(GLideN64_SOURCES
convert.cpp
CRC32.cpp
DebugDump.cpp
Debugger.cpp
DepthBuffer.cpp
DisplayWindow.cpp
F3D.cpp

1271
src/Debugger.cpp Normal file

File diff suppressed because it is too large Load Diff

187
src/Debugger.h Normal file
View File

@ -0,0 +1,187 @@
#ifndef DEBUGGER_H
#include <set>
#include <list>
#include <array>
#include <vector>
#include <memory>
#include "Graphics/Context.h"
#include "Graphics/Parameters.h"
#include "gSP.h"
#include "gDP.h"
#include "Textures.h"
enum TriangleType {
ttTriangle,
ttTexrect,
ttFillrect,
ttBackground
};
class Debugger
{
public:
Debugger();
~Debugger();
void checkDebugState();
void addTriangles(const graphics::Context::DrawTriangleParameters & _params);
void addRects(const graphics::Context::DrawRectParameters & _params);
bool isDebugMode() const { return m_bDebugMode; }
void draw();
private:
struct TexInfo {
f32 scales, scalet;
const CachedTexture * texture;
gDPLoadTileInfo texLoadInfo;
};
struct Vertex {
f32 x, y, z, w;
f32 r, g, b, a;
f32 s0, t0, s1, t1;
u32 modify;
Vertex() = default;
Vertex(const SPVertex & _v)
: x(_v.x)
, y(_v.y)
, z(_v.z)
, w(_v.w)
, r(_v.r)
, g(_v.g)
, b(_v.b)
, a(_v.a)
, s0(_v.s)
, t0(_v.t)
, modify(_v.modify)
{}
Vertex(const RectVertex & _v)
: x(_v.x)
, y(_v.y)
, z(_v.z)
, w(_v.w)
, s0(_v.s0)
, t0(_v.t0)
, s1(_v.s1)
, t1(_v.t1)
, modify(0)
{}
};
struct TriInfo {
std::array<Vertex, 3> vertices;
gDPCombine combine; // Combine mode at the time of rendering
u32 cycle_type;
gDPInfo::OtherMode otherMode;
u32 geometryMode; // geometry mode flags
u32 frameBufferAddress;
u32 tri_n; // Triangle number
TriangleType type; // 0-normal, 1-texrect, 2-fillrect
gSPInfo::Viewport viewport;
// texture info
std::array<std::unique_ptr<TexInfo>, 2> tex_info;
// colors
gDPInfo::Color fog_color;
gDPInfo::Color blend_color;
gDPInfo::Color env_color;
gDPInfo::FillColor fill_color;
gDPInfo::PrimColor prim_color;
f32 getScreenX(const Vertex & _v) const;
f32 getScreenY(const Vertex & _v) const;
f32 getScreenZ(const Vertex & _v) const;
f32 getModelX(const Vertex & _v) const;
f32 getModelY(const Vertex & _v) const;
f32 getModelZ(const Vertex & _v) const;
bool isInside(long x, long y) const;
};
enum class Page {
general,
tex1,
tex2,
colors,
blender,
othermode_l,
othermode_h,
texcoords,
coords,
texinfo
};
enum class TextureMode {
texture,
alpha,
both
};
void _fillTriInfo(TriInfo & _info);
void _addTriangles(const graphics::Context::DrawTriangleParameters & _params);
void _addTrianglesByElements(const graphics::Context::DrawTriangleParameters & _params);
void _debugKeys();
void _drawFrameBuffer(FrameBuffer * _pBuffer);
void _drawDebugInfo(FrameBuffer * _pBuffer);
void _setTextureCombiner();
void _setLineCombiner();
void _drawTextureFrame(const RectVertex * _rect);
void _drawTextureCache();
void _drawGeneral(f32 _ulx, f32 _uly, f32 _yShift);
void _drawTex(f32 _ulx, f32 _uly, f32 _yShift);
void _drawColors(f32 _ulx, f32 _uly, f32 _yShift);
void _drawBlender(f32 _ulx, f32 _uly, f32 _yShift);
void _drawOthermodeL(f32 _ulx, f32 _uly, f32 _yShift);
void _drawOthermodeH(f32 _ulx, f32 _uly, f32 _yShift);
void _drawTexCoords(f32 _ulx, f32 _uly, f32 _yShift);
void _drawVertexCoords(f32 _ulx, f32 _uly, f32 _yShift);
void _drawTexture(f32 _ulx, f32 _uly, f32 _lrx, f32 _lry, f32 _yShift);
void _drawTriangleFrame();
void _drawMouseCursor();
void _findSelected();
typedef std::list<TriInfo> Triangles;
typedef std::list<const TexInfo*> TexInfos;
typedef std::set<u32> FrameBufferAddrs;
Triangles m_triangles;
Triangles::const_iterator m_triSel;
const TexInfo * m_pCurTexInfo = nullptr;
TextureMode m_textureMode = TextureMode::both;
FrameBufferAddrs m_fbAddrs;
FrameBufferAddrs::const_iterator m_curFBAddr;
Page m_curPage = Page::general;
bool m_bDebugMode = false;
bool m_bCapture = false;
long m_clickX;
long m_clickY;
u32 m_tmu;
u32 m_startTexRow[2];
TexInfos m_texturesToDisplay[2];
struct {
u32 row, col;
} m_selectedTexPos[2];
const u32 m_cacheViewerRows = 4;
const u32 m_cacheViewerCols = 16;
};
extern Debugger g_debugger;
#endif // DEBUGGER_H

View File

@ -13,6 +13,7 @@
#include "Combiner.h"
#include "Types.h"
#include "Config.h"
#include "Debugger.h"
#include "DebugDump.h"
#include "PostProcessor.h"
#include "FrameBufferInfo.h"
@ -986,6 +987,11 @@ void FrameBufferList::renderBuffer()
if (VI.width == 0 || *REG.VI_WIDTH == 0 || *REG.VI_H_START == 0) // H width is zero. Don't draw
return;
if (g_debugger.isDebugMode()) {
g_debugger.draw();
return;
}
if (config.frameBufferEmulation.enable == 0) {
_renderScreenSizeBuffer();
return;

View File

@ -19,6 +19,7 @@
#include "DepthBuffer.h"
#include "FrameBufferInfo.h"
#include "Config.h"
#include "Debugger.h"
#include "RSP.h"
#include "RDP.h"
#include "VI.h"
@ -675,6 +676,7 @@ void GraphicsDrawer::drawTriangles()
triParams.elements = triangles.elements.data();
triParams.combiner = currentCombiner();
gfxContext.drawTriangles(triParams);
g_debugger.addTriangles(triParams);
if (config.frameBufferEmulation.enable != 0) {
const f32 maxY = renderTriangles(triangles.vertices.data(), triangles.elements.data(), triangles.num);
@ -715,6 +717,7 @@ void GraphicsDrawer::drawScreenSpaceTriangle(u32 _numVtx)
triParams.vertices = m_dmaVertices.data();
triParams.combiner = currentCombiner();
gfxContext.drawTriangles(triParams);
g_debugger.addTriangles(triParams);
frameBufferList().setBufferChanged(maxY);
gSP.changed |= CHANGED_GEOMETRYMODE;
@ -734,6 +737,7 @@ void GraphicsDrawer::drawDMATriangles(u32 _numVtx)
triParams.vertices = m_dmaVertices.data();
triParams.combiner = currentCombiner();
gfxContext.drawTriangles(triParams);
g_debugger.addTriangles(triParams);
if (config.frameBufferEmulation.enable != 0) {
const f32 maxY = renderTriangles(m_dmaVertices.data(), nullptr, _numVtx);
@ -908,6 +912,7 @@ void GraphicsDrawer::drawRect(int _ulx, int _uly, int _lrx, int _lry)
rectParams.vertices = m_rect;
rectParams.combiner = currentCombiner();
gfxContext.drawRects(rectParams);
g_debugger.addRects(rectParams);
gSP.changed |= CHANGED_GEOMETRYMODE | CHANGED_VIEWPORT;
}
@ -1248,6 +1253,7 @@ void GraphicsDrawer::drawTexturedRect(const TexturedRectParams & _params)
rectParams.vertices = m_rect;
rectParams.combiner = currentCombiner();
gfxContext.drawRects(rectParams);
g_debugger.addRects(rectParams);
gSP.changed |= CHANGED_GEOMETRYMODE | CHANGED_VIEWPORT;
}

View File

@ -11,6 +11,7 @@
#include "FrameBufferInfo.h"
#include "Config.h"
#include "Performance.h"
#include "Debugger.h"
#include "DebugDump.h"
#include "Keys.h"
#include "DisplayWindow.h"
@ -115,6 +116,7 @@ void VI_UpdateScreen()
if (wnd.resizeWindow())
return;
wnd.saveScreenshot();
g_debugger.checkDebugState();
if (isKeyPressed(G64_VK_G, 0x0001)) {
SwitchDump(DEBUG_LOW|DEBUG_NORMAL);

View File

@ -442,7 +442,9 @@ void gDPLoadTile(u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt)
info.texAddress = gDP.loadTile->imageAddress;
info.uls = gDP.loadTile->uls;
info.ult = gDP.loadTile->ult;
info.width = gDP.loadTile->masks != 0 ? (u16)min(width, 1U<<gDP.loadTile->masks) : (u16)width;
info.lrs = gDP.loadTile->lrs;
info.lrt = gDP.loadTile->lrt;
info.width = gDP.loadTile->masks != 0 ? (u16)min(width, 1U << gDP.loadTile->masks) : (u16)width;
info.height = gDP.loadTile->maskt != 0 ? (u16)min(height, 1U<<gDP.loadTile->maskt) : (u16)height;
info.texWidth = gDP.textureImage.width;
info.size = gDP.textureImage.size;
@ -556,6 +558,10 @@ void gDPLoadBlock(u32 tile, u32 uls, u32 ult, u32 lrs, u32 dxt)
gDPLoadTileInfo &info = gDP.loadInfo[gDP.loadTile->tmem];
info.texAddress = gDP.loadTile->imageAddress;
info.uls = gDP.loadTile->uls;
info.ult = gDP.loadTile->ult;
info.lrs = gDP.loadTile->lrs;
info.lrt = gDP.loadTile->lrt;
info.width = gDP.loadTile->lrs;
info.dxt = dxt;
info.size = gDP.textureImage.size;

View File

@ -101,6 +101,8 @@ struct gDPLoadTileInfo {
u8 loadType;
u16 uls;
u16 ult;
u16 lrs;
u16 lrt;
u16 width;
u16 height;
u16 texWidth;
@ -117,7 +119,7 @@ struct gDPScissor
struct gDPInfo
{
struct
struct OtherMode
{
union
{
@ -195,7 +197,7 @@ struct gDPInfo
f32 r, g, b, a;
} fogColor, blendColor, envColor, rectColor;
struct
struct FillColor
{
f32 z, dz;
u32 color;

View File

@ -99,7 +99,7 @@ struct gSPInfo
gDPTile *textureTile[2];
struct
struct Viewport
{
f32 vscale[4];
f32 vtrans[4];

View File

@ -2,3 +2,4 @@ SCRIPT_DIRECTORY=`dirname $0`
rev=\"`git rev-parse --short HEAD`\"
echo current revision $rev
echo "#define PLUGIN_REVISION $rev" > $SCRIPT_DIRECTORY/Revision.h
echo "#define PLUGIN_REVISION_W L$rev" >> $SCRIPT_DIRECTORY/Revision.h

View File

@ -25,6 +25,7 @@ MY_LOCAL_SRC_FILES := \
$(SRCDIR)/convert.cpp \
$(SRCDIR)/CRC_OPT.cpp \
$(SRCDIR)/DebugDump.cpp \
$(SRCDIR)/Debugger.cpp \
$(SRCDIR)/DepthBuffer.cpp \
$(SRCDIR)/DisplayWindow.cpp \
$(SRCDIR)/F3D.cpp \