forked from Mirror/Ryujinx
Fix instanced indexed inline draw index count (#3389)
This commit is contained in:
parent
46cc7b55f0
commit
9a9349f0f4
2 changed files with 19 additions and 16 deletions
|
@ -135,14 +135,16 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||||
{
|
{
|
||||||
_instancedDrawPending = true;
|
_instancedDrawPending = true;
|
||||||
|
|
||||||
|
int ibCount = _drawState.IbStreamer.InlineIndexCount;
|
||||||
|
|
||||||
_instancedIndexed = _drawState.DrawIndexed;
|
_instancedIndexed = _drawState.DrawIndexed;
|
||||||
_instancedIndexedInline = _drawState.IbStreamer.HasInlineIndexData;
|
_instancedIndexedInline = ibCount != 0;
|
||||||
|
|
||||||
_instancedFirstIndex = firstIndex;
|
_instancedFirstIndex = firstIndex;
|
||||||
_instancedFirstVertex = (int)_state.State.FirstVertex;
|
_instancedFirstVertex = (int)_state.State.FirstVertex;
|
||||||
_instancedFirstInstance = (int)_state.State.FirstInstance;
|
_instancedFirstInstance = (int)_state.State.FirstInstance;
|
||||||
|
|
||||||
_instancedIndexCount = indexCount;
|
_instancedIndexCount = ibCount != 0 ? ibCount : indexCount;
|
||||||
|
|
||||||
var drawState = _state.State.VertexBufferDrawState;
|
var drawState = _state.State.VertexBufferDrawState;
|
||||||
|
|
||||||
|
@ -453,22 +455,18 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||||
{
|
{
|
||||||
_instancedDrawPending = false;
|
_instancedDrawPending = false;
|
||||||
|
|
||||||
if (_instancedIndexedInline)
|
bool indexedInline = _instancedIndexedInline;
|
||||||
{
|
|
||||||
int inlineIndexCount = _drawState.IbStreamer.GetAndResetInlineIndexCount();
|
|
||||||
BufferRange br = new BufferRange(_drawState.IbStreamer.GetInlineIndexBuffer(), 0, inlineIndexCount * 4);
|
|
||||||
|
|
||||||
_channel.BufferManager.SetIndexBuffer(br, IndexType.UInt);
|
if (_instancedIndexed || indexedInline)
|
||||||
|
|
||||||
_context.Renderer.Pipeline.DrawIndexed(
|
|
||||||
inlineIndexCount,
|
|
||||||
_instanceIndex + 1,
|
|
||||||
_instancedFirstIndex,
|
|
||||||
_instancedFirstVertex,
|
|
||||||
_instancedFirstInstance);
|
|
||||||
}
|
|
||||||
else if (_instancedIndexed)
|
|
||||||
{
|
{
|
||||||
|
if (indexedInline)
|
||||||
|
{
|
||||||
|
int inlineIndexCount = _drawState.IbStreamer.GetAndResetInlineIndexCount();
|
||||||
|
BufferRange br = new BufferRange(_drawState.IbStreamer.GetInlineIndexBuffer(), 0, inlineIndexCount * 4);
|
||||||
|
|
||||||
|
_channel.BufferManager.SetIndexBuffer(br, IndexType.UInt);
|
||||||
|
}
|
||||||
|
|
||||||
_context.Renderer.Pipeline.DrawIndexed(
|
_context.Renderer.Pipeline.DrawIndexed(
|
||||||
_instancedIndexCount,
|
_instancedIndexCount,
|
||||||
_instanceIndex + 1,
|
_instanceIndex + 1,
|
||||||
|
|
|
@ -20,6 +20,11 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool HasInlineIndexData => _inlineIndexCount != 0;
|
public bool HasInlineIndexData => _inlineIndexCount != 0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Total numbers of indices that have been pushed.
|
||||||
|
/// </summary>
|
||||||
|
public int InlineIndexCount => _inlineIndexCount;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the handle for the host buffer currently holding the inline index buffer data.
|
/// Gets the handle for the host buffer currently holding the inline index buffer data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in a new issue