Implement GPU primitive restart (#221)
This commit is contained in:
parent
dc04b5465f
commit
6479c3e484
@ -36,6 +36,12 @@ namespace Ryujinx.Graphics.Gal
|
|||||||
|
|
||||||
void SetClearStencil(int Stencil);
|
void SetClearStencil(int Stencil);
|
||||||
|
|
||||||
|
void EnablePrimitiveRestart();
|
||||||
|
|
||||||
|
void DisablePrimitiveRestart();
|
||||||
|
|
||||||
|
void SetPrimitiveRestartIndex(uint Index);
|
||||||
|
|
||||||
void CreateVbo(long Key, byte[] Buffer);
|
void CreateVbo(long Key, byte[] Buffer);
|
||||||
|
|
||||||
void CreateIbo(long Key, byte[] Buffer);
|
void CreateIbo(long Key, byte[] Buffer);
|
||||||
|
@ -184,6 +184,21 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||||||
GL.ClearStencil(Stencil);
|
GL.ClearStencil(Stencil);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void EnablePrimitiveRestart()
|
||||||
|
{
|
||||||
|
GL.Enable(EnableCap.PrimitiveRestart);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisablePrimitiveRestart()
|
||||||
|
{
|
||||||
|
GL.Disable(EnableCap.PrimitiveRestart);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetPrimitiveRestartIndex(uint Index)
|
||||||
|
{
|
||||||
|
GL.PrimitiveRestartIndex(Index);
|
||||||
|
}
|
||||||
|
|
||||||
public void CreateVbo(long Key, byte[] Buffer)
|
public void CreateVbo(long Key, byte[] Buffer)
|
||||||
{
|
{
|
||||||
int Handle = GL.GenBuffer();
|
int Handle = GL.GenBuffer();
|
||||||
|
@ -85,6 +85,7 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||||||
SetDepth();
|
SetDepth();
|
||||||
SetStencil();
|
SetStencil();
|
||||||
SetAlphaBlending();
|
SetAlphaBlending();
|
||||||
|
SetPrimitiveRestart();
|
||||||
|
|
||||||
UploadTextures(Vmm, Keys);
|
UploadTextures(Vmm, Keys);
|
||||||
UploadUniforms(Vmm);
|
UploadUniforms(Vmm);
|
||||||
@ -389,6 +390,29 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetPrimitiveRestart()
|
||||||
|
{
|
||||||
|
bool Enable = (ReadRegister(NvGpuEngine3dReg.PrimRestartEnable) & 1) != 0;
|
||||||
|
|
||||||
|
if (Enable)
|
||||||
|
{
|
||||||
|
Gpu.Renderer.Rasterizer.EnablePrimitiveRestart();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Gpu.Renderer.Rasterizer.DisablePrimitiveRestart();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Enable)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint Index = (uint)ReadRegister(NvGpuEngine3dReg.PrimRestartIndex);
|
||||||
|
|
||||||
|
Gpu.Renderer.Rasterizer.SetPrimitiveRestartIndex(Index);
|
||||||
|
}
|
||||||
|
|
||||||
private void UploadTextures(NvGpuVmm Vmm, long[] Keys)
|
private void UploadTextures(NvGpuVmm Vmm, long[] Keys)
|
||||||
{
|
{
|
||||||
long BaseShPosition = MakeInt64From2xInt32(NvGpuEngine3dReg.ShaderAddress);
|
long BaseShPosition = MakeInt64From2xInt32(NvGpuEngine3dReg.ShaderAddress);
|
||||||
|
@ -50,6 +50,8 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||||||
StencilBackFuncFunc = 0x569,
|
StencilBackFuncFunc = 0x569,
|
||||||
ShaderAddress = 0x582,
|
ShaderAddress = 0x582,
|
||||||
VertexBeginGl = 0x586,
|
VertexBeginGl = 0x586,
|
||||||
|
PrimRestartEnable = 0x591,
|
||||||
|
PrimRestartIndex = 0x592,
|
||||||
IndexArrayAddress = 0x5f2,
|
IndexArrayAddress = 0x5f2,
|
||||||
IndexArrayEndAddr = 0x5f4,
|
IndexArrayEndAddr = 0x5f4,
|
||||||
IndexArrayFormat = 0x5f6,
|
IndexArrayFormat = 0x5f6,
|
||||||
|
Loading…
Reference in New Issue
Block a user