| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- using OpenTK;
- using System;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- namespace Ryujinx.Graphics.Gal.OpenGL
- {
- public class OpenGLRenderer : IGalRenderer
- {
- private OGLBlend Blend;
- private OGLFrameBuffer FrameBuffer;
- private OGLRasterizer Rasterizer;
- private OGLShader Shader;
- private OGLTexture Texture;
- private ConcurrentQueue<Action> ActionsQueue;
- public OpenGLRenderer()
- {
- Blend = new OGLBlend();
- FrameBuffer = new OGLFrameBuffer();
- Rasterizer = new OGLRasterizer();
- Shader = new OGLShader();
- Texture = new OGLTexture();
- ActionsQueue = new ConcurrentQueue<Action>();
- }
- public void QueueAction(Action ActionMthd)
- {
- ActionsQueue.Enqueue(ActionMthd);
- }
- public void RunActions()
- {
- int Count = ActionsQueue.Count;
- while (Count-- > 0 && ActionsQueue.TryDequeue(out Action RenderAction))
- {
- RenderAction();
- }
- }
- public void Render()
- {
- FrameBuffer.Render();
- }
- public void SetWindowSize(int Width, int Height)
- {
- FrameBuffer.SetWindowSize(Width, Height);
- }
- public void SetBlendEnable(bool Enable)
- {
- if (Enable)
- {
- ActionsQueue.Enqueue(() => Blend.Enable());
- }
- else
- {
- ActionsQueue.Enqueue(() => Blend.Disable());
- }
- }
- public void SetBlend(
- GalBlendEquation Equation,
- GalBlendFactor FuncSrc,
- GalBlendFactor FuncDst)
- {
- ActionsQueue.Enqueue(() => Blend.Set(Equation, FuncSrc, FuncDst));
- }
- public void SetBlendSeparate(
- GalBlendEquation EquationRgb,
- GalBlendEquation EquationAlpha,
- GalBlendFactor FuncSrcRgb,
- GalBlendFactor FuncDstRgb,
- GalBlendFactor FuncSrcAlpha,
- GalBlendFactor FuncDstAlpha)
- {
- ActionsQueue.Enqueue(() =>
- {
- Blend.SetSeparate(
- EquationRgb,
- EquationAlpha,
- FuncSrcRgb,
- FuncDstRgb,
- FuncSrcAlpha,
- FuncDstAlpha);
- });
- }
- public void CreateFrameBuffer(long Tag, int Width, int Height)
- {
- ActionsQueue.Enqueue(() => FrameBuffer.Create(Tag, Width, Height));
- }
- public void BindFrameBuffer(long Tag)
- {
- ActionsQueue.Enqueue(() => FrameBuffer.Bind(Tag));
- }
- public void BindFrameBufferTexture(long Tag, int Index, GalTextureSampler Sampler)
- {
- ActionsQueue.Enqueue(() =>
- {
- FrameBuffer.BindTexture(Tag, Index);
- OGLTexture.Set(Sampler);
- });
- }
- public void SetFrameBuffer(long Tag)
- {
- ActionsQueue.Enqueue(() => FrameBuffer.Set(Tag));
- }
- public void SetFrameBuffer(byte[] Data, int Width, int 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 SetViewport(int X, int Y, int Width, int Height)
- {
- ActionsQueue.Enqueue(() => FrameBuffer.SetViewport(X, Y, Width, Height));
- }
- public void GetFrameBufferData(long Tag, Action<byte[]> Callback)
- {
- ActionsQueue.Enqueue(() => FrameBuffer.GetBufferData(Tag, Callback));
- }
- public void ClearBuffers(int RtIndex, GalClearBufferFlags Flags)
- {
- ActionsQueue.Enqueue(() => Rasterizer.ClearBuffers(RtIndex, Flags));
- }
- public void SetVertexArray(int VbIndex, int Stride, byte[] Buffer, GalVertexAttrib[] Attribs)
- {
- if ((uint)VbIndex > 31)
- {
- throw new ArgumentOutOfRangeException(nameof(VbIndex));
- }
- ActionsQueue.Enqueue(() => Rasterizer.SetVertexArray(VbIndex, Stride,
- Buffer ?? throw new ArgumentNullException(nameof(Buffer)),
- Attribs ?? throw new ArgumentNullException(nameof(Attribs))));
- }
- public void SetIndexArray(byte[] Buffer, GalIndexFormat Format)
- {
- if (Buffer == null)
- {
- throw new ArgumentNullException(nameof(Buffer));
- }
- ActionsQueue.Enqueue(() => Rasterizer.SetIndexArray(Buffer, Format));
- }
- public void DrawArrays(int VbIndex, int First, int PrimCount, GalPrimitiveType PrimType)
- {
- if ((uint)VbIndex > 31)
- {
- throw new ArgumentOutOfRangeException(nameof(VbIndex));
- }
- ActionsQueue.Enqueue(() => Rasterizer.DrawArrays(VbIndex, First, PrimCount, PrimType));
- }
- public void DrawElements(int VbIndex, int First, GalPrimitiveType PrimType)
- {
- if ((uint)VbIndex > 31)
- {
- throw new ArgumentOutOfRangeException(nameof(VbIndex));
- }
- ActionsQueue.Enqueue(() => Rasterizer.DrawElements(VbIndex, First, PrimType));
- }
- public void CreateShader(IGalMemory Memory, long Tag, GalShaderType Type)
- {
- if (Memory == null)
- {
- throw new ArgumentNullException(nameof(Memory));
- }
- Shader.Create(Memory, Tag, Type);
- }
- public void SetConstBuffer(long Tag, int Cbuf, byte[] Data)
- {
- if (Data == null)
- {
- throw new ArgumentNullException(nameof(Data));
- }
- ActionsQueue.Enqueue(() => Shader.SetConstBuffer(Tag, Cbuf, Data));
- }
- public void SetUniform1(string UniformName, int Value)
- {
- if (UniformName == null)
- {
- throw new ArgumentNullException(nameof(UniformName));
- }
- ActionsQueue.Enqueue(() => Shader.SetUniform1(UniformName, Value));
- }
- public void SetUniform2F(string UniformName, float X, float Y)
- {
- if (UniformName == null)
- {
- throw new ArgumentNullException(nameof(UniformName));
- }
- ActionsQueue.Enqueue(() => Shader.SetUniform2F(UniformName, X, Y));
- }
- public IEnumerable<ShaderDeclInfo> GetTextureUsage(long Tag)
- {
- return Shader.GetTextureUsage(Tag);
- }
- public void BindShader(long Tag)
- {
- ActionsQueue.Enqueue(() => Shader.Bind(Tag));
- }
- public void BindProgram()
- {
- ActionsQueue.Enqueue(() => Shader.BindProgram());
- }
- public void SetTextureAndSampler(int Index, GalTexture Texture, GalTextureSampler Sampler)
- {
- ActionsQueue.Enqueue(() =>
- {
- this.Texture.Set(Index, Texture);
- OGLTexture.Set(Sampler);
- });
- }
- public void BindTexture(int Index)
- {
- ActionsQueue.Enqueue(() => Texture.Bind(Index));
- }
- }
- }
|