gsdx: Allow to save and restore drawing context

Purpose is to allow edition of the context for current draw call
This commit is contained in:
Gregory Hainaut 2019-02-15 14:29:34 +01:00 committed by lightningterror
parent 9c60541f3c
commit 6df9eb8dab
2 changed files with 59 additions and 1 deletions

View File

@ -58,6 +58,23 @@ public:
GSPixelOffset4* fzb4;
} offset;
struct
{
GIFRegXYOFFSET XYOFFSET;
GIFRegTEX0 TEX0;
GIFRegTEX1 TEX1;
GIFRegTEX2 TEX2;
GIFRegCLAMP CLAMP;
GIFRegMIPTBP1 MIPTBP1;
GIFRegMIPTBP2 MIPTBP2;
GIFRegSCISSOR SCISSOR;
GIFRegALPHA ALPHA;
GIFRegTEST TEST;
GIFRegFBA FBA;
GIFRegFRAME FRAME;
GIFRegZBUF ZBUF;
} stack;
GSDrawingContext()
{
memset(&offset, 0, sizeof(offset));
@ -125,7 +142,44 @@ public:
return ZBUF.ZMSK == 0 && TEST.ZTE != 0; // ZTE == 0 is bug on the real hardware, write is blocked then
}
GIFRegTEX0 GetSizeFixedTEX0(int s_n, const GSVector4& st, bool linear, bool mipmap);
GIFRegTEX0 GetSizeFixedTEX0(int s_n, const GSVector4& st, bool linear, bool mipmap = false);
void ComputeFixedTEX0(const GSVector4& st, bool linear);
// Save & Restore before/after draw allow to correct/optimize current register for current draw
// Note: we could avoid the restore part if all renderer code is updated to use a local copy instead
void SaveReg()
{
stack.XYOFFSET = XYOFFSET;
stack.TEX0 = TEX0;
stack.TEX1 = TEX1;
stack.TEX2 = TEX2;
stack.CLAMP = CLAMP;
stack.MIPTBP1 = MIPTBP1;
stack.MIPTBP2 = MIPTBP2;
stack.SCISSOR = SCISSOR;
stack.ALPHA = ALPHA;
stack.TEST = TEST;
stack.FBA = FBA;
stack.FRAME = FRAME;
stack.ZBUF = ZBUF;
}
void RestoreReg()
{
XYOFFSET = stack.XYOFFSET;
TEX0 = stack.TEX0;
TEX1 = stack.TEX1;
TEX2 = stack.TEX2;
CLAMP = stack.CLAMP;
MIPTBP1 = stack.MIPTBP1;
MIPTBP2 = stack.MIPTBP2;
SCISSOR = stack.SCISSOR;
ALPHA = stack.ALPHA;
TEST = stack.TEST;
FBA = stack.FBA;
FRAME = stack.FRAME;
ZBUF = stack.ZBUF;
}
void Dump(const std::string& filename)
{

View File

@ -1651,6 +1651,8 @@ void GSState::FlushPrim()
{
m_vt.Update(m_vertex.buff, m_index.buff, m_vertex.tail, m_index.tail, GSUtil::GetPrimClass(PRIM->PRIM));
m_context->SaveReg();
try {
Draw();
} catch (GSDXRecoverableError&) {
@ -1661,6 +1663,8 @@ void GSState::FlushPrim()
fprintf(stderr, "GSDX OUT OF MEMORY\n");
}
m_context->RestoreReg();
m_perfmon.Put(GSPerfMon::Draw, 1);
m_perfmon.Put(GSPerfMon::Prim, m_index.tail / GSUtil::GetVertexCount(PRIM->PRIM));
}