diff options
Diffstat (limited to 'Ryujinx.Graphics.Gpu/NvGpuFifo.cs')
| -rw-r--r-- | Ryujinx.Graphics.Gpu/NvGpuFifo.cs | 96 |
1 files changed, 45 insertions, 51 deletions
diff --git a/Ryujinx.Graphics.Gpu/NvGpuFifo.cs b/Ryujinx.Graphics.Gpu/NvGpuFifo.cs index 2056b3d4..5936fa53 100644 --- a/Ryujinx.Graphics.Gpu/NvGpuFifo.cs +++ b/Ryujinx.Graphics.Gpu/NvGpuFifo.cs @@ -123,6 +123,8 @@ namespace Ryujinx.Graphics.Gpu private SubChannel[] _subChannels; + private SubChannel _fifoChannel; + /// <summary> /// Creates a new instance of the GPU commands FIFO. /// </summary> @@ -135,76 +137,68 @@ namespace Ryujinx.Graphics.Gpu _mme = new int[MmeWords]; + _fifoChannel = new SubChannel(); + + _context.Methods.RegisterCallbacksForFifo(_fifoChannel.State); + _subChannels = new SubChannel[8]; for (int index = 0; index < _subChannels.Length; index++) { _subChannels[index] = new SubChannel(); - context.Methods.RegisterCallbacks(_subChannels[index].State); + _context.Methods.RegisterCallbacks(_subChannels[index].State); } } /// <summary> + /// Send macro code/data to the MME + /// </summary> + /// <param name="index">The index in the MME</param> + /// <param name="data">The data to use</param> + public void SendMacroCodeData(int index, int data) + { + _mme[index] = data; + } + + /// <summary> + /// Bind a macro index to a position for the MME + /// </summary> + /// <param name="index">The macro index</param> + /// <param name="position">The position of the macro</param> + public void BindMacro(int index, int position) + { + _macros[index] = new CachedMacro(position); + } + + /// <summary> + /// Change the shadow RAM setting + /// </summary> + /// <param name="shadowCtrl">The new Shadow RAM setting</param> + public void SetMmeShadowRamControl(ShadowRamControl shadowCtrl) + { + _shadowCtrl = shadowCtrl; + } + + /// <summary> /// Calls a GPU method. /// </summary> /// <param name="meth">GPU method call parameters</param> public void CallMethod(MethodParams meth) { - if ((NvGpuFifoMeth)meth.Method == NvGpuFifoMeth.BindChannel) + if ((MethodOffset)meth.Method == MethodOffset.BindChannel) { - _subChannels[meth.SubChannel].Class = (ClassId)meth.Argument; + _subChannels[meth.SubChannel] = new SubChannel + { + Class = (ClassId)meth.Argument + }; + + _context.Methods.RegisterCallbacks(_subChannels[meth.SubChannel].State); } else if (meth.Method < 0x60) { - switch ((NvGpuFifoMeth)meth.Method) - { - case NvGpuFifoMeth.WaitForIdle: - { - _context.Methods.PerformDeferredDraws(); - - _context.Renderer.Pipeline.Barrier(); - - break; - } - - case NvGpuFifoMeth.SetMacroUploadAddress: - { - _currMacroPosition = meth.Argument; - - break; - } - - case NvGpuFifoMeth.SendMacroCodeData: - { - _mme[_currMacroPosition++] = meth.Argument; - - break; - } - - case NvGpuFifoMeth.SetMacroBindingIndex: - { - _currMacroBindIndex = meth.Argument; - - break; - } - - case NvGpuFifoMeth.BindMacro: - { - int position = meth.Argument; - - _macros[_currMacroBindIndex++] = new CachedMacro(position); - - break; - } - - case NvGpuFifoMeth.SetMmeShadowRamControl: - { - _shadowCtrl = (ShadowRamControl)meth.Argument; - - break; - } - } + // TODO: check if macros are shared between subchannels or not. For now let's assume they are. + _fifoChannel.State.CallMethod(meth); } else if (meth.Method < 0xe00) { |
