Remove some unused code, add a bunch of workarounds

This commit is contained in:
gdkchan 2018-04-13 15:07:39 -03:00
parent ab6bf4ec65
commit ea0996c6aa
5 changed files with 101 additions and 53 deletions

View file

@ -276,35 +276,24 @@ namespace Ryujinx.Core.OsHle.Services.Android
return 0;
}
private unsafe void SendFrameBuffer(ServiceCtx Context, int Slot)
private void SendFrameBuffer(ServiceCtx Context, int Slot)
{
int FbWidth = BufferQueue[Slot].Data.Width;
int FbHeight = BufferQueue[Slot].Data.Height;
long FbSize = (uint)FbWidth * FbHeight * 4;
int FbWidth = 1280;
int FbHeight = 720;
NvMap Map = GetNvMap(Context, Slot);
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))
{
Address += MapFb.GetBufferOffset(Slot);
}
CpuAddr += MapFb.GetBufferOffset(Slot);
if ((ulong)(Address + FbSize) > AMemoryMgr.AddrSize)
{
Logging.Error($"Frame buffer address {Address:x16} is invalid!");
BufferQueue[Slot].State = BufferState.Free;
ReleaseEvent.Handle.Set();
WaitBufferFree.Set();
return;
//TODO: Enable once the frame buffers problems are fixed.
//GpuAddr += MapFb.GetBufferOffset(Slot);
}
BufferQueue[Slot].State = BufferState.Acquired;
@ -358,17 +347,21 @@ namespace Ryujinx.Core.OsHle.Services.Android
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
//bind the frame buffer texture, it's not necessary to read anything.
Renderer.SetFrameBuffer(Map.GpuAddress);
Renderer.SetFrameBuffer(GpuAddr);
}
else
{
//Frame buffer is not set on the GPU registers, in this case
//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);

View file

@ -40,6 +40,8 @@ namespace Ryujinx.Graphics.Gal
void SetFrameBuffer(byte[] Data, int Width, int Height);
void SetFrameBufferTransform(float SX, float SY, float Rotate, float TX, float TY);
//Rasterizer
void ClearBuffers(int RtIndex, GalClearBufferFlags Flags);

View file

@ -7,11 +7,24 @@ namespace Ryujinx.Graphics.Gal.OpenGL
{
class OGLFrameBuffer
{
private struct FrameBuffer
private class FrameBuffer
{
public int Handle;
public int RbHandle;
public int TexHandle;
public int Width { get; set; }
public int Height { get; set; }
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
@ -27,9 +40,13 @@ namespace Ryujinx.Graphics.Gal.OpenGL
private bool IsInitialized;
private int RawFbTexWidth;
private int RawFbTexHeight;
private int RawFbTexHandle;
private int CurrFbHandle;
private int CurrTexHandle;
private int RawFbTexHandle;
private int VaoHandle;
private int VboHandle;
@ -42,19 +59,21 @@ namespace Ryujinx.Graphics.Gal.OpenGL
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;
}
Width = 1280;
Height = 720;
FrameBuffer Fb = new FrameBuffer();
Fb.Handle = GL.GenFramebuffer();
Fb.RbHandle = GL.GenRenderbuffer();
Fb.TexHandle = GL.GenTexture();
Fb = new FrameBuffer(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)
{
EnsureInitialized();
if (RawFbTexHandle == 0)
{
RawFbTexHandle = GL.GenTexture();
}
if (RawFbTexWidth != Width ||
RawFbTexHeight != Height)
{
SetupTexture(RawFbTexHandle, Width, Height);
RawFbTexWidth = Width;
RawFbTexHeight = Height;
}
GL.ActiveTexture(TextureUnit.Texture0);
@ -128,6 +159,25 @@ namespace Ryujinx.Graphics.Gal.OpenGL
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()
{
if (CurrTexHandle != 0)
@ -163,10 +213,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
SetupShader();
SetupVertex();
RawFbTexHandle = GL.GenTexture();
SetupTexture(RawFbTexHandle, 1280, 720);
}
}
@ -190,7 +236,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
GL.LinkProgram(Shader.Handle);
GL.UseProgram(Shader.Handle);
Matrix2 Transform = Matrix2.CreateScale(1, -1);
Matrix2 Transform = Matrix2.Identity;
int TexUniformLocation = GL.GetUniformLocation(Shader.Handle, "tex");

View file

@ -1,3 +1,4 @@
using OpenTK;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@ -128,6 +129,18 @@ namespace Ryujinx.Graphics.Gal.OpenGL
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)
{
ActionsQueue.Enqueue(() => Rasterizer.ClearBuffers(RtIndex, Flags));

View file

@ -24,8 +24,6 @@ namespace Ryujinx.Graphics.Gpu
private HashSet<long> FrameBuffers;
private bool HasDataToRender;
public NvGpuEngine3d(NsGpu Gpu)
{
this.Gpu = Gpu;
@ -80,17 +78,10 @@ namespace Ryujinx.Graphics.Gpu
UploadTextures(Memory, Tags);
UploadUniforms(Memory);
UploadVertexArrays(Memory);
HasDataToRender = true;
}
private void ClearBuffers(AMemory Memory, NsGpuPBEntry PBEntry)
{
if (HasDataToRender)
{
HasDataToRender = false;
}
int Arg0 = PBEntry.Arguments[0];
int FbIndex = (Arg0 >> 6) & 0xf;
@ -101,6 +92,7 @@ namespace Ryujinx.Graphics.Gpu
SetFrameBuffer(0);
//TODO: Enable this once the frame buffer problems are fixed.
//Gpu.Renderer.ClearBuffers(Layer, Flags);
}
@ -113,7 +105,9 @@ namespace Ryujinx.Graphics.Gpu
int Width = ReadRegister(NvGpuEngine3dReg.FrameBufferNWidth + 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);
}
@ -405,7 +399,7 @@ namespace Ryujinx.Graphics.Gpu
if (Mode == 0)
{
//Write.
//Write mode.
Memory.WriteInt32(Position, Seq);
}
}