aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2018-08-25 01:16:58 -0300
committergdkchan <gab.dark.100@gmail.com>2018-08-25 01:16:58 -0300
commita42ab2e40cae5db96cc58634f1e70c4e31bb095d (patch)
treef727a1f9685fa02a8e4f947e188f4b329135ad39 /Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
parentda7e7027518c40702536d4c51905ae7cb496cdb5 (diff)
Implement vertex instancing (#381)
Diffstat (limited to 'Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs')
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs22
1 files changed, 13 insertions, 9 deletions
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
index 0108a0da..73d37b87 100644
--- a/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
+++ b/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
@@ -9,6 +9,10 @@ namespace Ryujinx.Graphics.Gal.OpenGL
{
class OGLShader : IGalShader
{
+ public const int ReservedCbufCount = 1;
+
+ private const int ExtraDataSize = 4;
+
public OGLShaderProgram Current;
private ConcurrentDictionary<long, OGLShaderStage> Stages;
@@ -96,7 +100,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
return Enumerable.Empty<ShaderDeclInfo>();
}
- public unsafe void SetFlip(float X, float Y)
+ public unsafe void SetExtraData(float FlipX, float FlipY, int Instance)
{
BindProgram();
@@ -104,14 +108,15 @@ namespace Ryujinx.Graphics.Gal.OpenGL
GL.BindBuffer(BufferTarget.UniformBuffer, ExtraUboHandle);
- float* Data = stackalloc float[4];
- Data[0] = X;
- Data[1] = Y;
+ float* Data = stackalloc float[ExtraDataSize];
+ Data[0] = FlipX;
+ Data[1] = FlipY;
+ Data[2] = BitConverter.Int32BitsToSingle(Instance);
//Invalidate buffer
- GL.BufferData(BufferTarget.UniformBuffer, 4 * sizeof(float), IntPtr.Zero, BufferUsageHint.StreamDraw);
+ GL.BufferData(BufferTarget.UniformBuffer, ExtraDataSize * sizeof(float), IntPtr.Zero, BufferUsageHint.StreamDraw);
- GL.BufferSubData(BufferTarget.UniformBuffer, IntPtr.Zero, 4 * sizeof(float), (IntPtr)Data);
+ GL.BufferSubData(BufferTarget.UniformBuffer, IntPtr.Zero, ExtraDataSize * sizeof(float), (IntPtr)Data);
}
public void Bind(long Key)
@@ -197,7 +202,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
GL.BindBuffer(BufferTarget.UniformBuffer, ExtraUboHandle);
- GL.BufferData(BufferTarget.UniformBuffer, 4 * sizeof(float), IntPtr.Zero, BufferUsageHint.StreamDraw);
+ GL.BufferData(BufferTarget.UniformBuffer, ExtraDataSize * sizeof(float), IntPtr.Zero, BufferUsageHint.StreamDraw);
GL.BindBufferBase(BufferRangeTarget.UniformBuffer, 0, ExtraUboHandle);
}
@@ -219,8 +224,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
GL.UniformBlockBinding(ProgramHandle, ExtraBlockindex, 0);
- //First index is reserved
- int FreeBinding = 1;
+ int FreeBinding = ReservedCbufCount;
void BindUniformBlocksIfNotNull(OGLShaderStage Stage)
{