Address feedback
This commit is contained in:
parent
68f47db918
commit
75d7f0b327
5 changed files with 42 additions and 40 deletions
|
@ -4,7 +4,9 @@ namespace Ryujinx.Graphics.Gal
|
|||
{
|
||||
public interface IGalShader
|
||||
{
|
||||
void Create(long Key, byte[] BinaryA, byte[] BinaryB, GalShaderType Type);
|
||||
void Create(long KeyA, long KeyB, byte[] BinaryA, byte[] BinaryB, GalShaderType Type);
|
||||
|
||||
bool TryGetSize(long Key, out long Size);
|
||||
|
||||
IEnumerable<ShaderDeclInfo> GetConstBufferUsage(long Key);
|
||||
IEnumerable<ShaderDeclInfo> GetTextureUsage(long Key);
|
||||
|
|
|
@ -19,6 +19,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
|
||||
private Dictionary<long, OGLShaderStage> TopStages;
|
||||
|
||||
private Dictionary<long, long> TopStageSizes;
|
||||
|
||||
private Dictionary<OGLShaderProgram, int> Programs;
|
||||
|
||||
public int CurrentProgramHandle { get; private set; }
|
||||
|
@ -35,15 +37,20 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
|
||||
TopStages = new Dictionary<long, OGLShaderStage>();
|
||||
|
||||
TopStageSizes = new Dictionary<long, long>();
|
||||
|
||||
Programs = new Dictionary<OGLShaderProgram, int>();
|
||||
}
|
||||
|
||||
public void Create(
|
||||
long Key,
|
||||
long KeyA,
|
||||
long KeyB,
|
||||
byte[] BinaryA,
|
||||
byte[] BinaryB,
|
||||
GalShaderType Type)
|
||||
{
|
||||
long Key = KeyB;
|
||||
|
||||
if (Stages.TryGetValue(Key, out List<OGLShaderStage> Cache))
|
||||
{
|
||||
OGLShaderStage CachedStage = Cache.Find((OGLShaderStage Stage) => Stage.EqualsBinary(BinaryA, BinaryB));
|
||||
|
@ -91,6 +98,25 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
Cache.Add(NewStage);
|
||||
|
||||
TopStages[Key] = NewStage;
|
||||
|
||||
if (BinaryA != null)
|
||||
{
|
||||
TopStageSizes[KeyA] = BinaryA.Length;
|
||||
}
|
||||
|
||||
TopStageSizes[KeyB] = BinaryB.Length;
|
||||
}
|
||||
|
||||
public bool TryGetSize(long Key, out long Size)
|
||||
{
|
||||
if (TopStageSizes.TryGetValue(Key, out Size))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Size = 0;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public IEnumerable<ShaderDeclInfo> GetConstBufferUsage(long Key)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.Graphics.Gal.Shader
|
||||
|
@ -138,7 +139,7 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
continue;
|
||||
}
|
||||
|
||||
long OpCode = ReadQWord(Binary, Position);
|
||||
long OpCode = BitConverter.ToInt64(Binary, (int)Position);
|
||||
|
||||
Position += 8;
|
||||
|
||||
|
@ -199,18 +200,5 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
return Op.Inst != ShaderIrInst.Exit &&
|
||||
Op.Inst != ShaderIrInst.Bra;
|
||||
}
|
||||
|
||||
private static unsafe long ReadQWord(byte[] Bytes, long Position)
|
||||
{
|
||||
if (Position >= Bytes.Length)
|
||||
{
|
||||
throw new System.InvalidOperationException();
|
||||
}
|
||||
|
||||
fixed (byte* Pointer = Bytes)
|
||||
{
|
||||
return *((long*)(Pointer + Position));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -61,11 +61,11 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
|
||||
public unsafe ShaderHeader(byte[] Binary)
|
||||
{
|
||||
uint CommonWord0 = ReadWord(Binary, 0);
|
||||
uint CommonWord1 = ReadWord(Binary, 4);
|
||||
uint CommonWord2 = ReadWord(Binary, 8);
|
||||
uint CommonWord3 = ReadWord(Binary, 12);
|
||||
uint CommonWord4 = ReadWord(Binary, 16);
|
||||
uint CommonWord0 = BitConverter.ToUInt32(Binary, 0);
|
||||
uint CommonWord1 = BitConverter.ToUInt32(Binary, 4);
|
||||
uint CommonWord2 = BitConverter.ToUInt32(Binary, 8);
|
||||
uint CommonWord3 = BitConverter.ToUInt32(Binary, 12);
|
||||
uint CommonWord4 = BitConverter.ToUInt32(Binary, 16);
|
||||
|
||||
SphType = ReadBits(CommonWord0, 0, 5);
|
||||
Version = ReadBits(CommonWord0, 5, 5);
|
||||
|
@ -92,8 +92,8 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
StoreReqEnd = ReadBits(CommonWord4, 24, 8);
|
||||
|
||||
//Type 2 (fragment?) reading
|
||||
uint Type2OmapTarget = ReadWord(Binary, 72);
|
||||
uint Type2Omap = ReadWord(Binary, 76);
|
||||
uint Type2OmapTarget = BitConverter.ToUInt32(Binary, 72);
|
||||
uint Type2Omap = BitConverter.ToUInt32(Binary, 76);
|
||||
|
||||
OmapTargets = new OmapTarget[8];
|
||||
|
||||
|
@ -136,14 +136,6 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
}
|
||||
}
|
||||
|
||||
private static unsafe uint ReadWord(byte[] Bytes, long Position)
|
||||
{
|
||||
fixed (byte* Pointer = Bytes)
|
||||
{
|
||||
return *((uint*)(Pointer + Position));
|
||||
}
|
||||
}
|
||||
|
||||
private static int ReadBits(uint Word, int Offset, int BitWidth)
|
||||
{
|
||||
uint Mask = (1u << BitWidth) - 1u;
|
||||
|
|
|
@ -29,8 +29,6 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||
|
||||
private int CurrentInstance = 0;
|
||||
|
||||
private Dictionary<long, long> ShadersSize;
|
||||
|
||||
public NvGpuEngine3d(NvGpu Gpu)
|
||||
{
|
||||
this.Gpu = Gpu;
|
||||
|
@ -70,8 +68,6 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||
{
|
||||
UploadedKeys[i] = new List<long>();
|
||||
}
|
||||
|
||||
ShadersSize = new Dictionary<long, long>();
|
||||
}
|
||||
|
||||
public void CallMethod(NvGpuVmm Vmm, NvGpuPBEntry PBEntry)
|
||||
|
@ -279,7 +275,7 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||
byte[] BinaryA = ReadShaderBinary(Vmm, VpAPos);
|
||||
byte[] BinaryB = ReadShaderBinary(Vmm, VpBPos);
|
||||
|
||||
Gpu.Renderer.Shader.Create(VpBPos, BinaryA, BinaryB, GalShaderType.Vertex);
|
||||
Gpu.Renderer.Shader.Create(VpAPos, VpBPos, BinaryA, BinaryB, GalShaderType.Vertex);
|
||||
}
|
||||
|
||||
Gpu.Renderer.Shader.Bind(VpBPos);
|
||||
|
@ -312,7 +308,7 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||
{
|
||||
byte[] Binary = ReadShaderBinary(Vmm, Key);
|
||||
|
||||
Gpu.Renderer.Shader.Create(Key, null, Binary, Type);
|
||||
Gpu.Renderer.Shader.Create(0, Key, null, Binary, Type);
|
||||
}
|
||||
|
||||
Gpu.Renderer.Shader.Bind(Key);
|
||||
|
@ -892,7 +888,7 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||
{
|
||||
long Address = Vmm.GetPhysicalAddress(Key);
|
||||
|
||||
if (ShadersSize.TryGetValue(Address, out long Size))
|
||||
if (Gpu.Renderer.Shader.TryGetSize(Address, out long Size))
|
||||
{
|
||||
if (!QueryKeyUpload(Vmm, Address, Size, NvGpuBufferType.Shader))
|
||||
{
|
||||
|
@ -909,8 +905,6 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||
|
||||
long Address = Vmm.GetPhysicalAddress(Key);
|
||||
|
||||
ShadersSize[Address] = Size;
|
||||
|
||||
return Vmm.ReadBytes(Key, Size);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue