Support instanced draw of quads" (#881)

This commit is contained in:
gdkchan 2020-01-12 19:14:50 -03:00 committed by jduncanator
parent 2bb39ff03e
commit 8b90924c1e

View File

@ -170,26 +170,35 @@ namespace Ryujinx.Graphics.OpenGL
int firstVertex, int firstVertex,
int firstInstance) int firstInstance)
{ {
// TODO: Instanced rendering.
int quadsCount = (vertexCount - 2) / 2; int quadsCount = (vertexCount - 2) / 2;
int[] firsts = new int[quadsCount]; if (firstInstance != 0 || instanceCount != 1)
int[] counts = new int[quadsCount];
firsts[0] = firstVertex;
counts[0] = 4;
for (int quadIndex = 1; quadIndex < quadsCount; quadIndex++)
{ {
firsts[quadIndex] = firstVertex + quadIndex * 2; for (int quadIndex = 0; quadIndex < quadsCount; quadIndex++)
counts[quadIndex] = 4; {
GL.DrawArraysInstancedBaseInstance(PrimitiveType.TriangleFan, firstVertex + quadIndex * 2, 4, instanceCount, firstInstance);
}
} }
else
{
int[] firsts = new int[quadsCount];
int[] counts = new int[quadsCount];
GL.MultiDrawArrays( firsts[0] = firstVertex;
PrimitiveType.TriangleFan, counts[0] = 4;
firsts,
counts, for (int quadIndex = 1; quadIndex < quadsCount; quadIndex++)
quadsCount); {
firsts[quadIndex] = firstVertex + quadIndex * 2;
counts[quadIndex] = 4;
}
GL.MultiDrawArrays(
PrimitiveType.TriangleFan,
firsts,
counts,
quadsCount);
}
} }
private void DrawImpl( private void DrawImpl(
@ -282,31 +291,75 @@ namespace Ryujinx.Graphics.OpenGL
int firstVertex, int firstVertex,
int firstInstance) int firstInstance)
{ {
// TODO: Instanced rendering.
int quadsCount = indexCount / 4; int quadsCount = indexCount / 4;
IntPtr[] indices = new IntPtr[quadsCount]; if (firstInstance != 0 || instanceCount != 1)
int[] counts = new int[quadsCount];
int[] baseVertices = new int[quadsCount];
for (int quadIndex = 0; quadIndex < quadsCount; quadIndex++)
{ {
indices[quadIndex] = indexBaseOffset + quadIndex * 4 * indexElemSize; if (firstVertex != 0 && firstInstance != 0)
{
counts[quadIndex] = 4; for (int quadIndex = 0; quadIndex < quadsCount; quadIndex++)
{
baseVertices[quadIndex] = firstVertex; GL.DrawElementsInstancedBaseVertexBaseInstance(
PrimitiveType.TriangleFan,
4,
_elementsType,
indexBaseOffset + quadIndex * 4 * indexElemSize,
instanceCount,
firstVertex,
firstInstance);
}
}
else if (firstInstance != 0)
{
for (int quadIndex = 0; quadIndex < quadsCount; quadIndex++)
{
GL.DrawElementsInstancedBaseInstance(
PrimitiveType.TriangleFan,
4,
_elementsType,
indexBaseOffset + quadIndex * 4 * indexElemSize,
instanceCount,
firstInstance);
}
}
else
{
for (int quadIndex = 0; quadIndex < quadsCount; quadIndex++)
{
GL.DrawElementsInstanced(
PrimitiveType.TriangleFan,
4,
_elementsType,
indexBaseOffset + quadIndex * 4 * indexElemSize,
instanceCount);
}
}
} }
else
{
IntPtr[] indices = new IntPtr[quadsCount];
GL.MultiDrawElementsBaseVertex( int[] counts = new int[quadsCount];
PrimitiveType.TriangleFan,
counts, int[] baseVertices = new int[quadsCount];
_elementsType,
indices, for (int quadIndex = 0; quadIndex < quadsCount; quadIndex++)
quadsCount, {
baseVertices); indices[quadIndex] = indexBaseOffset + quadIndex * 4 * indexElemSize;
counts[quadIndex] = 4;
baseVertices[quadIndex] = firstVertex;
}
GL.MultiDrawElementsBaseVertex(
PrimitiveType.TriangleFan,
counts,
_elementsType,
indices,
quadsCount,
baseVertices);
}
} }
private void DrawQuadStripIndexedImpl( private void DrawQuadStripIndexedImpl(