VertexManager cleanup

This commit is contained in:
Jordan Woyak
2013-02-22 01:41:52 -06:00
parent 21bd5be753
commit db1be085c2
6 changed files with 54 additions and 82 deletions

View File

@ -571,8 +571,9 @@ void VertexLoader::RunVertices(int vtx_attr_group, int primitive, int count)
"Increase MAXVBUFFERSIZE or we need primitive breaking afterall."); "Increase MAXVBUFFERSIZE or we need primitive breaking afterall.");
} }
VertexManager::AddVertices(primitive, count);
ConvertVertices(count); ConvertVertices(count);
VertexManager::AddVertices(primitive, count);
//VertexManager::Flush();
} }

View File

@ -12,25 +12,17 @@
#include "BPStructs.h" #include "BPStructs.h"
#include "VertexManagerBase.h" #include "VertexManagerBase.h"
#include "MainBase.h"
#include "VideoConfig.h" #include "VideoConfig.h"
VertexManager *g_vertex_manager; VertexManager *g_vertex_manager;
u8 *VertexManager::s_pBaseBufferPointer;
u8 *VertexManager::s_pCurBufferPointer; u8 *VertexManager::s_pCurBufferPointer;
u8 *VertexManager::s_pBaseBufferPointer;
u8 *VertexManager::s_pEndBufferPointer; u8 *VertexManager::s_pEndBufferPointer;
u8 *VertexManager::LocalVBuffer;
u16 *VertexManager::TIBuffer;
u16 *VertexManager::LIBuffer;
u16 *VertexManager::PIBuffer;
bool VertexManager::Flushed;
VertexManager::VertexManager() VertexManager::VertexManager()
{ {
Flushed = false;
LocalVBuffer = new u8[MAXVBUFFERSIZE]; LocalVBuffer = new u8[MAXVBUFFERSIZE];
s_pCurBufferPointer = s_pBaseBufferPointer = LocalVBuffer; s_pCurBufferPointer = s_pBaseBufferPointer = LocalVBuffer;
s_pEndBufferPointer = s_pBaseBufferPointer + MAXVBUFFERSIZE; s_pEndBufferPointer = s_pBaseBufferPointer + MAXVBUFFERSIZE;
@ -39,12 +31,7 @@ VertexManager::VertexManager()
LIBuffer = new u16[MAXIBUFFERSIZE]; LIBuffer = new u16[MAXIBUFFERSIZE];
PIBuffer = new u16[MAXIBUFFERSIZE]; PIBuffer = new u16[MAXIBUFFERSIZE];
IndexGenerator::Start(TIBuffer, LIBuffer, PIBuffer); ResetBuffer();
}
void VertexManager::ResetBuffer()
{
s_pCurBufferPointer = s_pBaseBufferPointer;
} }
VertexManager::~VertexManager() VertexManager::~VertexManager()
@ -59,12 +46,25 @@ VertexManager::~VertexManager()
ResetBuffer(); ResetBuffer();
} }
void VertexManager::ResetBuffer()
{
s_pCurBufferPointer = s_pBaseBufferPointer;
IndexGenerator::Start(TIBuffer, LIBuffer, PIBuffer);
}
int VertexManager::GetRemainingSize() int VertexManager::GetRemainingSize()
{ {
return (int)(s_pEndBufferPointer - s_pCurBufferPointer); return (int)(s_pEndBufferPointer - s_pCurBufferPointer);
} }
bool VertexManager::IsFlushed() const
{
return s_pBaseBufferPointer == s_pCurBufferPointer;
}
// Not used anywhere // Not used anywhere
// TODO: use this
#if 0
int VertexManager::GetRemainingVertices(int primitive) int VertexManager::GetRemainingVertices(int primitive)
{ {
switch (primitive) switch (primitive)
@ -90,42 +90,38 @@ int VertexManager::GetRemainingVertices(int primitive)
break; break;
} }
} }
#endif
void VertexManager::AddVertices(int primitive, u32 numVertices) void VertexManager::AddVertices(int primitive, u32 numVertices)
{ {
if (numVertices <= 0) if (numVertices <= 0)
return; return;
if (Flushed)
{
IndexGenerator::Start(TIBuffer, LIBuffer, PIBuffer);
Flushed = false;
}
ADDSTAT(stats.thisFrame.numPrims, numVertices); ADDSTAT(stats.thisFrame.numPrims, numVertices);
INCSTAT(stats.thisFrame.numPrimitiveJoins); INCSTAT(stats.thisFrame.numPrimitiveJoins);
IndexGenerator::AddIndices(primitive, numVertices); IndexGenerator::AddIndices(primitive, numVertices);
} }
void VertexManager::Flush() void VertexManager::Flush()
{ {
if (g_vertex_manager->IsFlushed())
return;
// loading a state will invalidate BP, so check for it // loading a state will invalidate BP, so check for it
g_video_backend->CheckInvalidState(); g_video_backend->CheckInvalidState();
VideoFifo_CheckEFBAccess();
g_vertex_manager->vFlush(); g_vertex_manager->vFlush();
g_vertex_manager->ResetBuffer();
} }
// TODO: need to merge more stuff into VideoCommon to use this // TODO: need to merge more stuff into VideoCommon to use this
#if (0) #if (0)
void VertexManager::Flush() void VertexManager::Flush()
{ {
if (s_pBaseBufferPointer == s_pCurBufferPointer || Flushed)
return;
Flushed = true;
VideoFifo_CheckEFBAccess();
#if defined(_DEBUG) || defined(DEBUGFAST) #if defined(_DEBUG) || defined(DEBUGFAST)
PRIM_LOG("frame%d:\n texgen=%d, numchan=%d, dualtex=%d, ztex=%d, cole=%d, alpe=%d, ze=%d", g_ActiveConfig.iSaveTargetId, xfregs.numTexGens, PRIM_LOG("frame%d:\n texgen=%d, numchan=%d, dualtex=%d, ztex=%d, cole=%d, alpe=%d, ze=%d", g_ActiveConfig.iSaveTargetId, xfregs.numTexGens,
xfregs.nNumChans, (int)xfregs.bEnableDualTexTransform, bpmem.ztex2.op, xfregs.nNumChans, (int)xfregs.bEnableDualTexTransform, bpmem.ztex2.op,
@ -198,9 +194,9 @@ void VertexManager::Flush()
// finally bind // finally bind
if (false == PixelShaderCache::SetShader(false, g_nativeVertexFmt->m_components)) if (false == PixelShaderCache::SetShader(false, g_nativeVertexFmt->m_components))
goto shader_fail; return;
if (false == VertexShaderCache::SetShader(g_nativeVertexFmt->m_components)) if (false == VertexShaderCache::SetShader(g_nativeVertexFmt->m_components))
goto shader_fail; return;
const int stride = g_nativeVertexFmt->GetVertexStride(); const int stride = g_nativeVertexFmt->GetVertexStride();
//if (g_nativeVertexFmt) //if (g_nativeVertexFmt)
@ -212,7 +208,7 @@ void VertexManager::Flush()
if (false == g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate) if (false == g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate)
{ {
if (false == PixelShaderCache::SetShader(true, g_nativeVertexFmt->m_components)) if (false == PixelShaderCache::SetShader(true, g_nativeVertexFmt->m_components))
goto shader_fail; return;
g_vertex_manager->Draw(stride, true); g_vertex_manager->Draw(stride, true);
} }
@ -246,9 +242,6 @@ void VertexManager::Flush()
} }
#endif #endif
++g_Config.iSaveTargetId; ++g_Config.iSaveTargetId;
shader_fail:
ResetBuffer();
} }
#endif #endif
@ -259,12 +252,9 @@ void VertexManager::DoState(PointerWrap& p)
void VertexManager::DoStateShared(PointerWrap& p) void VertexManager::DoStateShared(PointerWrap& p)
{ {
p.DoPointer(s_pCurBufferPointer, LocalVBuffer); p.DoPointer(s_pCurBufferPointer, g_vertex_manager->LocalVBuffer);
p.DoArray(LocalVBuffer, MAXVBUFFERSIZE); p.DoArray(LocalVBuffer, MAXVBUFFERSIZE);
p.DoArray(TIBuffer, MAXIBUFFERSIZE); p.DoArray(g_vertex_manager->TIBuffer, MAXIBUFFERSIZE);
p.DoArray(LIBuffer, MAXIBUFFERSIZE); p.DoArray(g_vertex_manager->LIBuffer, MAXIBUFFERSIZE);
p.DoArray(PIBuffer, MAXIBUFFERSIZE); p.DoArray(g_vertex_manager->PIBuffer, MAXIBUFFERSIZE);
if (p.GetMode() == PointerWrap::MODE_READ)
Flushed = false;
} }

View File

@ -32,46 +32,47 @@ public:
static void AddVertices(int _primitive, u32 _numVertices); static void AddVertices(int _primitive, u32 _numVertices);
// TODO: protected?
static u8 *s_pBaseBufferPointer;
static u8 *s_pCurBufferPointer; static u8 *s_pCurBufferPointer;
static u8 *s_pBaseBufferPointer;
static u8 *s_pEndBufferPointer; static u8 *s_pEndBufferPointer;
static int GetRemainingSize(); static int GetRemainingSize();
static int GetRemainingVertices(int primitive);
//int GetRemainingVertices(int primitive);
static void Flush(); static void Flush();
virtual ::NativeVertexFormat* CreateNativeVertexFormat() = 0; virtual ::NativeVertexFormat* CreateNativeVertexFormat() = 0;
static u16* GetTriangleIndexBuffer() { return TIBuffer; } // TODO: use these instead of TIBuffer, etc
static u16* GetLineIndexBuffer() { return LIBuffer; }
static u16* GetPointIndexBuffer() { return PIBuffer; } // u16* GetTriangleIndexBuffer() { return TIBuffer; }
static u8* GetVertexBuffer() { return s_pBaseBufferPointer; } // u16* GetLineIndexBuffer() { return LIBuffer; }
// u16* GetPointIndexBuffer() { return PIBuffer; }
// u8* GetVertexBuffer() { return s_pBaseBufferPointer; }
static void DoState(PointerWrap& p); static void DoState(PointerWrap& p);
virtual void CreateDeviceObjects(){}; virtual void CreateDeviceObjects(){};
virtual void DestroyDeviceObjects(){}; virtual void DestroyDeviceObjects(){};
protected: protected:
// TODO: make private after Flush() is merged u16* TIBuffer;
static void ResetBuffer(); u16* LIBuffer;
u16* PIBuffer;
static u16 *TIBuffer;
static u16 *LIBuffer;
static u16 *PIBuffer;
static bool Flushed;
virtual void vDoState(PointerWrap& p) { DoStateShared(p); } virtual void vDoState(PointerWrap& p) { DoStateShared(p); }
void DoStateShared(PointerWrap& p); void DoStateShared(PointerWrap& p);
private: private:
bool IsFlushed() const;
void ResetBuffer();
//virtual void Draw(u32 stride, bool alphapass) = 0; //virtual void Draw(u32 stride, bool alphapass) = 0;
// temp // temp
virtual void vFlush() = 0; virtual void vFlush() = 0;
static u8 *LocalVBuffer; u8* LocalVBuffer;
}; };
extern VertexManager *g_vertex_manager; extern VertexManager *g_vertex_manager;

View File

@ -211,11 +211,6 @@ void VertexManager::Draw(UINT stride)
void VertexManager::vFlush() void VertexManager::vFlush()
{ {
if (s_pBaseBufferPointer == s_pCurBufferPointer) return;
if (Flushed) return;
Flushed=true;
VideoFifo_CheckEFBAccess();
u32 usedtextures = 0; u32 usedtextures = 0;
for (u32 i = 0; i < (u32)bpmem.genMode.numtevstages + 1; ++i) for (u32 i = 0; i < (u32)bpmem.genMode.numtevstages + 1; ++i)
if (bpmem.tevorders[i / 2].getEnable(i & 1)) if (bpmem.tevorders[i / 2].getEnable(i & 1))
@ -263,12 +258,12 @@ void VertexManager::vFlush()
g_nativeVertexFmt->m_components)) g_nativeVertexFmt->m_components))
{ {
GFX_DEBUGGER_PAUSE_LOG_AT(NEXT_ERROR,true,{printf("Fail to set pixel shader\n");}); GFX_DEBUGGER_PAUSE_LOG_AT(NEXT_ERROR,true,{printf("Fail to set pixel shader\n");});
goto shader_fail; return;
} }
if (!VertexShaderCache::SetShader(g_nativeVertexFmt->m_components)) if (!VertexShaderCache::SetShader(g_nativeVertexFmt->m_components))
{ {
GFX_DEBUGGER_PAUSE_LOG_AT(NEXT_ERROR,true,{printf("Fail to set pixel shader\n");}); GFX_DEBUGGER_PAUSE_LOG_AT(NEXT_ERROR,true,{printf("Fail to set pixel shader\n");});
goto shader_fail; return;
} }
LoadBuffers(); LoadBuffers();
unsigned int stride = g_nativeVertexFmt->GetVertexStride(); unsigned int stride = g_nativeVertexFmt->GetVertexStride();
@ -280,9 +275,6 @@ void VertexManager::vFlush()
GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true); GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true);
g_renderer->RestoreState(); g_renderer->RestoreState();
shader_fail:
ResetBuffer();
} }
} // namespace } // namespace

View File

@ -307,11 +307,6 @@ void VertexManager::DrawVA(int stride)
void VertexManager::vFlush() void VertexManager::vFlush()
{ {
if (s_pBaseBufferPointer == s_pCurBufferPointer) return;
if (Flushed) return;
Flushed = true;
VideoFifo_CheckEFBAccess();
u32 usedtextures = 0; u32 usedtextures = 0;
for (u32 i = 0; i < (u32)bpmem.genMode.numtevstages + 1; ++i) for (u32 i = 0; i < (u32)bpmem.genMode.numtevstages + 1; ++i)
if (bpmem.tevorders[i / 2].getEnable(i & 1)) if (bpmem.tevorders[i / 2].getEnable(i & 1))
@ -388,7 +383,6 @@ shader_fail:
CurrentIBufferIndex += IndexGenerator::GetTriangleindexLen() + IndexGenerator::GetLineindexLen() + IndexGenerator::GetPointindexLen(); CurrentIBufferIndex += IndexGenerator::GetTriangleindexLen() + IndexGenerator::GetLineindexLen() + IndexGenerator::GetPointindexLen();
CurrentVBufferIndex += IndexGenerator::GetNumVerts() * stride; CurrentVBufferIndex += IndexGenerator::GetNumVerts() * stride;
} }
ResetBuffer();
} }
} }

View File

@ -100,10 +100,6 @@ void VertexManager::Draw()
void VertexManager::vFlush() void VertexManager::vFlush()
{ {
if (s_pBaseBufferPointer == s_pCurBufferPointer) return;
if (Flushed) return;
Flushed=true;
VideoFifo_CheckEFBAccess();
#if defined(_DEBUG) || defined(DEBUGFAST) #if defined(_DEBUG) || defined(DEBUGFAST)
PRIM_LOG("frame%d:\n texgen=%d, numchan=%d, dualtex=%d, ztex=%d, cole=%d, alpe=%d, ze=%d", g_ActiveConfig.iSaveTargetId, xfregs.numTexGen.numTexGens, PRIM_LOG("frame%d:\n texgen=%d, numchan=%d, dualtex=%d, ztex=%d, cole=%d, alpe=%d, ze=%d", g_ActiveConfig.iSaveTargetId, xfregs.numTexGen.numTexGens,
xfregs.numChan.numColorChans, xfregs.dualTexTrans.enabled, bpmem.ztex2.op, xfregs.numChan.numColorChans, xfregs.dualTexTrans.enabled, bpmem.ztex2.op,
@ -240,8 +236,6 @@ void VertexManager::vFlush()
GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true); GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true);
//s_nCurVBOIndex = (s_nCurVBOIndex + 1) % ARRAYSIZE(s_vboBuffers); //s_nCurVBOIndex = (s_nCurVBOIndex + 1) % ARRAYSIZE(s_vboBuffers);
s_pCurBufferPointer = s_pBaseBufferPointer;
IndexGenerator::Start(TIBuffer,LIBuffer,PIBuffer);
#if defined(_DEBUG) || defined(DEBUGFAST) #if defined(_DEBUG) || defined(DEBUGFAST)
if (g_ActiveConfig.iLog & CONF_SAVESHADERS) if (g_ActiveConfig.iLog & CONF_SAVESHADERS)