Files
LuaCsForBarotraumaEP/Libraries/MonoGame.Framework/Src/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs
2019-06-25 16:00:44 +03:00

121 lines
6.3 KiB
C#

// MonoGame - Copyright (C) The MonoGame Team
// This file is subject to the terms and conditions defined in
// file 'LICENSE.txt', which is part of this source code package.
#if OPENGL
using MonoGame.OpenGL;
using GetParamName = MonoGame.OpenGL.GetPName;
#endif
namespace Microsoft.Xna.Framework.Graphics
{
internal partial class GraphicsCapabilities
{
/// <summary>
/// True, if GL_ARB_framebuffer_object is supported; false otherwise.
/// </summary>
internal bool SupportsFramebufferObjectARB { get; private set; }
/// <summary>
/// True, if GL_EXT_framebuffer_object is supported; false otherwise.
/// </summary>
internal bool SupportsFramebufferObjectEXT { get; private set; }
/// <summary>
/// True, if GL_IMG_multisampled_render_to_texture is supported; false otherwise.
/// </summary>
internal bool SupportsFramebufferObjectIMG { get; private set; }
private void PlatformInitialize(GraphicsDevice device)
{
#if GLES
SupportsNonPowerOfTwo = GL.Extensions.Contains("GL_OES_texture_npot") ||
GL.Extensions.Contains("GL_ARB_texture_non_power_of_two") ||
GL.Extensions.Contains("GL_IMG_texture_npot") ||
GL.Extensions.Contains("GL_NV_texture_npot_2D_mipmap");
#else
// Unfortunately non PoT texture support is patchy even on desktop systems and we can't
// rely on the fact that GL2.0+ supposedly supports npot in the core.
// Reference: http://aras-p.info/blog/2012/10/17/non-power-of-two-textures/
SupportsNonPowerOfTwo = device._maxTextureSize >= 8192;
#endif
SupportsTextureFilterAnisotropic = GL.Extensions.Contains("GL_EXT_texture_filter_anisotropic");
#if GLES
SupportsDepth24 = GL.Extensions.Contains("GL_OES_depth24");
SupportsPackedDepthStencil = GL.Extensions.Contains("GL_OES_packed_depth_stencil");
SupportsDepthNonLinear = GL.Extensions.Contains("GL_NV_depth_nonlinear");
SupportsTextureMaxLevel = GL.Extensions.Contains("GL_APPLE_texture_max_level");
#else
SupportsDepth24 = true;
SupportsPackedDepthStencil = true;
SupportsDepthNonLinear = false;
SupportsTextureMaxLevel = true;
#endif
// Texture compression
SupportsS3tc = GL.Extensions.Contains("GL_EXT_texture_compression_s3tc") ||
GL.Extensions.Contains("GL_OES_texture_compression_S3TC") ||
GL.Extensions.Contains("GL_EXT_texture_compression_dxt3") ||
GL.Extensions.Contains("GL_EXT_texture_compression_dxt5");
SupportsDxt1 = SupportsS3tc || GL.Extensions.Contains("GL_EXT_texture_compression_dxt1");
SupportsPvrtc = GL.Extensions.Contains("GL_IMG_texture_compression_pvrtc");
SupportsEtc1 = GL.Extensions.Contains("GL_OES_compressed_ETC1_RGB8_texture");
SupportsAtitc = GL.Extensions.Contains("GL_ATI_texture_compression_atitc") ||
GL.Extensions.Contains("GL_AMD_compressed_ATC_texture");
// Framebuffer objects
#if GLES
SupportsFramebufferObjectARB = GL.BoundApi == GL.RenderApi.ES && (device.glMajorVersion >= 2 || GL.Extensions.Contains("GL_ARB_framebuffer_object")); // always supported on GLES 2.0+
SupportsFramebufferObjectEXT = GL.Extensions.Contains("GL_EXT_framebuffer_object");;
SupportsFramebufferObjectIMG = GL.Extensions.Contains("GL_IMG_multisampled_render_to_texture") |
GL.Extensions.Contains("GL_APPLE_framebuffer_multisample") |
GL.Extensions.Contains("GL_EXT_multisampled_render_to_texture") |
GL.Extensions.Contains("GL_NV_framebuffer_multisample");
#else
// if we're on GL 3.0+, frame buffer extensions are guaranteed to be present, but extensions may be missing
// it is then safe to assume that GL_ARB_framebuffer_object is present so that the standard function are loaded
SupportsFramebufferObjectARB = device.glMajorVersion >= 3 || GL.Extensions.Contains("GL_ARB_framebuffer_object");
SupportsFramebufferObjectEXT = GL.Extensions.Contains("GL_EXT_framebuffer_object");
#endif
// Anisotropic filtering
int anisotropy = 0;
if (SupportsTextureFilterAnisotropic)
{
GL.GetInteger((GetPName)GetParamName.MaxTextureMaxAnisotropyExt, out anisotropy);
GraphicsExtensions.CheckGLError();
}
MaxTextureAnisotropy = anisotropy;
// sRGB
#if GLES
SupportsSRgb = GL.Extensions.Contains("GL_EXT_sRGB");
SupportsFloatTextures = GL.BoundApi == GL.RenderApi.ES && (device.glMajorVersion >= 3 || GL.Extensions.Contains("GL_EXT_color_buffer_float"));
SupportsHalfFloatTextures = GL.BoundApi == GL.RenderApi.ES && (device.glMajorVersion >= 3 || GL.Extensions.Contains("GL_EXT_color_buffer_half_float"));
SupportsNormalized = GL.BoundApi == GL.RenderApi.ES && (device.glMajorVersion >= 3 && GL.Extensions.Contains("GL_EXT_texture_norm16"));
#else
SupportsSRgb = GL.Extensions.Contains("GL_EXT_texture_sRGB") && GL.Extensions.Contains("GL_EXT_framebuffer_sRGB");
SupportsFloatTextures = GL.BoundApi == GL.RenderApi.GL && (device.glMajorVersion >= 3 || GL.Extensions.Contains("GL_ARB_texture_float"));
SupportsHalfFloatTextures = GL.BoundApi == GL.RenderApi.GL && (device.glMajorVersion >= 3 || GL.Extensions.Contains("GL_ARB_half_float_pixel"));;
SupportsNormalized = GL.BoundApi == GL.RenderApi.GL && (device.glMajorVersion >= 3 || GL.Extensions.Contains("GL_EXT_texture_norm16"));;
#endif
// TODO: Implement OpenGL support for texture arrays
// once we can author shaders that use texture arrays.
SupportsTextureArrays = false;
SupportsDepthClamp = GL.Extensions.Contains("GL_ARB_depth_clamp");
SupportsVertexTextures = false; // For now, until we implement vertex textures in OpenGL.
GL.GetInteger((GetPName)GetParamName.MaxSamples, out _maxMultiSampleCount);
SupportsInstancing = GL.VertexAttribDivisor != null;
}
}
}