Add support for vertex base on indexed draws, fix index buffer first (untested) (#197)

This commit is contained in:
gdkchan 2018-06-28 20:48:18 -03:00 committed by GitHub
parent 3262fd13da
commit 3e81421b2f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 4 deletions

View file

@ -28,6 +28,6 @@ namespace Ryujinx.Graphics.Gal
void DrawArrays(int First, int PrimCount, GalPrimitiveType PrimType); 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);
} }
} }

View file

@ -54,6 +54,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
private struct IbInfo private struct IbInfo
{ {
public int Count; public int Count;
public int ElemSizeLog2;
public DrawElementsType Type; public DrawElementsType Type;
} }
@ -206,6 +207,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
IndexBuffer.Type = OGLEnumConverter.GetDrawElementsType(Format); IndexBuffer.Type = OGLEnumConverter.GetDrawElementsType(Format);
IndexBuffer.Count = Size >> (int)Format; IndexBuffer.Count = Size >> (int)Format;
IndexBuffer.ElemSizeLog2 = (int)Format;
} }
public void DrawArrays(int First, int PrimCount, GalPrimitiveType PrimType) 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); 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)) if (!IboCache.TryGetValue(IboKey, out int IboHandle))
{ {
@ -233,7 +236,18 @@ namespace Ryujinx.Graphics.Gal.OpenGL
GL.BindBuffer(BufferTarget.ElementArrayBuffer, IboHandle); 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);
}
} }
} }
} }

View file

@ -487,7 +487,9 @@ namespace Ryujinx.HLE.Gpu.Engines
if (IndexCount != 0) if (IndexCount != 0)
{ {
Gpu.Renderer.Rasterizer.DrawElements(IndexPosition, IndexFirst, PrimType); int VertexBase = ReadRegister(NvGpuEngine3dReg.VertexArrayElemBase);
Gpu.Renderer.Rasterizer.DrawElements(IndexPosition, IndexFirst, VertexBase, PrimType);
} }
else else
{ {