Add support for vertex base on indexed draws, fix index buffer first (untested) (#197)
This commit is contained in:
parent
3262fd13da
commit
3e81421b2f
3 changed files with 20 additions and 4 deletions
|
@ -28,6 +28,6 @@ namespace Ryujinx.Graphics.Gal
|
|||
|
||||
void DrawArrays(int First, int PrimCount, GalPrimitiveType PrimType);
|
||||
|
||||
void DrawElements(long IboKey, int First, GalPrimitiveType PrimType);
|
||||
void DrawElements(long IboKey, int First, int VertexBase, GalPrimitiveType PrimType);
|
||||
}
|
||||
}
|
|
@ -54,6 +54,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
private struct IbInfo
|
||||
{
|
||||
public int Count;
|
||||
public int ElemSizeLog2;
|
||||
|
||||
public DrawElementsType Type;
|
||||
}
|
||||
|
@ -206,6 +207,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
IndexBuffer.Type = OGLEnumConverter.GetDrawElementsType(Format);
|
||||
|
||||
IndexBuffer.Count = Size >> (int)Format;
|
||||
|
||||
IndexBuffer.ElemSizeLog2 = (int)Format;
|
||||
}
|
||||
|
||||
public void DrawArrays(int First, int PrimCount, GalPrimitiveType PrimType)
|
||||
|
@ -220,7 +223,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
GL.DrawArrays(OGLEnumConverter.GetPrimitiveType(PrimType), First, PrimCount);
|
||||
}
|
||||
|
||||
public void DrawElements(long IboKey, int First, GalPrimitiveType PrimType)
|
||||
public void DrawElements(long IboKey, int First, int VertexBase, GalPrimitiveType PrimType)
|
||||
{
|
||||
if (!IboCache.TryGetValue(IboKey, out int IboHandle))
|
||||
{
|
||||
|
@ -233,7 +236,18 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
|
||||
GL.BindBuffer(BufferTarget.ElementArrayBuffer, IboHandle);
|
||||
|
||||
GL.DrawElements(Mode, IndexBuffer.Count, IndexBuffer.Type, First);
|
||||
First <<= IndexBuffer.ElemSizeLog2;
|
||||
|
||||
if (VertexBase != 0)
|
||||
{
|
||||
IntPtr Indices = new IntPtr(First);
|
||||
|
||||
GL.DrawElementsBaseVertex(Mode, IndexBuffer.Count, IndexBuffer.Type, Indices, VertexBase);
|
||||
}
|
||||
else
|
||||
{
|
||||
GL.DrawElements(Mode, IndexBuffer.Count, IndexBuffer.Type, First);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -487,7 +487,9 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||
|
||||
if (IndexCount != 0)
|
||||
{
|
||||
Gpu.Renderer.Rasterizer.DrawElements(IndexPosition, IndexFirst, PrimType);
|
||||
int VertexBase = ReadRegister(NvGpuEngine3dReg.VertexArrayElemBase);
|
||||
|
||||
Gpu.Renderer.Rasterizer.DrawElements(IndexPosition, IndexFirst, VertexBase, PrimType);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Reference in a new issue