public void SetBufferData( long Key, int Width, int Height, GalTextureFormat Format, byte[] Buffer) { if (Fbs.TryGetValue(Key, out FrameBuffer Fb)) { GL.BindTexture(TextureTarget.Texture2D, Fb.TexHandle); const int Level = 0; const int Border = 0; const PixelInternalFormat InternalFmt = PixelInternalFormat.Rgba; (PixelFormat GlFormat, PixelType Type) = OGLEnumConverter.GetTextureFormat(Format); GL.TexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Width, Height, Border, GlFormat, Type, Buffer); } }
public void DrawArrays(int First, int Count, GalPrimitiveType PrimType) { if (Count == 0) { return; } if (PrimType == GalPrimitiveType.Quads) { for (int Offset = 0; Offset < Count; Offset += 4) { GL.DrawArrays(PrimitiveType.TriangleFan, First + Offset, 4); } } else if (PrimType == GalPrimitiveType.QuadStrip) { GL.DrawArrays(PrimitiveType.TriangleFan, First, 4); for (int Offset = 2; Offset < Count; Offset += 2) { GL.DrawArrays(PrimitiveType.TriangleFan, First + Offset, 4); } } else { GL.DrawArrays(OGLEnumConverter.GetPrimitiveType(PrimType), First, Count); } }
public void Set(int Index, GalTexture Tex) { GL.ActiveTexture(TextureUnit.Texture0 + Index); int Handle = EnsureTextureInitialized(Index); GL.BindTexture(TextureTarget.Texture2D, Handle); int W = Tex.Width; int H = Tex.Height; byte[] Data = Tex.Data; int Length = Data.Length; if (IsCompressedTextureFormat(Tex.Format)) { PixelInternalFormat Pif = OGLEnumConverter.GetCompressedTextureFormat(Tex.Format); GL.CompressedTexImage2D(TextureTarget.Texture2D, 0, Pif, W, H, 0, Length, Data); } else { //TODO: Get those from Texture format. const PixelInternalFormat Pif = PixelInternalFormat.Rgba; const PixelFormat Pf = PixelFormat.Rgba; const PixelType Pt = PixelType.UnsignedByte; GL.TexImage2D(TextureTarget.Texture2D, 0, Pif, W, H, 0, Pf, Pt, Data); } }
public void Set(int Index, GalTextureSampler Sampler) { int Handle = EnsureTextureInitialized(Index); GL.BindTexture(TextureTarget.Texture2D, Handle); int WrapS = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressU); int WrapT = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressV); int MinFilter = (int)OGLEnumConverter.GetTextureMinFilter(Sampler.MinFilter, Sampler.MipFilter); int MagFilter = (int)OGLEnumConverter.GetTextureMagFilter(Sampler.MagFilter); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, WrapS); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, WrapT); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, MinFilter); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, MagFilter); float[] Color = new float[] { Sampler.BorderColor.Red, Sampler.BorderColor.Green, Sampler.BorderColor.Blue, Sampler.BorderColor.Alpha }; GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, Color); }
public void Set(byte[] Data, int Width, int Height) { if (RawFbTexHandle == 0) { RawFbTexHandle = GL.GenTexture(); } if (RawFbTexWidth != Width || RawFbTexHeight != Height) { SetupTexture(RawFbTexHandle, Width, Height); RawFbTexWidth = Width; RawFbTexHeight = Height; } GL.ActiveTexture(TextureUnit.Texture0); GL.BindTexture(TextureTarget.Texture2D, RawFbTexHandle); (PixelFormat Format, PixelType Type) = OGLEnumConverter.GetTextureFormat(GalTextureFormat.A8B8G8R8); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, Width, Height, Format, Type, Data); CurrTexHandle = RawFbTexHandle; }
public void DrawElements(long IboKey, int First, int VertexBase, GalPrimitiveType PrimType) { if (!IboCache.TryGetValue(IboKey, out int IboHandle)) { return; } PrimitiveType Mode = OGLEnumConverter.GetPrimitiveType(PrimType); GL.BindVertexArray(VaoHandle); GL.BindBuffer(BufferTarget.ElementArrayBuffer, IboHandle); First <<= IndexBuffer.ElemSizeLog2; if (VertexBase != 0) { IntPtr Indices = new IntPtr(First); GL.DrawElementsBaseVertex(Mode, IndexBuffer.Count, IndexBuffer.Type, Indices, VertexBase); } else { GL.DrawElements(Mode, IndexBuffer.Count, IndexBuffer.Type, First); } }
private void SetupTexture(int Handle, int Width, int Height) { GL.BindTexture(TextureTarget.Texture2D, Handle); const int MinFilter = (int)TextureMinFilter.Linear; const int MagFilter = (int)TextureMagFilter.Linear; GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, MinFilter); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, MagFilter); (PixelFormat Format, PixelType Type) = OGLEnumConverter.GetTextureFormat(GalTextureFormat.A8B8G8R8); const PixelInternalFormat InternalFmt = PixelInternalFormat.Rgba; const int Level = 0; const int Border = 0; GL.TexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Width, Height, Border, Format, Type, IntPtr.Zero); }
public void Create(long Key, int Size, GalImage Image) { int Handle = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, Handle); const int Level = 0; //TODO: Support mipmap textures. const int Border = 0; TextureCache.AddOrUpdate(Key, new ImageHandler(Handle, Image), (uint)Size); if (ImageUtils.IsCompressed(Image.Format)) { throw new InvalidOperationException("Surfaces with compressed formats are not supported!"); } (PixelInternalFormat InternalFmt, PixelFormat Format, PixelType Type) = OGLEnumConverter.GetImageFormat(Image.Format); GL.TexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Image.Width, Image.Height, Border, Format, Type, IntPtr.Zero); }
private void SetAllBlendState(BlendState New) { Enable(EnableCap.Blend, New.Enabled); if (New.Enabled) { if (New.SeparateAlpha) { GL.BlendEquationSeparate( OGLEnumConverter.GetBlendEquation(New.EquationRgb), OGLEnumConverter.GetBlendEquation(New.EquationAlpha)); GL.BlendFuncSeparate( (BlendingFactorSrc)OGLEnumConverter.GetBlendFactor(New.FuncSrcRgb), (BlendingFactorDest)OGLEnumConverter.GetBlendFactor(New.FuncDstRgb), (BlendingFactorSrc)OGLEnumConverter.GetBlendFactor(New.FuncSrcAlpha), (BlendingFactorDest)OGLEnumConverter.GetBlendFactor(New.FuncDstAlpha)); } else { GL.BlendEquation(OGLEnumConverter.GetBlendEquation(New.EquationRgb)); GL.BlendFunc( OGLEnumConverter.GetBlendFactor(New.FuncSrcRgb), OGLEnumConverter.GetBlendFactor(New.FuncDstRgb)); } } }
public void Create(long Key, byte[] Data, GalImage Image) { int Handle = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, Handle); const int Level = 0; //TODO: Support mipmap textures. const int Border = 0; TextureCache.AddOrUpdate(Key, new ImageHandler(Handle, Image), (uint)Data.Length); if (ImageUtils.IsCompressed(Image.Format) && !IsAstc(Image.Format)) { InternalFormat InternalFmt = OGLEnumConverter.GetCompressedImageFormat(Image.Format); GL.CompressedTexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Image.Width, Image.Height, Border, Data.Length, Data); } else { //TODO: Use KHR_texture_compression_astc_hdr when available if (IsAstc(Image.Format)) { int TextureBlockWidth = ImageUtils.GetBlockWidth(Image.Format); int TextureBlockHeight = ImageUtils.GetBlockHeight(Image.Format); Data = ASTCDecoder.DecodeToRGBA8888( Data, TextureBlockWidth, TextureBlockHeight, 1, Image.Width, Image.Height, 1); Image.Format = GalImageFormat.RGBA8 | (Image.Format & GalImageFormat.TypeMask); } (PixelInternalFormat InternalFmt, PixelFormat Format, PixelType Type) = OGLEnumConverter.GetImageFormat(Image.Format); GL.TexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Image.Width, Image.Height, Border, Format, Type, Data); } }
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 SetStencilFunction(bool IsFrontFace, GalComparisonOp Func, int Ref, int Mask) { GL.StencilFuncSeparate( IsFrontFace ? StencilFace.Front : StencilFace.Back, OGLEnumConverter.GetStencilFunc(Func), Ref, Mask); }
public void SetIndexArray(int Size, GalIndexFormat Format) { IndexBuffer.Type = OGLEnumConverter.GetDrawElementsType(Format); IndexBuffer.Count = Size >> (int)Format; IndexBuffer.ElemSizeLog2 = (int)Format; }
public void Compile() { if (Handle == 0) { Handle = GL.CreateShader(OGLEnumConverter.GetShaderType(Type)); CompileAndCheck(Handle, Code); } }
public void DrawArrays(int First, int PrimCount, GalPrimitiveType PrimType) { if (PrimCount == 0) { return; } GL.DrawArrays(OGLEnumConverter.GetPrimitiveType(PrimType), First, PrimCount); }
public void Set(int Index, GalTexture Texture) { GL.ActiveTexture(TextureUnit.Texture0 + Index); Bind(Index); const int Level = 0; //TODO: Support mipmap textures. const int Border = 0; if (IsCompressedTextureFormat(Texture.Format)) { PixelInternalFormat InternalFmt = OGLEnumConverter.GetCompressedTextureFormat(Texture.Format); GL.CompressedTexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Texture.Width, Texture.Height, Border, Texture.Data.Length, Texture.Data); } else { if (Texture.Format >= GalTextureFormat.Astc2D4x4) { Texture = ConvertAstcTextureToRgba(Texture); } const PixelInternalFormat InternalFmt = PixelInternalFormat.Rgba; (PixelFormat Format, PixelType Type) = OGLEnumConverter.GetTextureFormat(Texture.Format); GL.TexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Texture.Width, Texture.Height, Border, Format, Type, Texture.Data); } int SwizzleR = (int)OGLEnumConverter.GetTextureSwizzle(Texture.XSource); int SwizzleG = (int)OGLEnumConverter.GetTextureSwizzle(Texture.YSource); int SwizzleB = (int)OGLEnumConverter.GetTextureSwizzle(Texture.ZSource); int SwizzleA = (int)OGLEnumConverter.GetTextureSwizzle(Texture.WSource); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleR, SwizzleR); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleG, SwizzleG); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleB, SwizzleB); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleA, SwizzleA); }
public void DrawElements(int VbIndex, int First, GalPrimitiveType PrimType) { PrimitiveType Mode = OGLEnumConverter.GetPrimitiveType(PrimType); GL.BindVertexArray(VaoHandle); GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndexBuffer.IboHandle); GL.DrawElements(Mode, IndexBuffer.Count, IndexBuffer.Type, First); }
public void DrawArrays(int VbIndex, int First, int PrimCount, GalPrimitiveType PrimType) { if (PrimCount == 0) { return; } GL.BindVertexArray(VaoHandle); GL.DrawArrays(OGLEnumConverter.GetPrimitiveType(PrimType), First, PrimCount); }
public void Set( GalBlendEquation Equation, GalBlendFactor FuncSrc, GalBlendFactor FuncDst) { GL.BlendEquation( OGLEnumConverter.GetBlendEquation(Equation)); GL.BlendFunc( OGLEnumConverter.GetBlendFactorSrc(FuncSrc), OGLEnumConverter.GetBlendFactorDst(FuncDst)); }
public void DrawArrays(int VbIndex, GalPrimitiveType PrimType) { VbInfo Vb = VertexBuffers[VbIndex]; if (Vb.PrimCount == 0) { return; } GL.BindVertexArray(Vb.VaoHandle); GL.DrawArrays(OGLEnumConverter.GetPrimitiveType(PrimType), 0, Vb.PrimCount); }
private void SetBlendState(int Index, BlendState New, BlendState Old) { if (New.Enabled != Old.Enabled) { Enable(IndexedEnableCap.Blend, Index, New.Enabled); } if (New.Enabled) { if (New.SeparateAlpha) { if (New.EquationRgb != Old.EquationRgb || New.EquationAlpha != Old.EquationAlpha) { GL.BlendEquationSeparate( Index, OGLEnumConverter.GetBlendEquation(New.EquationRgb), OGLEnumConverter.GetBlendEquation(New.EquationAlpha)); } if (New.FuncSrcRgb != Old.FuncSrcRgb || New.FuncDstRgb != Old.FuncDstRgb || New.FuncSrcAlpha != Old.FuncSrcAlpha || New.FuncDstAlpha != Old.FuncDstAlpha) { GL.BlendFuncSeparate( Index, (BlendingFactorSrc)OGLEnumConverter.GetBlendFactor(New.FuncSrcRgb), (BlendingFactorDest)OGLEnumConverter.GetBlendFactor(New.FuncDstRgb), (BlendingFactorSrc)OGLEnumConverter.GetBlendFactor(New.FuncSrcAlpha), (BlendingFactorDest)OGLEnumConverter.GetBlendFactor(New.FuncDstAlpha)); } } else { if (New.EquationRgb != Old.EquationRgb) { GL.BlendEquation(Index, OGLEnumConverter.GetBlendEquation(New.EquationRgb)); } if (New.FuncSrcRgb != Old.FuncSrcRgb || New.FuncDstRgb != Old.FuncDstRgb) { GL.BlendFunc( Index, (BlendingFactorSrc)OGLEnumConverter.GetBlendFactor(New.FuncSrcRgb), (BlendingFactorDest)OGLEnumConverter.GetBlendFactor(New.FuncDstRgb)); } } } }
public void SetIndexArray(byte[] Buffer, GalIndexFormat Format) { EnsureIbInitialized(); IndexBuffer.Type = OGLEnumConverter.GetDrawElementsType(Format); IndexBuffer.Count = Buffer.Length >> (int)Format; IntPtr Length = new IntPtr(Buffer.Length); GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndexBuffer.IboHandle); GL.BufferData(BufferTarget.ElementArrayBuffer, Length, Buffer, BufferUsageHint.StreamDraw); GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); }
public void Reinterpret(long Key, GalImage NewImage) { if (!Texture.TryGetImage(Key, out GalImage OldImage)) { return; } if (NewImage.Format == OldImage.Format && NewImage.Width == OldImage.Width && NewImage.Height == OldImage.Height) { return; } if (CopyPBO == 0) { CopyPBO = GL.GenBuffer(); } GL.BindBuffer(BufferTarget.PixelPackBuffer, CopyPBO); //The buffer should be large enough to hold the largest texture. int BufferSize = Math.Max(ImageUtils.GetSize(OldImage), ImageUtils.GetSize(NewImage)); GL.BufferData(BufferTarget.PixelPackBuffer, BufferSize, IntPtr.Zero, BufferUsageHint.StreamCopy); if (!Texture.TryGetImageHandler(Key, out ImageHandler CachedImage)) { throw new InvalidOperationException(); } (_, PixelFormat Format, PixelType Type) = OGLEnumConverter.GetImageFormat(CachedImage.Format); GL.BindTexture(TextureTarget.Texture2D, CachedImage.Handle); GL.GetTexImage(TextureTarget.Texture2D, 0, Format, Type, IntPtr.Zero); GL.BindBuffer(BufferTarget.PixelPackBuffer, 0); GL.BindBuffer(BufferTarget.PixelUnpackBuffer, CopyPBO); GL.PixelStore(PixelStoreParameter.UnpackRowLength, OldImage.Width); Texture.Create(Key, ImageUtils.GetSize(NewImage), NewImage); GL.PixelStore(PixelStoreParameter.UnpackRowLength, 0); GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0); }
public void DrawElements(long IboKey, int First, GalPrimitiveType PrimType) { if (!IboCache.TryGetValue(IboKey, out int IboHandle)) { return; } PrimitiveType Mode = OGLEnumConverter.GetPrimitiveType(PrimType); GL.BindVertexArray(VaoHandle); GL.BindBuffer(BufferTarget.ElementArrayBuffer, IboHandle); GL.DrawElements(Mode, IndexBuffer.Count, IndexBuffer.Type, First); }
public void Create(long Key, int Size, GalImage Image) { int Handle = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, Handle); const int Level = 0; //TODO: Support mipmap textures. const int Border = 0; TextureCache.AddOrUpdate(Key, new ImageHandler(Handle, Image), (uint)Size); GalImageFormat TypeLess = Image.Format & GalImageFormat.FormatMask; bool IsASTC = TypeLess >= GalImageFormat.ASTC_BEGIN && TypeLess <= GalImageFormat.ASTC_END; if (ImageUtils.IsCompressed(Image.Format) && !IsASTC) { InternalFormat InternalFmt = OGLEnumConverter.GetCompressedImageFormat(Image.Format); GL.CompressedTexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Image.Width, Image.Height, Border, Size, IntPtr.Zero); } else { (PixelInternalFormat InternalFmt, PixelFormat Format, PixelType Type) = OGLEnumConverter.GetImageFormat(Image.Format); GL.TexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Image.Width, Image.Height, Border, Format, Type, IntPtr.Zero); } }
public void DrawElements(int VbIndex, int First, GalPrimitiveType PrimType) { VbInfo Vb = VertexBuffers[VbIndex]; if (Vb.PrimCount == 0) { return; } PrimitiveType Mode = OGLEnumConverter.GetPrimitiveType(PrimType); GL.BindVertexArray(Vb.VaoHandle); GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndexBuffer.IboHandle); GL.DrawElements(Mode, IndexBuffer.Count, IndexBuffer.Type, First); }
public void SetSeparate( GalBlendEquation EquationRgb, GalBlendEquation EquationAlpha, GalBlendFactor FuncSrcRgb, GalBlendFactor FuncDstRgb, GalBlendFactor FuncSrcAlpha, GalBlendFactor FuncDstAlpha) { GL.BlendEquationSeparate( OGLEnumConverter.GetBlendEquation(EquationRgb), OGLEnumConverter.GetBlendEquation(EquationAlpha)); GL.BlendFuncSeparate( OGLEnumConverter.GetBlendFactorSrc(FuncSrcRgb), OGLEnumConverter.GetBlendFactorDst(FuncDstRgb), OGLEnumConverter.GetBlendFactorSrc(FuncSrcAlpha), OGLEnumConverter.GetBlendFactorDst(FuncDstAlpha)); }
public void Bind(long Key, int Index, GalImage Image) { if (TextureCache.TryGetValue(Key, out ImageHandler CachedImage)) { GL.ActiveTexture(TextureUnit.Texture0 + Index); GL.BindTexture(TextureTarget.Texture2D, CachedImage.Handle); int[] SwizzleRgba = new int[] { (int)OGLEnumConverter.GetTextureSwizzle(Image.XSource), (int)OGLEnumConverter.GetTextureSwizzle(Image.YSource), (int)OGLEnumConverter.GetTextureSwizzle(Image.ZSource), (int)OGLEnumConverter.GetTextureSwizzle(Image.WSource) }; GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleRgba, SwizzleRgba); } }
public void Set(int Index, GalTexture Texture) { GL.ActiveTexture(TextureUnit.Texture0 + Index); Bind(Index); const int Level = 0; //TODO: Support mipmap textures. const int Border = 0; if (IsCompressedTextureFormat(Texture.Format)) { PixelInternalFormat InternalFmt = OGLEnumConverter.GetCompressedTextureFormat(Texture.Format); GL.CompressedTexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Texture.Width, Texture.Height, Border, Texture.Data.Length, Texture.Data); } else { const PixelInternalFormat InternalFmt = PixelInternalFormat.Rgba; (PixelFormat Format, PixelType Type) = OGLEnumConverter.GetTextureFormat(Texture.Format); GL.TexImage2D( TextureTarget.Texture2D, Level, InternalFmt, Texture.Width, Texture.Height, Border, Format, Type, Texture.Data); } }
public void Reinterpret(long Key, GalImage NewImage) { if (!Texture.TryGetImage(Key, out GalImage OldImage)) { return; } if (NewImage.Format == OldImage.Format) { return; } if (CopyPBO == 0) { CopyPBO = GL.GenBuffer(); } GL.BindBuffer(BufferTarget.PixelPackBuffer, CopyPBO); GL.BufferData(BufferTarget.PixelPackBuffer, Math.Max(ImageUtils.GetSize(OldImage), ImageUtils.GetSize(NewImage)), IntPtr.Zero, BufferUsageHint.StreamCopy); if (!Texture.TryGetImageHandler(Key, out ImageHandler CachedImage)) { throw new InvalidOperationException(); } (_, PixelFormat Format, PixelType Type) = OGLEnumConverter.GetImageFormat(CachedImage.Format); GL.BindTexture(TextureTarget.Texture2D, CachedImage.Handle); GL.GetTexImage(TextureTarget.Texture2D, 0, Format, Type, IntPtr.Zero); GL.BindBuffer(BufferTarget.PixelPackBuffer, 0); GL.BindBuffer(BufferTarget.PixelUnpackBuffer, CopyPBO); Texture.Create(Key, ImageUtils.GetSize(NewImage), NewImage); GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0); }