From c9502aae544d565fbd5cf42debd2482c058fc7a8 Mon Sep 17 00:00:00 2001 From: chrisbrandtner Date: Sun, 24 Oct 2010 14:29:27 +0000 Subject: [PATCH] Added OpenGL Diagnostics program, similar to OpenAL Diagnostics. --- .../Examples/OpenGL/1.x/OpenGLDiagnostics.cs | 438 ++++++++++++++++++ .../Examples/OpenGL/1.x/OpenGLDiagnostics.rtf | Bin 0 -> 477 bytes Source/Examples/OpenTK.Examples.csproj | 2 + 3 files changed, 440 insertions(+) create mode 100644 Source/Examples/OpenGL/1.x/OpenGLDiagnostics.cs create mode 100644 Source/Examples/OpenGL/1.x/OpenGLDiagnostics.rtf diff --git a/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.cs b/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.cs new file mode 100644 index 00000000..429f4d9e --- /dev/null +++ b/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.cs @@ -0,0 +1,438 @@ +using System; +using System.Drawing; +using System.Collections.Generic; +using System.Diagnostics; + +using OpenTK; +using OpenTK.Graphics; +using OpenTK.Graphics.OpenGL; +using OpenTK.Input; + +namespace Examples.Tutorial +{ + [Example( "OpenGL Diagnostics", ExampleCategory.OpenGL, "1.x", Documentation = "OpenGLDiagnostics" )] + + class GLDiagnostics : GameWindow + { + /// Creates a 800x600 window with the specified title. + public GLDiagnostics() + : base(80, 60, GraphicsMode.Default, "OpenTK Quick Start Sample", GameWindowFlags.Default, DisplayDevice.Default, 3, 1, GraphicsContextFlags.Default) + { + VSync = VSyncMode.On; + this.Context.ErrorChecking = false; + } + + struct TexFormat + { + public PixelInternalFormat pif; + public PixelFormat pf; + public PixelType pt; + + public TexFormat(PixelInternalFormat _pif, PixelFormat _pf, PixelType _pt) + { + pif = _pif; + pf = _pf; + pt = _pt; + } + } + + TexFormat[] TextureFormats = new TexFormat[] + { + new TexFormat( PixelInternalFormat.Alpha, PixelFormat.Alpha, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Alpha4, PixelFormat.Alpha, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Alpha8, PixelFormat.Alpha, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Alpha12, PixelFormat.Alpha, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Alpha16, PixelFormat.Alpha, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.Alpha16fArb, PixelFormat.Alpha, PixelType.HalfFloat), + new TexFormat( (PixelInternalFormat)All.Alpha32fArb, PixelFormat.Alpha, PixelType.Float), + + new TexFormat( PixelInternalFormat.DepthComponent, PixelFormat.DepthComponent, PixelType.Int), + new TexFormat( PixelInternalFormat.DepthComponent16, PixelFormat.DepthComponent, PixelType.Float), + new TexFormat( PixelInternalFormat.DepthComponent24, PixelFormat.DepthComponent, PixelType.Float), + new TexFormat( PixelInternalFormat.DepthComponent32, PixelFormat.DepthComponent, PixelType.Float), + new TexFormat( PixelInternalFormat.DepthComponent32f, PixelFormat.DepthComponent, PixelType.Float), + new TexFormat( PixelInternalFormat.DepthStencil, PixelFormat.DepthStencil, PixelType.UnsignedInt248), + new TexFormat( PixelInternalFormat.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248), + new TexFormat( PixelInternalFormat.Depth32fStencil8, PixelFormat.DepthStencil, PixelType.Float32UnsignedInt248Rev), + + new TexFormat( PixelInternalFormat.One, PixelFormat.Red, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Two, PixelFormat.Rg, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rgb, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rgba, PixelFormat.Rgba, PixelType.UnsignedByte), + + new TexFormat( PixelInternalFormat.Srgb, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.SrgbAlpha, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Srgb8, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Srgb8Alpha8, PixelFormat.Rgba, PixelType.UnsignedByte), + + new TexFormat( PixelInternalFormat.R16f, PixelFormat.Red, PixelType.HalfFloat), + new TexFormat( PixelInternalFormat.Rg16f, PixelFormat.Rg, PixelType.HalfFloat), + new TexFormat( PixelInternalFormat.Rgb16f, PixelFormat.Rgb, PixelType.HalfFloat), + new TexFormat( PixelInternalFormat.Rgba16f, PixelFormat.Rgba, PixelType.HalfFloat), + new TexFormat( PixelInternalFormat.R32f, PixelFormat.Red, PixelType.Float), + new TexFormat( PixelInternalFormat.Rg32f, PixelFormat.Rg, PixelType.Float), + new TexFormat( PixelInternalFormat.Rgb32f, PixelFormat.Rgb, PixelType.Float), + new TexFormat( PixelInternalFormat.Rgba32f, PixelFormat.Rgba, PixelType.Float), + + new TexFormat( PixelInternalFormat.R8, PixelFormat.Red, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rg8, PixelFormat.Rg, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rgb8, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rgba8, PixelFormat.Rgba, PixelType.UnsignedByte), + + new TexFormat( PixelInternalFormat.R8ui, PixelFormat.Red, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rg8ui, PixelFormat.Rg, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rgb8ui, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rgba8ui, PixelFormat.Rgba, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.R16ui, PixelFormat.Red, PixelType.UnsignedShort), + new TexFormat( PixelInternalFormat.Rg16ui, PixelFormat.Rg, PixelType.UnsignedShort), + new TexFormat( PixelInternalFormat.Rgb16ui, PixelFormat.Rgb, PixelType.UnsignedShort), + new TexFormat( PixelInternalFormat.Rgba16ui, PixelFormat.Rgba, PixelType.UnsignedShort), + new TexFormat( PixelInternalFormat.R32ui, PixelFormat.Red, PixelType.UnsignedInt), + new TexFormat( PixelInternalFormat.Rg32ui, PixelFormat.Rg, PixelType.UnsignedInt), + new TexFormat( PixelInternalFormat.Rgb32ui, PixelFormat.Rgb, PixelType.UnsignedInt), + new TexFormat( PixelInternalFormat.Rgba32ui, PixelFormat.Rgba, PixelType.UnsignedInt), + + new TexFormat( PixelInternalFormat.R8i, PixelFormat.Red, PixelType.Byte), + new TexFormat( PixelInternalFormat.Rg8i, PixelFormat.Rg, PixelType.Byte), + new TexFormat( PixelInternalFormat.Rgb8i, PixelFormat.Rgb, PixelType.Byte), + new TexFormat( PixelInternalFormat.Rgba8i, PixelFormat.Rgba, PixelType.Byte), + new TexFormat( PixelInternalFormat.R16i, PixelFormat.Red, PixelType.Short), + new TexFormat( PixelInternalFormat.Rg16i, PixelFormat.Rg, PixelType.Short), + new TexFormat( PixelInternalFormat.Rgb16i, PixelFormat.Rgb, PixelType.Short), + new TexFormat( PixelInternalFormat.Rgba16i, PixelFormat.Rgba, PixelType.Short), + new TexFormat( PixelInternalFormat.R32i, PixelFormat.Red, PixelType.Int), + new TexFormat( PixelInternalFormat.Rg32i, PixelFormat.Rg, PixelType.Int), + new TexFormat( PixelInternalFormat.Rgb32i, PixelFormat.Rgb, PixelType.Int), + new TexFormat( PixelInternalFormat.Rgba32i, PixelFormat.Rgba, PixelType.Int), + + new TexFormat( PixelInternalFormat.R3G3B2, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rgb10A2, PixelFormat.Rgba, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rgb5A1, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.Rgb9E5, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.R11fG11fB10f, PixelFormat.Rgb, PixelType.UnsignedByte), + + new TexFormat( PixelInternalFormat.CompressedAlpha, PixelFormat.Alpha, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedIntensity, PixelFormat.Luminance, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedLuminance, PixelFormat.Luminance, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedLuminanceAlpha, PixelFormat.LuminanceAlpha, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.CompressedLuminanceLatc1Ext, PixelFormat.Luminance, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.CompressedLuminanceAlphaLatc2Ext, PixelFormat.LuminanceAlpha, PixelType.UnsignedByte), + + new TexFormat( PixelInternalFormat.CompressedRed, PixelFormat.Red, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedRedRgtc1, PixelFormat.Red, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.CompressedRedGreenRgtc2Ext, PixelFormat.Rg, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedRg, PixelFormat.Rg, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedRgRgtc2, PixelFormat.Rg, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedRgb, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.CompressedRgbFxt13Dfx, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedRgba, PixelFormat.Rgba, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.CompressedRgbaFxt13Dfx, PixelFormat.Rgba, PixelType.UnsignedByte), + + new TexFormat( (PixelInternalFormat)All.CompressedSignedLuminanceAlphaLatc2Ext, PixelFormat.LuminanceAlpha, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.CompressedSignedLuminanceLatc1Ext, PixelFormat.Luminance, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedSignedRedRgtc1, PixelFormat.Red, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedSignedRgRgtc2, PixelFormat.Rg, PixelType.UnsignedByte), + + new TexFormat( PixelInternalFormat.CompressedSluminance, PixelFormat.Luminance, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedSluminanceAlpha, PixelFormat.LuminanceAlpha, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedSrgb, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedSrgbAlpha, PixelFormat.Rgba, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedSrgbS3tcDxt1Ext, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedSrgbAlphaS3tcDxt1Ext, PixelFormat.Rgba, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedSrgbAlphaS3tcDxt3Ext, PixelFormat.Rgba, PixelType.UnsignedByte), + new TexFormat( PixelInternalFormat.CompressedSrgbAlphaS3tcDxt5Ext, PixelFormat.Rgba, PixelType.UnsignedByte), + + new TexFormat( (PixelInternalFormat)All.CompressedRgbS3tcDxt1Ext, PixelFormat.Rgb, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.CompressedRgbaS3tcDxt1Ext, PixelFormat.Rgba, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.CompressedRgbaS3tcDxt3Ext, PixelFormat.Rgba, PixelType.UnsignedByte), + new TexFormat( (PixelInternalFormat)All.CompressedRgbaS3tcDxt5Ext, PixelFormat.Rgba, PixelType.UnsignedByte), + + }; + + #region GL.Get* Helper + + public enum eType + { + Boolean, + Int, + IntEnum, + IntArray2, + IntArray4, + Float, + FloatArray2, + FloatArray4, + } + + public void Analyze(GetPName pname, eType type) + { + bool result1b; + int result1i; + int[] result2i = new int[2]; + int[] result4i = new int[4]; + float result1f; + Vector2 result2f; + Vector4 result4f; + string output; + + switch (type) + { + case eType.Boolean: + GL.GetBoolean(pname, out result1b); + output = pname + ": " + result1b; + break; + case eType.Int: + GL.GetInteger(pname, out result1i); + output = pname + ": " + result1i; + break; + case eType.IntEnum: + GL.GetInteger(pname, out result1i); + output = pname + ": " + (All)result1i; + break; + case eType.IntArray2: + GL.GetInteger(pname, result2i); + output = pname + ": ( " + result2i[0] + ", " + result2i[1] + " )"; + break; + case eType.IntArray4: + GL.GetInteger(pname, result4i); + output = pname + ": ( " + result4i[0] + ", " + result4i[1] + " ) ( " + result4i[2] + ", " + result4i[3] + " )"; + break; + case eType.Float: + GL.GetFloat(pname, out result1f); + output = pname + ": " + result1f; + break; + case eType.FloatArray2: + GL.GetFloat(pname, out result2f); + output = pname + ": ( " + result2f.X + ", " + result2f.Y + " )"; + break; + case eType.FloatArray4: + GL.GetFloat(pname, out result4f); + output = pname + ": ( " + result4f.X + ", " + result4f.Y + ", " + result4f.Z + ", " + result4f.W + " )"; + break; + default: throw new NotImplementedException(); + } + + ErrorCode err = GL.GetError(); + if (err != ErrorCode.NoError) + Trace.WriteLine("Unsupported Token: " + pname); + else + Trace.WriteLine(output); + + } + + #endregion GL.Get* Helper + + /// Load resources here. + /// Not used. + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + GL.ClearColor(System.Drawing.Color.MidnightBlue); + GL.Enable(EnableCap.DepthTest); + + // returns 0 formats, driver broken? + /* + int CompressedTextureFormatCount; + GL.GetInteger(GetPName.NumCompressedTextureFormats, out CompressedTextureFormatCount); + if (CompressedTextureFormatCount > 0) + { + int[] CompressedTextureFormats = new int[CompressedTextureFormatCount]; + GL.GetInteger(GetPName.CompressedTextureFormats, CompressedTextureFormats); + Trace.WriteLine("Supported compressed Texture formats:"); + for (int i = 0; i < CompressedTextureFormats.Length; i++) + Trace.Write((All)CompressedTextureFormats[i] + ", "); + } + */ + + string Renderer = GL.GetString(StringName.Renderer); + string GLSLang = GL.GetString(StringName.ShadingLanguageVersion); + string Vendor = GL.GetString(StringName.Vendor); + string Version = GL.GetString(StringName.Version); + + string ExtensionsRaw = GL.GetString(StringName.Extensions); + string[] splitter = new string[] { " " }; + string[] Extensions = ExtensionsRaw.Split(splitter, StringSplitOptions.None); + + Trace.WriteLine("Vendor: " + Vendor); + Trace.WriteLine("Renderer: " + Renderer); + Trace.WriteLine("GL Version: " + Version); + Analyze(GetPName.MajorVersion, eType.Int); + Analyze(GetPName.MinorVersion, eType.Int); + Trace.WriteLine("GLSL Version: " + GLSLang); + Trace.WriteLine("Extensions: "); + for (int i = 0; i < Extensions.Length; i++) + Trace.WriteLine(Extensions[i]); + + Trace.WriteLine("--- Framebuffer ---"); + Analyze(GetPName.Doublebuffer, eType.Boolean); + Analyze(GetPName.MaxColorAttachments, eType.Int); + Analyze(GetPName.MaxDrawBuffers, eType.Int); + Analyze(GetPName.AuxBuffers, eType.Int); + Analyze(GetPName.DrawBuffer, eType.IntEnum); + Analyze(GetPName.MaxSamples, eType.Int); + Analyze(GetPName.MaxViewportDims, eType.IntArray2); + Analyze(GetPName.Viewport, eType.IntArray4); + + Trace.WriteLine("--- Framebuffer channels ---"); + Analyze(GetPName.RedBits, eType.Int); + Analyze(GetPName.GreenBits, eType.Int); + Analyze(GetPName.BlueBits, eType.Int); + Analyze(GetPName.AlphaBits, eType.Int); + Analyze(GetPName.DepthBits, eType.Int); + Analyze(GetPName.StencilBits, eType.Int); + + Analyze(GetPName.AccumRedBits, eType.Int); + Analyze(GetPName.AccumGreenBits, eType.Int); + Analyze(GetPName.AccumBlueBits, eType.Int); + Analyze(GetPName.AccumAlphaBits, eType.Int); + + Trace.WriteLine("--- Textures ---"); + Analyze(GetPName.MaxCombinedTextureImageUnits, eType.Int); + Analyze(GetPName.MaxVertexTextureImageUnits, eType.Int); + Analyze(GetPName.MaxTextureImageUnits, eType.Int); + Analyze(GetPName.MaxTextureUnits, eType.Int); + Analyze(GetPName.MaxTextureSize, eType.Int); + Analyze(GetPName.Max3DTextureSize, eType.Int); + Analyze(GetPName.MaxCubeMapTextureSize, eType.Int); + Analyze(GetPName.MaxRenderbufferSize, eType.Int); + Analyze(GetPName.MaxTextureLodBias, eType.Int); + + Queue Supported = new Queue(); + Queue Unsupported = new Queue(); + + uint DummyTexture; + foreach (TexFormat t in TextureFormats) + { + GL.GenTextures(1, out DummyTexture); + GL.BindTexture(TextureTarget.Texture2D, DummyTexture); + GL.TexImage2D(TextureTarget.Texture2D, 0, t.pif, 4, 4, 0, t.pf, t.pt, IntPtr.Zero); + if (GL.GetError() == ErrorCode.NoError) + Supported.Enqueue(t); + else + Unsupported.Enqueue(t); + GL.DeleteTextures(1, ref DummyTexture); + } + GL.BindTexture(TextureTarget.Texture2D, 0); + + Trace.WriteLine("--- UN-supported Texture formats ---"); + while (Unsupported.Count > 0) + { + TexFormat tex = Unsupported.Dequeue(); + Trace.Write((All)tex.pif+", "); + } + Trace.WriteLine( " " ); + + Trace.WriteLine("--- SUPPORTED Texture formats ---"); + while (Supported.Count > 0) + { + TexFormat tex = Supported.Dequeue(); + Trace.WriteLine((All)tex.pif+" " +tex.pf + " "+tex.pt); + } + Trace.WriteLine(" "); + + Trace.WriteLine("--- Point&Line volumes ---"); + Analyze(GetPName.AliasedPointSizeRange, eType.FloatArray2); + Analyze(GetPName.PointSizeMin, eType.Float); + Analyze(GetPName.PointSizeMax, eType.Float); + Analyze(GetPName.PointSizeGranularity, eType.Float); + Analyze(GetPName.PointSizeRange, eType.FloatArray2); + + Analyze(GetPName.AliasedLineWidthRange, eType.FloatArray2); + Analyze(GetPName.LineWidthGranularity, eType.Float); + Analyze(GetPName.LineWidthRange, eType.FloatArray2); + + Trace.WriteLine("--- VBO ---"); + Analyze(GetPName.MaxElementsIndices, eType.Int); + Analyze(GetPName.MaxElementsVertices, eType.Int); + Analyze(GetPName.MaxVertexAttribs, eType.Int); + + Trace.WriteLine("--- GLSL ---"); + Analyze(GetPName.MaxCombinedFragmentUniformComponents, eType.Int); + Analyze(GetPName.MaxCombinedGeometryUniformComponents, eType.Int); + Analyze(GetPName.MaxCombinedVertexUniformComponents, eType.Int); + Analyze(GetPName.MaxFragmentUniformComponents, eType.Int); + Analyze(GetPName.MaxVertexUniformComponents, eType.Int); + + Analyze(GetPName.MaxCombinedUniformBlocks, eType.Int); + Analyze(GetPName.MaxFragmentUniformBlocks, eType.Int); + Analyze(GetPName.MaxGeometryUniformBlocks, eType.Int); + Analyze(GetPName.MaxVertexUniformBlocks, eType.Int); + Analyze(GetPName.MaxUniformBlockSize, eType.Int); + Analyze(GetPName.MaxUniformBufferBindings, eType.Int); + + Analyze(GetPName.MaxVaryingFloats, eType.Int); + + Trace.WriteLine("--- Transform Feedback ---"); + Analyze(GetPName.MaxTransformFeedbackInterleavedComponents, eType.Int); + Analyze(GetPName.MaxTransformFeedbackSeparateAttribs, eType.Int); + Analyze(GetPName.MaxTransformFeedbackSeparateComponents, eType.Int); + + Trace.WriteLine("--- Fixed-Func Stacks, GL.Push* and GL.Pop* ---"); + Analyze(GetPName.MaxClientAttribStackDepth, eType.Int); + Analyze(GetPName.MaxAttribStackDepth, eType.Int); + Analyze(GetPName.MaxProjectionStackDepth, eType.Int); + Analyze(GetPName.MaxModelviewStackDepth, eType.Int); + Analyze(GetPName.MaxTextureStackDepth, eType.Int); + Analyze(GetPName.MaxNameStackDepth, eType.Int); + + Trace.WriteLine("--- Fixed-Func misc. stuff ---"); + Analyze(GetPName.MaxEvalOrder, eType.Int); + Analyze(GetPName.MaxClipPlanes, eType.Int); + Analyze(GetPName.MaxArrayTextureLayers, eType.Int); + Analyze(GetPName.MaxListNesting, eType.Int); + Analyze(GetPName.MaxLights, eType.Int); + Analyze(GetPName.MaxTextureCoords, eType.Int); + + this.Exit(); + } + + /// + /// Called when your window is resized. Set your viewport here. It is also + /// a good place to set up your projection matrix (which probably changes + /// along when the aspect ratio of your window). + /// + /// Not used. + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + GL.Viewport(ClientRectangle); + } + + /// + /// Called when it is time to setup the next frame. Add you game logic here. + /// + /// Contains timing information for framerate independent logic. + protected override void OnUpdateFrame(FrameEventArgs e) + { + base.OnUpdateFrame(e); + + if (Keyboard[Key.Escape]) + Exit(); + } + + /// + /// Called when it is time to render the next frame. Add your rendering code here. + /// + /// Contains timing information. + protected override void OnRenderFrame(FrameEventArgs e) + { + base.OnRenderFrame(e); + } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // The 'using' idiom guarantees proper resource cleanup. + // We request 30 UpdateFrame events per second, and unlimited + // RenderFrame events (as fast as the computer can handle). + using (GLDiagnostics game = new GLDiagnostics()) + { + game.Run(10.0); + } + } + } +} \ No newline at end of file diff --git a/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.rtf b/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.rtf new file mode 100644 index 0000000000000000000000000000000000000000..662fae65ad27848081e5929388d0fb6f5f870321 GIT binary patch literal 477 zcmYk2Piw<448?aY>^tbZLrBtgZ1gmC7=!&g?5K;A$cd>VXR^Gmlz#WQO$P%bWc>5f zdpe+~tqf80o&k%WDYhc z)K#}j?1hNy3LBrOt~O`t276)>qe0*`TBXh@tcz7u)cLH-`^^!*9qqP`yA`Ik!pTU7 zZT9C4_f@%EVuLo;cks+Ap-Zj0z}RGOv93?_^ Code + Code @@ -543,6 +544,7 @@ Always +