Remove some unused code, add a bunch of workarounds
This commit is contained in:
parent
ab6bf4ec65
commit
ea0996c6aa
5 changed files with 101 additions and 53 deletions
|
@ -276,35 +276,24 @@ namespace Ryujinx.Core.OsHle.Services.Android
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private unsafe void SendFrameBuffer(ServiceCtx Context, int Slot)
|
private void SendFrameBuffer(ServiceCtx Context, int Slot)
|
||||||
{
|
{
|
||||||
int FbWidth = BufferQueue[Slot].Data.Width;
|
int FbWidth = 1280;
|
||||||
int FbHeight = BufferQueue[Slot].Data.Height;
|
int FbHeight = 720;
|
||||||
|
|
||||||
long FbSize = (uint)FbWidth * FbHeight * 4;
|
|
||||||
|
|
||||||
NvMap Map = GetNvMap(Context, Slot);
|
NvMap Map = GetNvMap(Context, Slot);
|
||||||
|
|
||||||
NvMapFb MapFb = (NvMapFb)INvDrvServices.NvMapsFb.GetData(Context.Process, 0);
|
NvMapFb MapFb = (NvMapFb)INvDrvServices.NvMapsFb.GetData(Context.Process, 0);
|
||||||
|
|
||||||
long Address = Map.CpuAddress;
|
long CpuAddr = Map.CpuAddress;
|
||||||
|
long GpuAddr = Map.GpuAddress;
|
||||||
|
|
||||||
if (MapFb.HasBufferOffset(Slot))
|
if (MapFb.HasBufferOffset(Slot))
|
||||||
{
|
{
|
||||||
Address += MapFb.GetBufferOffset(Slot);
|
CpuAddr += MapFb.GetBufferOffset(Slot);
|
||||||
}
|
|
||||||
|
|
||||||
if ((ulong)(Address + FbSize) > AMemoryMgr.AddrSize)
|
//TODO: Enable once the frame buffers problems are fixed.
|
||||||
{
|
//GpuAddr += MapFb.GetBufferOffset(Slot);
|
||||||
Logging.Error($"Frame buffer address {Address:x16} is invalid!");
|
|
||||||
|
|
||||||
BufferQueue[Slot].State = BufferState.Free;
|
|
||||||
|
|
||||||
ReleaseEvent.Handle.Set();
|
|
||||||
|
|
||||||
WaitBufferFree.Set();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferQueue[Slot].State = BufferState.Acquired;
|
BufferQueue[Slot].State = BufferState.Acquired;
|
||||||
|
@ -358,17 +347,21 @@ namespace Ryujinx.Core.OsHle.Services.Android
|
||||||
Rotate = -MathF.PI * 0.5f;
|
Rotate = -MathF.PI * 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Context.Ns.Gpu.Engine3d.IsFrameBufferPosition(Map.GpuAddress))
|
Renderer.SetFrameBufferTransform(ScaleX, ScaleY, Rotate, OffsX, OffsY);
|
||||||
|
|
||||||
|
//TODO: Support double buffering here aswell, it is broken for GPU
|
||||||
|
//frame buffers because it seems to be completely out of sync.
|
||||||
|
if (Context.Ns.Gpu.Engine3d.IsFrameBufferPosition(GpuAddr))
|
||||||
{
|
{
|
||||||
//Frame buffer is rendered to by the GPU, we can just
|
//Frame buffer is rendered to by the GPU, we can just
|
||||||
//bind the frame buffer texture, it's not necessary to read anything.
|
//bind the frame buffer texture, it's not necessary to read anything.
|
||||||
Renderer.SetFrameBuffer(Map.GpuAddress);
|
Renderer.SetFrameBuffer(GpuAddr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Frame buffer is not set on the GPU registers, in this case
|
//Frame buffer is not set on the GPU registers, in this case
|
||||||
//assume that the app is manually writing to it.
|
//assume that the app is manually writing to it.
|
||||||
Texture Texture = new Texture(Address, FbWidth, FbHeight);
|
Texture Texture = new Texture(CpuAddr, FbWidth, FbHeight);
|
||||||
|
|
||||||
byte[] Data = TextureReader.Read(Context.Memory, Texture);
|
byte[] Data = TextureReader.Read(Context.Memory, Texture);
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,8 @@ namespace Ryujinx.Graphics.Gal
|
||||||
|
|
||||||
void SetFrameBuffer(byte[] Data, int Width, int Height);
|
void SetFrameBuffer(byte[] Data, int Width, int Height);
|
||||||
|
|
||||||
|
void SetFrameBufferTransform(float SX, float SY, float Rotate, float TX, float TY);
|
||||||
|
|
||||||
//Rasterizer
|
//Rasterizer
|
||||||
void ClearBuffers(int RtIndex, GalClearBufferFlags Flags);
|
void ClearBuffers(int RtIndex, GalClearBufferFlags Flags);
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,24 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
{
|
{
|
||||||
class OGLFrameBuffer
|
class OGLFrameBuffer
|
||||||
{
|
{
|
||||||
private struct FrameBuffer
|
private class FrameBuffer
|
||||||
{
|
{
|
||||||
public int Handle;
|
public int Width { get; set; }
|
||||||
public int RbHandle;
|
public int Height { get; set; }
|
||||||
public int TexHandle;
|
|
||||||
|
public int Handle { get; private set; }
|
||||||
|
public int RbHandle { get; private set; }
|
||||||
|
public int TexHandle { get; private set; }
|
||||||
|
|
||||||
|
public FrameBuffer(int Width, int Height)
|
||||||
|
{
|
||||||
|
this.Width = Width;
|
||||||
|
this.Height = Height;
|
||||||
|
|
||||||
|
Handle = GL.GenFramebuffer();
|
||||||
|
RbHandle = GL.GenRenderbuffer();
|
||||||
|
TexHandle = GL.GenTexture();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private struct ShaderProgram
|
private struct ShaderProgram
|
||||||
|
@ -27,9 +40,13 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
|
|
||||||
private bool IsInitialized;
|
private bool IsInitialized;
|
||||||
|
|
||||||
|
private int RawFbTexWidth;
|
||||||
|
private int RawFbTexHeight;
|
||||||
|
private int RawFbTexHandle;
|
||||||
|
|
||||||
private int CurrFbHandle;
|
private int CurrFbHandle;
|
||||||
private int CurrTexHandle;
|
private int CurrTexHandle;
|
||||||
private int RawFbTexHandle;
|
|
||||||
private int VaoHandle;
|
private int VaoHandle;
|
||||||
private int VboHandle;
|
private int VboHandle;
|
||||||
|
|
||||||
|
@ -42,19 +59,21 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
|
|
||||||
public void Create(long Tag, int Width, int Height)
|
public void Create(long Tag, int Width, int Height)
|
||||||
{
|
{
|
||||||
if (Fbs.ContainsKey(Tag))
|
if (Fbs.TryGetValue(Tag, out FrameBuffer Fb))
|
||||||
{
|
{
|
||||||
|
if (Fb.Width != Width ||
|
||||||
|
Fb.Height != Height)
|
||||||
|
{
|
||||||
|
SetupTexture(Fb.TexHandle, Width, Height);
|
||||||
|
|
||||||
|
Fb.Width = Width;
|
||||||
|
Fb.Height = Height;
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Width = 1280;
|
Fb = new FrameBuffer(Width, Height);
|
||||||
Height = 720;
|
|
||||||
|
|
||||||
FrameBuffer Fb = new FrameBuffer();
|
|
||||||
|
|
||||||
Fb.Handle = GL.GenFramebuffer();
|
|
||||||
Fb.RbHandle = GL.GenRenderbuffer();
|
|
||||||
Fb.TexHandle = GL.GenTexture();
|
|
||||||
|
|
||||||
SetupTexture(Fb.TexHandle, Width, Height);
|
SetupTexture(Fb.TexHandle, Width, Height);
|
||||||
|
|
||||||
|
@ -115,7 +134,19 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
|
|
||||||
public void Set(byte[] Data, int Width, int Height)
|
public void Set(byte[] Data, int Width, int Height)
|
||||||
{
|
{
|
||||||
EnsureInitialized();
|
if (RawFbTexHandle == 0)
|
||||||
|
{
|
||||||
|
RawFbTexHandle = GL.GenTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RawFbTexWidth != Width ||
|
||||||
|
RawFbTexHeight != Height)
|
||||||
|
{
|
||||||
|
SetupTexture(RawFbTexHandle, Width, Height);
|
||||||
|
|
||||||
|
RawFbTexWidth = Width;
|
||||||
|
RawFbTexHeight = Height;
|
||||||
|
}
|
||||||
|
|
||||||
GL.ActiveTexture(TextureUnit.Texture0);
|
GL.ActiveTexture(TextureUnit.Texture0);
|
||||||
|
|
||||||
|
@ -128,6 +159,25 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
CurrTexHandle = RawFbTexHandle;
|
CurrTexHandle = RawFbTexHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetTransform(Matrix2 Transform, Vector2 Offs)
|
||||||
|
{
|
||||||
|
EnsureInitialized();
|
||||||
|
|
||||||
|
int CurrentProgram = GL.GetInteger(GetPName.CurrentProgram);
|
||||||
|
|
||||||
|
GL.UseProgram(Shader.Handle);
|
||||||
|
|
||||||
|
int TransformUniformLocation = GL.GetUniformLocation(Shader.Handle, "transform");
|
||||||
|
|
||||||
|
GL.UniformMatrix2(TransformUniformLocation, false, ref Transform);
|
||||||
|
|
||||||
|
int OffsetUniformLocation = GL.GetUniformLocation(Shader.Handle, "offset");
|
||||||
|
|
||||||
|
GL.Uniform2(OffsetUniformLocation, ref Offs);
|
||||||
|
|
||||||
|
GL.UseProgram(CurrentProgram);
|
||||||
|
}
|
||||||
|
|
||||||
public void Render()
|
public void Render()
|
||||||
{
|
{
|
||||||
if (CurrTexHandle != 0)
|
if (CurrTexHandle != 0)
|
||||||
|
@ -163,10 +213,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
|
|
||||||
SetupShader();
|
SetupShader();
|
||||||
SetupVertex();
|
SetupVertex();
|
||||||
|
|
||||||
RawFbTexHandle = GL.GenTexture();
|
|
||||||
|
|
||||||
SetupTexture(RawFbTexHandle, 1280, 720);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,7 +236,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
GL.LinkProgram(Shader.Handle);
|
GL.LinkProgram(Shader.Handle);
|
||||||
GL.UseProgram(Shader.Handle);
|
GL.UseProgram(Shader.Handle);
|
||||||
|
|
||||||
Matrix2 Transform = Matrix2.CreateScale(1, -1);
|
Matrix2 Transform = Matrix2.Identity;
|
||||||
|
|
||||||
int TexUniformLocation = GL.GetUniformLocation(Shader.Handle, "tex");
|
int TexUniformLocation = GL.GetUniformLocation(Shader.Handle, "tex");
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
using OpenTK;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
@ -128,6 +129,18 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
ActionsQueue.Enqueue(() => FrameBuffer.Set(Data, Width, Height));
|
ActionsQueue.Enqueue(() => FrameBuffer.Set(Data, Width, Height));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetFrameBufferTransform(float SX, float SY, float Rotate, float TX, float TY)
|
||||||
|
{
|
||||||
|
Matrix2 Transform;
|
||||||
|
|
||||||
|
Transform = Matrix2.CreateScale(SX, SY);
|
||||||
|
Transform *= Matrix2.CreateRotation(Rotate);
|
||||||
|
|
||||||
|
Vector2 Offs = new Vector2(TX, TY);
|
||||||
|
|
||||||
|
ActionsQueue.Enqueue(() => FrameBuffer.SetTransform(Transform, Offs));
|
||||||
|
}
|
||||||
|
|
||||||
public void ClearBuffers(int RtIndex, GalClearBufferFlags Flags)
|
public void ClearBuffers(int RtIndex, GalClearBufferFlags Flags)
|
||||||
{
|
{
|
||||||
ActionsQueue.Enqueue(() => Rasterizer.ClearBuffers(RtIndex, Flags));
|
ActionsQueue.Enqueue(() => Rasterizer.ClearBuffers(RtIndex, Flags));
|
||||||
|
|
|
@ -24,8 +24,6 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
|
|
||||||
private HashSet<long> FrameBuffers;
|
private HashSet<long> FrameBuffers;
|
||||||
|
|
||||||
private bool HasDataToRender;
|
|
||||||
|
|
||||||
public NvGpuEngine3d(NsGpu Gpu)
|
public NvGpuEngine3d(NsGpu Gpu)
|
||||||
{
|
{
|
||||||
this.Gpu = Gpu;
|
this.Gpu = Gpu;
|
||||||
|
@ -80,17 +78,10 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
UploadTextures(Memory, Tags);
|
UploadTextures(Memory, Tags);
|
||||||
UploadUniforms(Memory);
|
UploadUniforms(Memory);
|
||||||
UploadVertexArrays(Memory);
|
UploadVertexArrays(Memory);
|
||||||
|
|
||||||
HasDataToRender = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClearBuffers(AMemory Memory, NsGpuPBEntry PBEntry)
|
private void ClearBuffers(AMemory Memory, NsGpuPBEntry PBEntry)
|
||||||
{
|
{
|
||||||
if (HasDataToRender)
|
|
||||||
{
|
|
||||||
HasDataToRender = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Arg0 = PBEntry.Arguments[0];
|
int Arg0 = PBEntry.Arguments[0];
|
||||||
|
|
||||||
int FbIndex = (Arg0 >> 6) & 0xf;
|
int FbIndex = (Arg0 >> 6) & 0xf;
|
||||||
|
@ -101,6 +92,7 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
|
|
||||||
SetFrameBuffer(0);
|
SetFrameBuffer(0);
|
||||||
|
|
||||||
|
//TODO: Enable this once the frame buffer problems are fixed.
|
||||||
//Gpu.Renderer.ClearBuffers(Layer, Flags);
|
//Gpu.Renderer.ClearBuffers(Layer, Flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +105,9 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
int Width = ReadRegister(NvGpuEngine3dReg.FrameBufferNWidth + FbIndex * 0x10);
|
int Width = ReadRegister(NvGpuEngine3dReg.FrameBufferNWidth + FbIndex * 0x10);
|
||||||
int Height = ReadRegister(NvGpuEngine3dReg.FrameBufferNHeight + FbIndex * 0x10);
|
int Height = ReadRegister(NvGpuEngine3dReg.FrameBufferNHeight + FbIndex * 0x10);
|
||||||
|
|
||||||
Gpu.Renderer.CreateFrameBuffer(Address, Width, Height);
|
//Note: Using the Width/Height results seems to give incorrect results.
|
||||||
|
//Maybe the size of all frame buffers is hardcoded to screen size? This seems unlikely.
|
||||||
|
Gpu.Renderer.CreateFrameBuffer(Address, 1280, 720);
|
||||||
Gpu.Renderer.BindFrameBuffer(Address);
|
Gpu.Renderer.BindFrameBuffer(Address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,7 +399,7 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
|
|
||||||
if (Mode == 0)
|
if (Mode == 0)
|
||||||
{
|
{
|
||||||
//Write.
|
//Write mode.
|
||||||
Memory.WriteInt32(Position, Seq);
|
Memory.WriteInt32(Position, Seq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue