diff --git a/GPU/Software/BinManager.cpp b/GPU/Software/BinManager.cpp index cdb07f8bc9..4d1233a617 100644 --- a/GPU/Software/BinManager.cpp +++ b/GPU/Software/BinManager.cpp @@ -18,6 +18,7 @@ #include #include #include +#include "Common/Profiler/Profiler.h" #include "Common/Thread/ThreadManager.h" #include "GPU/Software/BinManager.h" #include "GPU/Software/Rasterizer.h" @@ -133,6 +134,7 @@ BinManager::~BinManager() { } void BinManager::UpdateState() { + PROFILE_THIS_SCOPE("bin_state"); if (states_.Full()) Flush(); stateIndex_ = (int)states_.Push(RasterizerState()); @@ -175,6 +177,7 @@ void BinManager::UpdateState() { } void BinManager::UpdateClut(const void *src) { + PROFILE_THIS_SCOPE("bin_clut"); if (cluts_.Full()) Flush(); clutIndex_ = (int)cluts_.Push(BinClut()); @@ -249,6 +252,8 @@ void BinManager::AddPoint(const VertexData &v0) { } void BinManager::Drain() { + PROFILE_THIS_SCOPE("bin_drain"); + // If the waitable has fully drained, we can update our binning decisions. if (!tasksSplit_ || waitable_->Empty()) { int w2 = (queueRange_.x2 - queueRange_.x1 + 31) / 32; @@ -279,6 +284,7 @@ void BinManager::Drain() { } if (taskRanges_.size() <= 1) { + PROFILE_THIS_SCOPE("bin_drain_single"); while (!queue_.Empty()) { const BinItem &item = queue_.PeekNext(); DrawBinItem(item, states_[item.stateIndex]); diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 44401d8ba7..0ae17137fd 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -550,7 +550,7 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_SCISSOR2: for (int i = 0; i < 8; ++i) { // TODO: Narrow down the risk range, for now assuming 512x512 max texture. - drawEngine_->transformUnit.FlushIfOverlap(gstate.getTextureAddress(i), 4 * 512 * 512); + drawEngine_->transformUnit.FlushIfOverlap("scissor", gstate.getTextureAddress(i), 4 * 512 * 512); } break; @@ -559,13 +559,13 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_FRAMEBUFPTR: // We assume fb.data won't change while we're drawing. - drawEngine_->transformUnit.Flush(); + drawEngine_->transformUnit.Flush("framebuf"); fb.data = Memory::GetPointer(gstate.getFrameBufAddress()); break; case GE_CMD_FRAMEBUFWIDTH: // We assume fb.data won't change while we're drawing. - drawEngine_->transformUnit.Flush(); + drawEngine_->transformUnit.Flush("framebuf"); fb.data = Memory::GetPointer(gstate.getFrameBufAddress()); break; @@ -581,7 +581,7 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_TEXADDR6: case GE_CMD_TEXADDR7: // TODO: Narrow down the risk range, for now assuming 512x512 max texture. - drawEngine_->transformUnit.FlushIfOverlap(gstate.getTextureAddress(cmd - GE_CMD_TEXADDR0), 4 * 512 * 512); + drawEngine_->transformUnit.FlushIfOverlap("texaddr", gstate.getTextureAddress(cmd - GE_CMD_TEXADDR0), 4 * 512 * 512); break; case GE_CMD_TEXBUFWIDTH0: @@ -593,7 +593,7 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_TEXBUFWIDTH6: case GE_CMD_TEXBUFWIDTH7: // TODO: Narrow down the risk range, for now assuming 512x512 max texture. - drawEngine_->transformUnit.FlushIfOverlap(gstate.getTextureAddress(cmd - GE_CMD_TEXBUFWIDTH0), 4 * 512 * 512); + drawEngine_->transformUnit.FlushIfOverlap("texbufw", gstate.getTextureAddress(cmd - GE_CMD_TEXBUFWIDTH0), 4 * 512 * 512); break; case GE_CMD_CLUTADDR: @@ -606,7 +606,7 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { u32 clutTotalBytes = gstate.getClutLoadBytes(); // Might be copying drawing into the CLUT, so flush. - drawEngine_->transformUnit.FlushIfOverlap(clutAddr, clutTotalBytes); + drawEngine_->transformUnit.FlushIfOverlap("loadclut", clutAddr, clutTotalBytes); if (Memory::IsValidAddress(clutAddr)) { u32 validSize = Memory::ValidSize(clutAddr, clutTotalBytes); @@ -638,7 +638,7 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_TRANSFERSTART: { // Let's finish any drawing before we transfer. - drawEngine_->transformUnit.Flush(); + drawEngine_->transformUnit.Flush("blockxfer"); u32 srcBasePtr = gstate.getTransferSrcAddress(); u32 srcStride = gstate.getTransferSrcStride(); @@ -691,13 +691,13 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_ZBUFPTR: // We assume depthbuf.data won't change while we're drawing. - drawEngine_->transformUnit.Flush(); + drawEngine_->transformUnit.Flush("depthbuf"); depthbuf.data = Memory::GetPointer(gstate.getDepthBufAddress()); break; case GE_CMD_ZBUFWIDTH: // We assume depthbuf.data won't change while we're drawing. - drawEngine_->transformUnit.Flush(); + drawEngine_->transformUnit.Flush("depthbuf"); depthbuf.data = Memory::GetPointer(gstate.getDepthBufAddress()); break; @@ -893,7 +893,7 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { void SoftGPU::FinishDeferred() { // Need to flush before going back to CPU, so drawing is appropriately visible. - drawEngine_->transformUnit.Flush(); + drawEngine_->transformUnit.Flush("finish"); } void SoftGPU::GetStats(char *buffer, size_t bufsize) { diff --git a/GPU/Software/TransformUnit.cpp b/GPU/Software/TransformUnit.cpp index c628a3c853..5736f37ddd 100644 --- a/GPU/Software/TransformUnit.cpp +++ b/GPU/Software/TransformUnit.cpp @@ -608,12 +608,12 @@ void TransformUnit::SubmitPrimitive(void* vertices, void* indices, GEPrimitiveTy } } -void TransformUnit::Flush() { +void TransformUnit::Flush(const char *reason) { binner_->Flush(); GPUDebug::NotifyDraw(); } -void TransformUnit::FlushIfOverlap(uint32_t addr, uint32_t sz) { +void TransformUnit::FlushIfOverlap(const char *reason, uint32_t addr, uint32_t sz) { if (!Memory::IsVRAMAddress(addr)) return; addr &= 0x0FFFFFFF; @@ -626,9 +626,9 @@ void TransformUnit::FlushIfOverlap(uint32_t addr, uint32_t sz) { // TODO: Skip if the texture is between width and stride? if (addr < target + targetHeight * targetStride && addr + sz >= target) - Flush(); + Flush(reason); else if (addr < ztarget + targetHeight * ztargetStride && addr + sz >= ztarget) - Flush(); + Flush(reason); } void TransformUnit::NotifyClutUpdate(const void *src) { diff --git a/GPU/Software/TransformUnit.h b/GPU/Software/TransformUnit.h index fe8f757d9a..79bd8bfbd5 100644 --- a/GPU/Software/TransformUnit.h +++ b/GPU/Software/TransformUnit.h @@ -119,8 +119,8 @@ public: bool GetCurrentSimpleVertices(int count, std::vector &vertices, std::vector &indices); - void Flush(); - void FlushIfOverlap(uint32_t addr, uint32_t sz); + void Flush(const char *reason); + void FlushIfOverlap(const char *reason, uint32_t addr, uint32_t sz); void NotifyClutUpdate(const void *src); private: