mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 14:19:46 -06:00
VertexManager cleanup
This commit is contained in:
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user