From 9a9349f0f4e3c6e80bacc782a8d4a4766f89ea74 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Fri, 10 Jun 2022 23:44:49 -0300 Subject: [PATCH] Fix instanced indexed inline draw index count (#3389) --- .../Engine/Threed/DrawManager.cs | 30 +++++++++---------- .../Engine/Threed/IbStreamer.cs | 5 ++++ 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Ryujinx.Graphics.Gpu/Engine/Threed/DrawManager.cs b/Ryujinx.Graphics.Gpu/Engine/Threed/DrawManager.cs index 7e35fd2de..ab3713141 100644 --- a/Ryujinx.Graphics.Gpu/Engine/Threed/DrawManager.cs +++ b/Ryujinx.Graphics.Gpu/Engine/Threed/DrawManager.cs @@ -135,14 +135,16 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed { _instancedDrawPending = true; + int ibCount = _drawState.IbStreamer.InlineIndexCount; + _instancedIndexed = _drawState.DrawIndexed; - _instancedIndexedInline = _drawState.IbStreamer.HasInlineIndexData; + _instancedIndexedInline = ibCount != 0; _instancedFirstIndex = firstIndex; _instancedFirstVertex = (int)_state.State.FirstVertex; _instancedFirstInstance = (int)_state.State.FirstInstance; - _instancedIndexCount = indexCount; + _instancedIndexCount = ibCount != 0 ? ibCount : indexCount; var drawState = _state.State.VertexBufferDrawState; @@ -453,22 +455,18 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed { _instancedDrawPending = false; - if (_instancedIndexedInline) - { - int inlineIndexCount = _drawState.IbStreamer.GetAndResetInlineIndexCount(); - BufferRange br = new BufferRange(_drawState.IbStreamer.GetInlineIndexBuffer(), 0, inlineIndexCount * 4); + bool indexedInline = _instancedIndexedInline; - _channel.BufferManager.SetIndexBuffer(br, IndexType.UInt); - - _context.Renderer.Pipeline.DrawIndexed( - inlineIndexCount, - _instanceIndex + 1, - _instancedFirstIndex, - _instancedFirstVertex, - _instancedFirstInstance); - } - else if (_instancedIndexed) + if (_instancedIndexed || indexedInline) { + 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( _instancedIndexCount, _instanceIndex + 1, diff --git a/Ryujinx.Graphics.Gpu/Engine/Threed/IbStreamer.cs b/Ryujinx.Graphics.Gpu/Engine/Threed/IbStreamer.cs index 96b2ed9c7..4862bca18 100644 --- a/Ryujinx.Graphics.Gpu/Engine/Threed/IbStreamer.cs +++ b/Ryujinx.Graphics.Gpu/Engine/Threed/IbStreamer.cs @@ -20,6 +20,11 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// public bool HasInlineIndexData => _inlineIndexCount != 0; + /// + /// Total numbers of indices that have been pushed. + /// + public int InlineIndexCount => _inlineIndexCount; + /// /// Gets the handle for the host buffer currently holding the inline index buffer data. ///