From 40b21cc3c4d2622bbd4f88d43073341854d9a671 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sun, 11 Jul 2021 17:20:40 -0300 Subject: Separate GPU engines (part 2/2) (#2440) * 3D engine now uses DeviceState too, plus new state modification tracking * Remove old methods code * Remove GpuState and friends * Optimize DeviceState, force inline some functions * This change was not supposed to go in * Proper channel initialization * Optimize state read/write methods even more * Fix debug build * Do not dirty state if the write is redundant * The YControl register should dirty either the viewport or front face state too, to update the host origin * Avoid redundant vertex buffer updates * Move state and get rid of the Ryujinx.Graphics.Gpu.State namespace * Comments and nits * Fix rebase * PR feedback * Move changed = false to improve codegen * PR feedback * Carry RyuJIT a bit more --- .../Engine/MethodUniformBufferUpdate.cs | 88 ---------------------- 1 file changed, 88 deletions(-) delete mode 100644 Ryujinx.Graphics.Gpu/Engine/MethodUniformBufferUpdate.cs (limited to 'Ryujinx.Graphics.Gpu/Engine/MethodUniformBufferUpdate.cs') diff --git a/Ryujinx.Graphics.Gpu/Engine/MethodUniformBufferUpdate.cs b/Ryujinx.Graphics.Gpu/Engine/MethodUniformBufferUpdate.cs deleted file mode 100644 index 49c8cda4..00000000 --- a/Ryujinx.Graphics.Gpu/Engine/MethodUniformBufferUpdate.cs +++ /dev/null @@ -1,88 +0,0 @@ -using Ryujinx.Graphics.Gpu.Memory; -using Ryujinx.Graphics.Gpu.State; -using System; -using System.Runtime.InteropServices; - -namespace Ryujinx.Graphics.Gpu.Engine -{ - partial class Methods - { - // State associated with direct uniform buffer updates. - // This state is used to attempt to batch together consecutive updates. - private ulong _ubBeginCpuAddress = 0; - private ulong _ubFollowUpAddress = 0; - private ulong _ubByteCount = 0; - - /// - /// Flushes any queued ubo updates. - /// - /// GPU memory manager where the uniform buffer is mapped - public void FlushUboDirty(MemoryManager memoryManager) - { - if (_ubFollowUpAddress != 0) - { - memoryManager.Physical.BufferCache.ForceDirty(memoryManager, _ubFollowUpAddress - _ubByteCount, _ubByteCount); - - _ubFollowUpAddress = 0; - } - } - - /// - /// Updates the uniform buffer data with inline data. - /// - /// Current GPU state - /// New uniform buffer data word - private void UniformBufferUpdate(GpuState state, int argument) - { - var uniformBuffer = state.Get(MethodOffset.UniformBufferState); - - ulong address = uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset; - - if (_ubFollowUpAddress != address) - { - FlushUboDirty(state.Channel.MemoryManager); - - _ubByteCount = 0; - _ubBeginCpuAddress = state.Channel.MemoryManager.Translate(address); - } - - var byteData = MemoryMarshal.Cast(MemoryMarshal.CreateSpan(ref argument, 1)); - state.Channel.MemoryManager.Physical.WriteUntracked(_ubBeginCpuAddress + _ubByteCount, byteData); - - _ubFollowUpAddress = address + 4; - _ubByteCount += 4; - - state.SetUniformBufferOffset(uniformBuffer.Offset + 4); - } - - /// - /// Updates the uniform buffer data with inline data. - /// - /// Current GPU state - /// Data to be written to the uniform buffer - public void UniformBufferUpdate(GpuState state, ReadOnlySpan data) - { - var uniformBuffer = state.Get(MethodOffset.UniformBufferState); - - ulong address = uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset; - - ulong size = (ulong)data.Length * 4; - - if (_ubFollowUpAddress != address) - { - FlushUboDirty(state.Channel.MemoryManager); - - _ubByteCount = 0; - _ubBeginCpuAddress = state.Channel.MemoryManager.Translate(address); - } - - var byteData = MemoryMarshal.Cast(data); - state.Channel.MemoryManager.Physical.WriteUntracked(_ubBeginCpuAddress + _ubByteCount, byteData); - - _ubFollowUpAddress = address + size; - _ubByteCount += size; - - state.SetUniformBufferOffset(uniformBuffer.Offset + data.Length * 4); - } - } -} \ No newline at end of file -- cgit v1.2.3