GS: Improved SW renderer debug stats

This commit is contained in:
TellowKrinkle 2021-09-08 22:38:01 -05:00 committed by Kojin
parent e68fa34372
commit 8123cc27db
2 changed files with 28 additions and 17 deletions

View File

@ -19,6 +19,7 @@
#include "GS/GSCodeBuffer.h" #include "GS/GSCodeBuffer.h"
#include "GS/Renderers/SW/GSScanlineEnvironment.h" #include "GS/Renderers/SW/GSScanlineEnvironment.h"
#include "common/General.h"
#include <xbyak/xbyak_util.h> #include <xbyak/xbyak_util.h>
@ -28,12 +29,11 @@ class GSFunctionMap
protected: protected:
struct ActivePtr struct ActivePtr
{ {
uint64 frame, frames; uint64 frame, frames, prims;
uint64 ticks, actual, total; uint64 ticks, actual, total;
VALUE f; VALUE f;
}; };
std::unordered_map<KEY, VALUE> m_map;
std::unordered_map<KEY, ActivePtr*> m_map_active; std::unordered_map<KEY, ActivePtr*> m_map_active;
ActivePtr* m_active; ActivePtr* m_active;
@ -64,15 +64,13 @@ public:
} }
else else
{ {
auto i = m_map.find(key);
ActivePtr* p = new ActivePtr(); ActivePtr* p = new ActivePtr();
memset(p, 0, sizeof(*p)); memset(p, 0, sizeof(*p));
p->frame = (uint64)-1; p->frame = (uint64)-1;
p->f = i != m_map.end() ? i->second : GetDefaultFunction(key); p->f = GetDefaultFunction(key);
m_map_active[key] = p; m_map_active[key] = p;
@ -92,6 +90,7 @@ public:
m_active->frames++; m_active->frames++;
} }
m_active->prims++;
m_active->ticks += ticks; m_active->ticks += ticks;
m_active->actual += actual; m_active->actual += actual;
m_active->total += total; m_active->total += total;
@ -114,25 +113,36 @@ public:
} }
} }
uint64_t million = 1000 * 1000;
uint64_t billion = 1000 * million;
uint64_t tps = GetTickFrequency();
printf("GS stats\n"); printf("GS stats\n");
printf(" key | frames | prims | runtime | pixels\n");
printf(" | | #/f | pct µs/f ns/px | #/f #/prim overdraw\n");
for (const auto& i : m_map_active) for (const auto& i : m_map_active)
{ {
KEY key = i.first; KEY key = i.first;
ActivePtr* p = i.second; ActivePtr* p = i.second;
if (p->frames && ttpf) if (p->frames && p->actual && ttpf)
{ {
uint64 tpp = p->actual > 0 ? p->ticks / p->actual : 0; uint64 tpp = p->ticks / p->actual;
uint64 tpf = p->frames > 0 ? p->ticks / p->frames : 0; uint64 tpf = p->ticks / p->frames;
uint64 ppf = p->frames > 0 ? p->actual / p->frames : 0; uint64 ppf = p->actual / p->frames;
printf("[%014llx]%c %6.2f%% %5.2f%% f %4llu t %12llu p %12llu w %12lld tpp %4llu tpf %9llu ppf %9llu\n", printf("%014llx | %6llu | %5llu | %5.2f%% %6llu %4llu | %8llu %6llu %5.2f%%\n",
(uint64)key, m_map.find(key) == m_map.end() ? '*' : ' ', (uint64)key,
(float)(tpf * 10000 / 34000000) / 100, p->frames,
p->prims / p->frames,
(float)(tpf * 10000 / ttpf) / 100, (float)(tpf * 10000 / ttpf) / 100,
p->frames, p->ticks, p->actual, p->total - p->actual, (tpf * million) / tps,
tpp, tpf, ppf); (tpp * billion) / tps,
ppf,
p->actual / p->prims,
(float)((p->total - p->actual) * 10000 / p->total) / 100);
} }
} }
} }

View File

@ -17,6 +17,7 @@
#include "PrecompiledHeader.h" #include "PrecompiledHeader.h"
#include "GSRasterizer.h" #include "GSRasterizer.h"
#include "common/General.h"
int GSRasterizerData::s_counter = 0; int GSRasterizerData::s_counter = 0;
@ -138,7 +139,7 @@ void GSRasterizer::Draw(GSRasterizerData* data)
m_pixels.actual = 0; m_pixels.actual = 0;
m_pixels.total = 0; m_pixels.total = 0;
data->start = __rdtsc(); data->start = GetCPUTicks();
m_ds->BeginDraw(data); m_ds->BeginDraw(data);
@ -244,7 +245,7 @@ void GSRasterizer::Draw(GSRasterizerData* data)
data->pixels = m_pixels.actual; data->pixels = m_pixels.actual;
uint64 ticks = __rdtsc() - data->start; uint64 ticks = GetCPUTicks() - data->start;
m_pixels.sum += m_pixels.actual; m_pixels.sum += m_pixels.actual;
@ -1146,7 +1147,7 @@ void GSRasterizer::Flush(const GSVertexSW* vertex, const uint32* index, const GS
void GSRasterizer::DrawScanline(int pixels, int left, int top, const GSVertexSW& scan) void GSRasterizer::DrawScanline(int pixels, int left, int top, const GSVertexSW& scan)
{ {
m_pixels.actual += pixels; m_pixels.actual += pixels;
m_pixels.total += ((left + pixels + (PIXELS_PER_LOOP - 1)) & ~(PIXELS_PER_LOOP - 1)) - (left & (PIXELS_PER_LOOP - 1)); m_pixels.total += ((left + pixels + (PIXELS_PER_LOOP - 1)) & ~(PIXELS_PER_LOOP - 1)) - (left & ~(PIXELS_PER_LOOP - 1));
//m_pixels.total += ((left + pixels + (PIXELS_PER_LOOP - 1)) & ~(PIXELS_PER_LOOP - 1)) - left; //m_pixels.total += ((left + pixels + (PIXELS_PER_LOOP - 1)) & ~(PIXELS_PER_LOOP - 1)) - left;
ASSERT(m_pixels.actual <= m_pixels.total); ASSERT(m_pixels.actual <= m_pixels.total);