aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2018-08-10 01:09:40 -0300
committergdkchan <gab.dark.100@gmail.com>2018-08-10 01:09:40 -0300
commit25dd5f4238d898120f2f65c4d5d5b9c192ce1e10 (patch)
tree347a58054594d9236fd9c3fa1432e0ee45b99949 /Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs
parent652238f526509ed54e1c0ba2e953097ef7b2501c (diff)
Low level graphics API prerequisites (#319)
* Add GalPipelineState and IGalPipeline * Separate UploadVertex call * Add ConstBuffer cache * Move Vertex Assembly into GalPipelineState * Move Uniform binds to GalPipelineState * Move framebuffer flip into a buffer * Rebase * Fix regression * Move clear values from VertexEndGl to ClearBuffers * Rename obscure names O->Old S->New
Diffstat (limited to 'Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs')
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs213
1 files changed, 16 insertions, 197 deletions
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs
index c5166b51..08021478 100644
--- a/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs
+++ b/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs
@@ -6,46 +6,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
{
public class OGLRasterizer : IGalRasterizer
{
- private static Dictionary<GalVertexAttribSize, int> AttribElements =
- new Dictionary<GalVertexAttribSize, int>()
- {
- { GalVertexAttribSize._32_32_32_32, 4 },
- { GalVertexAttribSize._32_32_32, 3 },
- { GalVertexAttribSize._16_16_16_16, 4 },
- { GalVertexAttribSize._32_32, 2 },
- { GalVertexAttribSize._16_16_16, 3 },
- { GalVertexAttribSize._8_8_8_8, 4 },
- { GalVertexAttribSize._16_16, 2 },
- { GalVertexAttribSize._32, 1 },
- { GalVertexAttribSize._8_8_8, 3 },
- { GalVertexAttribSize._8_8, 2 },
- { GalVertexAttribSize._16, 1 },
- { GalVertexAttribSize._8, 1 },
- { GalVertexAttribSize._10_10_10_2, 4 },
- { GalVertexAttribSize._11_11_10, 3 }
- };
-
- private static Dictionary<GalVertexAttribSize, VertexAttribPointerType> AttribTypes =
- new Dictionary<GalVertexAttribSize, VertexAttribPointerType>()
- {
- { GalVertexAttribSize._32_32_32_32, VertexAttribPointerType.Int },
- { GalVertexAttribSize._32_32_32, VertexAttribPointerType.Int },
- { GalVertexAttribSize._16_16_16_16, VertexAttribPointerType.Short },
- { GalVertexAttribSize._32_32, VertexAttribPointerType.Int },
- { GalVertexAttribSize._16_16_16, VertexAttribPointerType.Short },
- { GalVertexAttribSize._8_8_8_8, VertexAttribPointerType.Byte },
- { GalVertexAttribSize._16_16, VertexAttribPointerType.Short },
- { GalVertexAttribSize._32, VertexAttribPointerType.Int },
- { GalVertexAttribSize._8_8_8, VertexAttribPointerType.Byte },
- { GalVertexAttribSize._8_8, VertexAttribPointerType.Byte },
- { GalVertexAttribSize._16, VertexAttribPointerType.Short },
- { GalVertexAttribSize._8, VertexAttribPointerType.Byte },
- { GalVertexAttribSize._10_10_10_2, VertexAttribPointerType.Int }, //?
- { GalVertexAttribSize._11_11_10, VertexAttribPointerType.Int } //?
- };
-
- private int VaoHandle;
-
private int[] VertexBuffers;
private OGLCachedResource<int> VboCache;
@@ -83,7 +43,11 @@ namespace Ryujinx.Graphics.Gal.OpenGL
IboCache.Unlock();
}
- public void ClearBuffers(GalClearBufferFlags Flags)
+ public void ClearBuffers(
+ GalClearBufferFlags Flags,
+ float Red, float Green, float Blue, float Alpha,
+ float Depth,
+ int Stencil)
{
ClearBufferMask Mask = ClearBufferMask.ColorBufferBit;
@@ -103,6 +67,12 @@ namespace Ryujinx.Graphics.Gal.OpenGL
Mask |= ClearBufferMask.StencilBufferBit;
}
+ GL.ClearColor(Red, Green, Blue, Alpha);
+
+ GL.ClearDepth(Depth);
+
+ GL.ClearStencil(Stencil);
+
GL.Clear(Mask);
GL.ColorMask(true, true, true, true);
@@ -118,99 +88,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
return IboCache.TryGetSize(Key, out long Size) && Size == DataSize;
}
- public void SetFrontFace(GalFrontFace FrontFace)
- {
- GL.FrontFace(OGLEnumConverter.GetFrontFace(FrontFace));
- }
-
- public void EnableCullFace()
- {
- GL.Enable(EnableCap.CullFace);
- }
-
- public void DisableCullFace()
- {
- GL.Disable(EnableCap.CullFace);
- }
-
- public void SetCullFace(GalCullFace CullFace)
- {
- GL.CullFace(OGLEnumConverter.GetCullFace(CullFace));
- }
-
- public void EnableDepthTest()
- {
- GL.Enable(EnableCap.DepthTest);
- }
-
- public void DisableDepthTest()
- {
- GL.Disable(EnableCap.DepthTest);
- }
-
- public void SetDepthFunction(GalComparisonOp Func)
- {
- GL.DepthFunc(OGLEnumConverter.GetDepthFunc(Func));
- }
-
- public void SetClearDepth(float Depth)
- {
- GL.ClearDepth(Depth);
- }
-
- public void EnableStencilTest()
- {
- GL.Enable(EnableCap.StencilTest);
- }
-
- public void DisableStencilTest()
- {
- GL.Disable(EnableCap.StencilTest);
- }
-
- public void SetStencilFunction(bool IsFrontFace, GalComparisonOp Func, int Ref, int Mask)
- {
- GL.StencilFuncSeparate(
- IsFrontFace ? StencilFace.Front : StencilFace.Back,
- OGLEnumConverter.GetStencilFunc(Func),
- Ref,
- Mask);
- }
-
- public void SetStencilOp(bool IsFrontFace, GalStencilOp Fail, GalStencilOp ZFail, GalStencilOp ZPass)
- {
- GL.StencilOpSeparate(
- IsFrontFace ? StencilFace.Front : StencilFace.Back,
- OGLEnumConverter.GetStencilOp(Fail),
- OGLEnumConverter.GetStencilOp(ZFail),
- OGLEnumConverter.GetStencilOp(ZPass));
- }
-
- public void SetStencilMask(bool IsFrontFace, int Mask)
- {
- GL.StencilMaskSeparate(IsFrontFace ? StencilFace.Front : StencilFace.Back, Mask);
- }
-
- public void SetClearStencil(int Stencil)
- {
- GL.ClearStencil(Stencil);
- }
-
- public void EnablePrimitiveRestart()
- {
- GL.Enable(EnableCap.PrimitiveRestart);
- }
-
- public void DisablePrimitiveRestart()
- {
- GL.Disable(EnableCap.PrimitiveRestart);
- }
-
- public void SetPrimitiveRestartIndex(uint Index)
- {
- GL.PrimitiveRestartIndex(Index);
- }
-
public void CreateVbo(long Key, int DataSize, IntPtr HostAddress)
{
int Handle = GL.GenBuffer();
@@ -235,65 +112,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
GL.BufferData(BufferTarget.ElementArrayBuffer, Length, HostAddress, BufferUsageHint.StreamDraw);
}
- public void SetVertexArray(int Stride, long VboKey, GalVertexAttrib[] Attribs)
- {
- if (!VboCache.TryGetValue(VboKey, out int VboHandle))
- {
- return;
- }
-
- if (VaoHandle == 0)
- {
- VaoHandle = GL.GenVertexArray();
- }
-
- GL.BindVertexArray(VaoHandle);
-
- foreach (GalVertexAttrib Attrib in Attribs)
- {
- GL.EnableVertexAttribArray(Attrib.Index);
-
- GL.BindBuffer(BufferTarget.ArrayBuffer, VboHandle);
-
- bool Unsigned =
- Attrib.Type == GalVertexAttribType.Unorm ||
- Attrib.Type == GalVertexAttribType.Uint ||
- Attrib.Type == GalVertexAttribType.Uscaled;
-
- bool Normalize =
- Attrib.Type == GalVertexAttribType.Snorm ||
- Attrib.Type == GalVertexAttribType.Unorm;
-
- VertexAttribPointerType Type = 0;
-
- if (Attrib.Type == GalVertexAttribType.Float)
- {
- Type = VertexAttribPointerType.Float;
- }
- else
- {
- Type = AttribTypes[Attrib.Size] + (Unsigned ? 1 : 0);
- }
-
- int Size = AttribElements[Attrib.Size];
- int Offset = Attrib.Offset;
-
- if (Attrib.Type == GalVertexAttribType.Sint ||
- Attrib.Type == GalVertexAttribType.Uint)
- {
- IntPtr Pointer = new IntPtr(Offset);
-
- VertexAttribIntegerType IType = (VertexAttribIntegerType)Type;
-
- GL.VertexAttribIPointer(Attrib.Index, Size, IType, Stride, Pointer);
- }
- else
- {
- GL.VertexAttribPointer(Attrib.Index, Size, Type, Normalize, Stride, Offset);
- }
- }
- }
-
public void SetIndexArray(int Size, GalIndexFormat Format)
{
IndexBuffer.Type = OGLEnumConverter.GetDrawElementsType(Format);
@@ -310,8 +128,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
return;
}
- GL.BindVertexArray(VaoHandle);
-
GL.DrawArrays(OGLEnumConverter.GetPrimitiveType(PrimType), First, PrimCount);
}
@@ -324,8 +140,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
PrimitiveType Mode = OGLEnumConverter.GetPrimitiveType(PrimType);
- GL.BindVertexArray(VaoHandle);
-
GL.BindBuffer(BufferTarget.ElementArrayBuffer, IboHandle);
First <<= IndexBuffer.ElemSizeLog2;
@@ -341,5 +155,10 @@ namespace Ryujinx.Graphics.Gal.OpenGL
GL.DrawElements(Mode, IndexBuffer.Count, IndexBuffer.Type, First);
}
}
+
+ public bool TryGetVbo(long VboKey, out int VboHandle)
+ {
+ return VboCache.TryGetValue(VboKey, out VboHandle);
+ }
}
} \ No newline at end of file