diff options
author | gdkchan <gab.dark.100@gmail.com> | 2021-07-07 20:56:06 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-07 20:56:06 -0300 |
commit | 8b44eb1c981d7106be37107755c7c71c3c3c0ce4 (patch) | |
tree | 70c3a8d7286d827941c41dee2ec3cb3273c1e6d7 /Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs | |
parent | 31cbd09a75a9d5f4814c3907a060e0961eb2bb15 (diff) |
Separate GPU engines and make state follow official docs (part 1/2) (#2422)
* Use DeviceState for compute and i2m
* Migrate 2D class, more comments
* Migrate DMA copy engine
* Remove now unused code
* Replace GpuState by GpuAccessorState on GpuAcessor, since compute no longer has a GpuState
* More comments
* Add logging (disabled)
* Add back i2m on 3D engine
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 46a6ba98..e9df6bfb 100644 --- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -475,7 +475,8 @@ namespace Ryujinx.Graphics.Gpu.Shader /// <remarks> /// This automatically translates, compiles and adds the code to the cache if not present. /// </remarks> - /// <param name="state">Current GPU state</param> + /// <param name="channel">GPU channel</param> + /// <param name="gas">GPU accessor state</param> /// <param name="gpuVa">GPU virtual address of the binary shader code</param> /// <param name="localSizeX">Local group size X of the computer shader</param> /// <param name="localSizeY">Local group size Y of the computer shader</param> @@ -484,7 +485,8 @@ namespace Ryujinx.Graphics.Gpu.Shader /// <param name="sharedMemorySize">Shared memory size of the compute shader</param> /// <returns>Compiled compute shader code</returns> public ShaderBundle GetComputeShader( - GpuState state, + GpuChannel channel, + GpuAccessorState gas, ulong gpuVa, int localSizeX, int localSizeY, @@ -498,7 +500,7 @@ namespace Ryujinx.Graphics.Gpu.Shader { foreach (ShaderBundle cachedCpShader in list) { - if (IsShaderEqual(state.Channel.MemoryManager, cachedCpShader, gpuVa)) + if (IsShaderEqual(channel.MemoryManager, cachedCpShader, gpuVa)) { return cachedCpShader; } @@ -508,7 +510,8 @@ namespace Ryujinx.Graphics.Gpu.Shader TranslatorContext[] shaderContexts = new TranslatorContext[1]; shaderContexts[0] = DecodeComputeShader( - state, + channel, + gas, gpuVa, localSizeX, localSizeY, @@ -533,7 +536,7 @@ namespace Ryujinx.Graphics.Gpu.Shader isShaderCacheReadOnly = _cacheManager.IsReadOnly; // Compute hash and prepare data for shader disk cache comparison. - shaderCacheEntries = CacheHelper.CreateShaderCacheEntries(state.Channel.MemoryManager, shaderContexts); + shaderCacheEntries = CacheHelper.CreateShaderCacheEntries(channel.MemoryManager, shaderContexts); programCodeHash = CacheHelper.ComputeGuestHashFromCache(shaderCacheEntries); } @@ -548,7 +551,7 @@ namespace Ryujinx.Graphics.Gpu.Shader } // The shader isn't currently cached, translate it and compile it. - ShaderCodeHolder shader = TranslateShader(state.Channel.MemoryManager, shaderContexts[0]); + ShaderCodeHolder shader = TranslateShader(channel.MemoryManager, shaderContexts[0]); shader.HostShader = _context.Renderer.CompileShader(ShaderStage.Compute, shader.Program.Code); @@ -832,7 +835,8 @@ namespace Ryujinx.Graphics.Gpu.Shader /// <summary> /// Decode the binary Maxwell shader code to a translator context. /// </summary> - /// <param name="state">Current GPU state</param> + /// <param name="channel">GPU channel</param> + /// <param name="gas">GPU accessor state</param> /// <param name="gpuVa">GPU virtual address of the binary shader code</param> /// <param name="localSizeX">Local group size X of the computer shader</param> /// <param name="localSizeY">Local group size Y of the computer shader</param> @@ -841,7 +845,8 @@ namespace Ryujinx.Graphics.Gpu.Shader /// <param name="sharedMemorySize">Shared memory size of the compute shader</param> /// <returns>The generated translator context</returns> private TranslatorContext DecodeComputeShader( - GpuState state, + GpuChannel channel, + GpuAccessorState gas, ulong gpuVa, int localSizeX, int localSizeY, @@ -854,7 +859,7 @@ namespace Ryujinx.Graphics.Gpu.Shader return null; } - GpuAccessor gpuAccessor = new GpuAccessor(_context, state, localSizeX, localSizeY, localSizeZ, localMemorySize, sharedMemorySize); + GpuAccessor gpuAccessor = new GpuAccessor(_context, channel, gas, localSizeX, localSizeY, localSizeZ, localMemorySize, sharedMemorySize); var options = new TranslationOptions(TargetLanguage.Glsl, TargetApi.OpenGL, DefaultFlags | TranslationFlags.Compute); return Translator.CreateContext(gpuVa, gpuAccessor, options); @@ -884,7 +889,13 @@ namespace Ryujinx.Graphics.Gpu.Shader return null; } - GpuAccessor gpuAccessor = new GpuAccessor(_context, state, (int)stage - 1); + GpuAccessorState gas = new GpuAccessorState( + state.Get<PoolState>(MethodOffset.TexturePoolState).Address.Pack(), + state.Get<PoolState>(MethodOffset.TexturePoolState).MaximumId, + state.Get<int>(MethodOffset.TextureBufferIndex), + state.Get<Boolean32>(MethodOffset.EarlyZForce)); + + GpuAccessor gpuAccessor = new GpuAccessor(_context, state.Channel, gas, (int)stage - 1); var options = new TranslationOptions(TargetLanguage.Glsl, TargetApi.OpenGL, flags); return Translator.CreateContext(gpuVa, gpuAccessor, options, counts); |