aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-03-19 15:58:46 -0300
committerGitHub <noreply@github.com>2018-03-19 15:58:46 -0300
commit4314a8f3e5b76bbf2143f701c06e9354de712027 (patch)
treeacded3e24125e54bc791f322f0be869f1d379c19 /Ryujinx.Graphics
parent4940cf0ea58c77c8666d76abdfc35c6380efed4c (diff)
[WIP] Add support for events (#60)
* Add support for events, move concept of domains to IpcService * Support waiting for KThread, remove some test code, other tweaks * Use move handle on NIFM since I can't test that now, it's better to leave it how it was
Diffstat (limited to 'Ryujinx.Graphics')
-rw-r--r--Ryujinx.Graphics/Gpu/NsGpuPGraph.cs59
-rw-r--r--Ryujinx.Graphics/Gpu/NsGpuRegister.cs1
2 files changed, 45 insertions, 15 deletions
diff --git a/Ryujinx.Graphics/Gpu/NsGpuPGraph.cs b/Ryujinx.Graphics/Gpu/NsGpuPGraph.cs
index 6543b1d1..652f3e75 100644
--- a/Ryujinx.Graphics/Gpu/NsGpuPGraph.cs
+++ b/Ryujinx.Graphics/Gpu/NsGpuPGraph.cs
@@ -8,7 +8,7 @@ namespace Ryujinx.Graphics.Gpu
{
private NsGpu Gpu;
- private int[] Registers;
+ private uint[] Registers;
public NsGpuEngine[] SubChannels;
@@ -18,7 +18,7 @@ namespace Ryujinx.Graphics.Gpu
{
this.Gpu = Gpu;
- Registers = new int[0x1000];
+ Registers = new uint[0x1000];
SubChannels = new NsGpuEngine[8];
@@ -33,7 +33,7 @@ namespace Ryujinx.Graphics.Gpu
{
if (Entry.Arguments.Count == 1)
{
- SetRegister(Entry.Register, Entry.Arguments[0]);
+ SetRegister(Entry.Register, (uint)Entry.Arguments[0]);
}
switch (Entry.Register)
@@ -48,7 +48,7 @@ namespace Ryujinx.Graphics.Gpu
case NsGpuRegister._3dVertexArray0Fetch:
SendVertexBuffers(Memory);
break;
-
+
case NsGpuRegister._3dCbData0:
if (GetRegister(NsGpuRegister._3dCbPos) == 0x20)
{
@@ -62,6 +62,22 @@ namespace Ryujinx.Graphics.Gpu
case NsGpuRegister._3dQueryGet:
HasQuery = true;
break;
+
+ case NsGpuRegister._3dSetShader:
+ uint ShaderPrg = (uint)Entry.Arguments[0];
+ uint ShaderId = (uint)Entry.Arguments[1];
+ uint CodeAddr = (uint)Entry.Arguments[2];
+ uint ShaderType = (uint)Entry.Arguments[3];
+ uint CodeEnd = (uint)Entry.Arguments[4];
+
+ SendShader(
+ Memory,
+ ShaderPrg,
+ ShaderId,
+ CodeAddr,
+ ShaderType,
+ CodeEnd);
+ break;
}
}
@@ -71,10 +87,10 @@ namespace Ryujinx.Graphics.Gpu
(long)GetRegister(NsGpuRegister._3dQueryAddressHigh) << 32 |
(long)GetRegister(NsGpuRegister._3dQueryAddressLow) << 0;
- int Seq = GetRegister(NsGpuRegister._3dQuerySequence);
- int Get = GetRegister(NsGpuRegister._3dQueryGet);
+ uint Seq = GetRegister(NsGpuRegister._3dQuerySequence);
+ uint Get = GetRegister(NsGpuRegister._3dQueryGet);
- int Mode = Get & 3;
+ uint Mode = Get & 3;
if (Mode == 0)
{
@@ -85,7 +101,7 @@ namespace Ryujinx.Graphics.Gpu
{
Gpu.Renderer.QueueAction(delegate()
{
- Memory.WriteInt32(Position, Seq);
+ Memory.WriteUInt32(Position, Seq);
});
}
}
@@ -119,13 +135,13 @@ namespace Ryujinx.Graphics.Gpu
{
byte[] Buffer = AMemoryHelper.ReadBytes(Memory, Position, Size);
- int Stride = GetRegister(NsGpuRegister._3dVertexArray0Fetch) & 0xfff;
+ int Stride = (int)GetRegister(NsGpuRegister._3dVertexArray0Fetch) & 0xfff;
List<GalVertexAttrib> Attribs = new List<GalVertexAttrib>();
for (int Attr = 0; Attr < 16; Attr++)
{
- int Packed = GetRegister(NsGpuRegister._3dVertexAttrib0Format + Attr * 4);
+ int Packed = (int)GetRegister(NsGpuRegister._3dVertexAttrib0Format + Attr * 4);
GalVertexAttrib Attrib = new GalVertexAttrib(Attr,
(Packed >> 0) & 0x1f,
@@ -154,10 +170,10 @@ namespace Ryujinx.Graphics.Gpu
long TicPos = (long)GetRegister(NsGpuRegister._3dTicAddressHigh) << 32 |
(long)GetRegister(NsGpuRegister._3dTicAddressLow) << 0;
- int CbData = GetRegister(NsGpuRegister._3dCbData0);
+ uint CbData = GetRegister(NsGpuRegister._3dCbData0);
- int TicIndex = (CbData >> 0) & 0xfffff;
- int TscIndex = (CbData >> 20) & 0xfff; //I guess?
+ uint TicIndex = (CbData >> 0) & 0xfffff;
+ uint TscIndex = (CbData >> 20) & 0xfff; //I guess?
TicPos = Gpu.MemoryMgr.GetCpuAddr(TicPos + TicIndex * 0x20);
@@ -198,6 +214,19 @@ namespace Ryujinx.Graphics.Gpu
}
}
+ private void SendShader(
+ AMemory Memory,
+ uint ShaderPrg,
+ uint ShaderId,
+ uint CodeAddr,
+ uint ShaderType,
+ uint CodeEnd)
+ {
+ long CodePos = Gpu.MemoryMgr.GetCpuAddr(CodeAddr);
+
+ byte[] Data = AMemoryHelper.ReadBytes(Memory, CodePos, 0x300);
+ }
+
private static byte[] GetDecodedTexture(
AMemory Memory,
NsGpuTextureFormat Format,
@@ -263,12 +292,12 @@ namespace Ryujinx.Graphics.Gpu
return Data;
}
- public int GetRegister(NsGpuRegister Register)
+ public uint GetRegister(NsGpuRegister Register)
{
return Registers[((int)Register >> 2) & 0xfff];
}
- public void SetRegister(NsGpuRegister Register, int Value)
+ public void SetRegister(NsGpuRegister Register, uint Value)
{
Registers[((int)Register >> 2) & 0xfff] = Value;
}
diff --git a/Ryujinx.Graphics/Gpu/NsGpuRegister.cs b/Ryujinx.Graphics/Gpu/NsGpuRegister.cs
index 319e2c01..4642e68d 100644
--- a/Ryujinx.Graphics/Gpu/NsGpuRegister.cs
+++ b/Ryujinx.Graphics/Gpu/NsGpuRegister.cs
@@ -89,5 +89,6 @@ namespace Ryujinx.Graphics.Gpu
_3dCbData13 = 0x23c4,
_3dCbData14 = 0x23c8,
_3dCbData15 = 0x23cc,
+ _3dSetShader = 0x3890
}
} \ No newline at end of file