Extract helper method RunFilterChainSteps from UpdateSourceDrawingWork

This commit is contained in:
YoshiRulz 2021-05-28 18:24:07 +10:00 committed by James Groom
parent 9f7057f09d
commit af45671eb7
1 changed files with 32 additions and 45 deletions

View File

@ -1012,51 +1012,7 @@ namespace BizHawk.Client.EmuHawk
_currentFilterProgram.RenderTargetProvider = new DisplayManagerRenderTargetProvider(size => _shaderChainFrugalizers[rtCounter++].Get(size));
_gl.BeginScene();
// run filter chain
Texture2d texCurr = null;
RenderTarget rtCurr = null;
bool inFinalTarget = false;
foreach (var step in _currentFilterProgram.Program)
{
switch (step.Type)
{
case FilterProgram.ProgramStepType.Run:
{
int fi = (int)step.Args;
var f = _currentFilterProgram.Filters[fi];
f.SetInput(texCurr);
f.Run();
var orec = f.FindOutput();
if (orec != null)
{
if (orec.SurfaceDisposition == SurfaceDisposition.Texture)
{
texCurr = f.GetOutput();
rtCurr = null;
}
}
break;
}
case FilterProgram.ProgramStepType.NewTarget:
{
var size = (Size)step.Args;
rtCurr = _shaderChainFrugalizers[rtCounter++].Get(size);
rtCurr.Bind();
_currentFilterProgram.CurrRenderTarget = rtCurr;
break;
}
case FilterProgram.ProgramStepType.FinalTarget:
{
inFinalTarget = true;
rtCurr = null;
_currentFilterProgram.CurrRenderTarget = null;
_gl.BindRenderTarget(null);
break;
}
}
}
RunFilterChainSteps(ref rtCounter, out var rtCurr, out var inFinalTarget);
_gl.EndScene();
if (job.Offscreen)
@ -1081,6 +1037,37 @@ namespace BizHawk.Client.EmuHawk
// presentationPanel.GraphicsControl.End();
}
private void RunFilterChainSteps(ref int rtCounter, out RenderTarget rtCurr, out bool inFinalTarget)
{
Texture2d texCurr = null;
rtCurr = null;
inFinalTarget = false;
foreach (var step in _currentFilterProgram.Program) switch (step.Type)
{
case FilterProgram.ProgramStepType.Run:
var f = _currentFilterProgram.Filters[(int) step.Args];
f.SetInput(texCurr);
f.Run();
if (f.FindOutput() is { SurfaceDisposition: SurfaceDisposition.Texture })
{
texCurr = f.GetOutput();
rtCurr = null;
}
break;
case FilterProgram.ProgramStepType.NewTarget:
_currentFilterProgram.CurrRenderTarget = rtCurr = _shaderChainFrugalizers[rtCounter++].Get((Size) step.Args);
rtCurr.Bind();
break;
case FilterProgram.ProgramStepType.FinalTarget:
_currentFilterProgram.CurrRenderTarget = rtCurr = null;
_gl.BindRenderTarget(rtCurr);
inFinalTarget = true;
break;
default:
throw new Exception();
}
}
private void LoadCustomFont(Stream fontStream)
{
IntPtr data = Marshal.AllocCoTaskMem((int)fontStream.Length);