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 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
|
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);
|
||||||
|
|
||||||
|
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);
|
GL.DrawElements(Mode, IndexBuffer.Count, IndexBuffer.Type, First);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Reference in a new issue