2014-09-07 15:27:49 +00:00
/* * Copyright (C) 2011-2014 Gregory hainaut
2013-01-14 09:15:39 +00:00
* Copyright ( C ) 2007 - 2009 Gabest
*
* This Program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* This Program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with GNU Make ; see the file COPYING . If not , write to
* the Free Software Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA USA .
* http : //www.gnu.org/copyleft/gpl.html
*
*/
# include "stdafx.h"
# include "GLLoader.h"
2013-05-27 16:53:38 +00:00
# include "GSdx.h"
2013-01-14 09:15:39 +00:00
2013-07-13 11:39:45 +00:00
# ifndef ENABLE_GLES
2014-09-07 15:27:49 +00:00
PFNGLACTIVETEXTUREPROC gl_ActiveTexture = NULL ;
PFNGLBLENDCOLORPROC gl_BlendColor = NULL ;
PFNGLATTACHSHADERPROC gl_AttachShader = NULL ;
PFNGLBINDBUFFERPROC gl_BindBuffer = NULL ;
PFNGLBINDBUFFERBASEPROC gl_BindBufferBase = NULL ;
PFNGLBINDFRAMEBUFFERPROC gl_BindFramebuffer = NULL ;
PFNGLBINDSAMPLERPROC gl_BindSampler = NULL ;
PFNGLBINDVERTEXARRAYPROC gl_BindVertexArray = NULL ;
PFNGLBLENDEQUATIONSEPARATEIARBPROC gl_BlendEquationSeparateiARB = NULL ;
PFNGLBLENDFUNCSEPARATEIARBPROC gl_BlendFuncSeparateiARB = NULL ;
PFNGLBLITFRAMEBUFFERPROC gl_BlitFramebuffer = NULL ;
PFNGLBUFFERDATAPROC gl_BufferData = NULL ;
PFNGLCHECKFRAMEBUFFERSTATUSPROC gl_CheckFramebufferStatus = NULL ;
PFNGLCLEARBUFFERFVPROC gl_ClearBufferfv = NULL ;
PFNGLCLEARBUFFERIVPROC gl_ClearBufferiv = NULL ;
PFNGLCLEARBUFFERUIVPROC gl_ClearBufferuiv = NULL ;
PFNGLCOLORMASKIPROC gl_ColorMaski = NULL ;
PFNGLCOMPILESHADERPROC gl_CompileShader = NULL ;
PFNGLCREATEPROGRAMPROC gl_CreateProgram = NULL ;
PFNGLCREATESHADERPROC gl_CreateShader = NULL ;
PFNGLCREATESHADERPROGRAMVPROC gl_CreateShaderProgramv = NULL ;
PFNGLDELETEBUFFERSPROC gl_DeleteBuffers = NULL ;
PFNGLDELETEFRAMEBUFFERSPROC gl_DeleteFramebuffers = NULL ;
PFNGLDELETEPROGRAMPROC gl_DeleteProgram = NULL ;
PFNGLDELETESAMPLERSPROC gl_DeleteSamplers = NULL ;
PFNGLDELETESHADERPROC gl_DeleteShader = NULL ;
PFNGLDELETEVERTEXARRAYSPROC gl_DeleteVertexArrays = NULL ;
PFNGLDETACHSHADERPROC gl_DetachShader = NULL ;
PFNGLDRAWBUFFERSPROC gl_DrawBuffers = NULL ;
PFNGLDRAWELEMENTSBASEVERTEXPROC gl_DrawElementsBaseVertex = NULL ;
PFNGLENABLEVERTEXATTRIBARRAYPROC gl_EnableVertexAttribArray = NULL ;
PFNGLFRAMEBUFFERRENDERBUFFERPROC gl_FramebufferRenderbuffer = NULL ;
PFNGLFRAMEBUFFERTEXTURE2DPROC gl_FramebufferTexture2D = NULL ;
PFNGLGENBUFFERSPROC gl_GenBuffers = NULL ;
PFNGLGENFRAMEBUFFERSPROC gl_GenFramebuffers = NULL ;
PFNGLGENSAMPLERSPROC gl_GenSamplers = NULL ;
PFNGLGENVERTEXARRAYSPROC gl_GenVertexArrays = NULL ;
PFNGLGETBUFFERPARAMETERIVPROC gl_GetBufferParameteriv = NULL ;
PFNGLGETDEBUGMESSAGELOGARBPROC gl_GetDebugMessageLogARB = NULL ;
2014-09-27 16:57:17 +00:00
PFNGLDEBUGMESSAGECALLBACKPROC gl_DebugMessageCallback = NULL ;
2014-09-07 15:27:49 +00:00
PFNGLGETPROGRAMINFOLOGPROC gl_GetProgramInfoLog = NULL ;
PFNGLGETPROGRAMIVPROC gl_GetProgramiv = NULL ;
PFNGLGETSHADERIVPROC gl_GetShaderiv = NULL ;
PFNGLGETSTRINGIPROC gl_GetStringi = NULL ;
PFNGLISFRAMEBUFFERPROC gl_IsFramebuffer = NULL ;
PFNGLLINKPROGRAMPROC gl_LinkProgram = NULL ;
PFNGLMAPBUFFERPROC gl_MapBuffer = NULL ;
PFNGLMAPBUFFERRANGEPROC gl_MapBufferRange = NULL ;
PFNGLPROGRAMPARAMETERIPROC gl_ProgramParameteri = NULL ;
PFNGLSAMPLERPARAMETERFPROC gl_SamplerParameterf = NULL ;
PFNGLSAMPLERPARAMETERIPROC gl_SamplerParameteri = NULL ;
PFNGLSHADERSOURCEPROC gl_ShaderSource = NULL ;
PFNGLUNIFORM1IPROC gl_Uniform1i = NULL ;
PFNGLUNMAPBUFFERPROC gl_UnmapBuffer = NULL ;
PFNGLUSEPROGRAMSTAGESPROC gl_UseProgramStages = NULL ;
PFNGLVERTEXATTRIBIPOINTERPROC gl_VertexAttribIPointer = NULL ;
PFNGLVERTEXATTRIBPOINTERPROC gl_VertexAttribPointer = NULL ;
PFNGLBUFFERSUBDATAPROC gl_BufferSubData = NULL ;
PFNGLFENCESYNCPROC gl_FenceSync = NULL ;
PFNGLDELETESYNCPROC gl_DeleteSync = NULL ;
PFNGLCLIENTWAITSYNCPROC gl_ClientWaitSync = NULL ;
PFNGLFLUSHMAPPEDBUFFERRANGEPROC gl_FlushMappedBufferRange = NULL ;
2013-08-10 19:43:59 +00:00
// GL4.0
2014-09-07 15:27:49 +00:00
PFNGLUNIFORMSUBROUTINESUIVPROC gl_UniformSubroutinesuiv = NULL ;
2013-08-10 19:43:59 +00:00
// GL4.1
2014-09-07 15:27:49 +00:00
PFNGLBINDPROGRAMPIPELINEPROC gl_BindProgramPipeline = NULL ;
PFNGLGENPROGRAMPIPELINESPROC gl_GenProgramPipelines = NULL ;
PFNGLDELETEPROGRAMPIPELINESPROC gl_DeleteProgramPipelines = NULL ;
PFNGLGETPROGRAMPIPELINEIVPROC gl_GetProgramPipelineiv = NULL ;
PFNGLVALIDATEPROGRAMPIPELINEPROC gl_ValidateProgramPipeline = NULL ;
PFNGLGETPROGRAMPIPELINEINFOLOGPROC gl_GetProgramPipelineInfoLog = NULL ;
2013-05-19 12:42:55 +00:00
// NO GL4.1
2014-09-07 15:27:49 +00:00
PFNGLUSEPROGRAMPROC gl_UseProgram = NULL ;
PFNGLGETSHADERINFOLOGPROC gl_GetShaderInfoLog = NULL ;
PFNGLPROGRAMUNIFORM1IPROC gl_ProgramUniform1i = NULL ;
2013-05-19 12:42:55 +00:00
// NO GL4.2
2014-09-07 15:27:49 +00:00
PFNGLGETUNIFORMBLOCKINDEXPROC gl_GetUniformBlockIndex = NULL ;
PFNGLUNIFORMBLOCKBINDINGPROC gl_UniformBlockBinding = NULL ;
PFNGLGETUNIFORMLOCATIONPROC gl_GetUniformLocation = NULL ;
2013-08-03 08:29:01 +00:00
// GL4.3
2014-09-07 15:27:49 +00:00
PFNGLCOPYIMAGESUBDATAPROC gl_CopyImageSubData = NULL ;
2013-07-28 14:40:43 +00:00
// GL4.2
2014-09-07 15:27:49 +00:00
PFNGLBINDIMAGETEXTUREPROC gl_BindImageTexture = NULL ;
PFNGLMEMORYBARRIERPROC gl_MemoryBarrier = NULL ;
PFNGLTEXSTORAGE2DPROC gl_TexStorage2D = NULL ;
2013-08-02 16:38:12 +00:00
// GL4.4
2014-09-07 15:27:49 +00:00
PFNGLCLEARTEXIMAGEPROC gl_ClearTexImage = NULL ;
PFNGLBUFFERSTORAGEPROC gl_BufferStorage = NULL ;
2013-08-17 08:57:52 +00:00
// GL_ARB_bindless_texture (GL5?)
2014-09-07 15:27:49 +00:00
PFNGLGETTEXTURESAMPLERHANDLEARBPROC gl_GetTextureSamplerHandleARB = NULL ;
PFNGLMAKETEXTUREHANDLERESIDENTARBPROC gl_MakeTextureHandleResidentARB = NULL ;
2013-08-17 08:57:52 +00:00
PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC gl_MakeTextureHandleNonResidentARB = NULL ;
2014-09-07 15:27:49 +00:00
PFNGLUNIFORMHANDLEUI64VARBPROC gl_UniformHandleui64vARB = NULL ;
PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC gl_ProgramUniformHandleui64vARB = NULL ;
// GL4.5
PFNGLCREATETEXTURESPROC gl_CreateTextures = NULL ;
PFNGLTEXTURESTORAGE2DPROC gl_TextureStorage2D = NULL ;
PFNGLTEXTURESUBIMAGE2DPROC gl_TextureSubImage2D = NULL ;
PFNGLCOPYTEXTURESUBIMAGE2DPROC gl_CopyTextureSubImage2D = NULL ;
PFNGLBINDTEXTUREUNITPROC gl_BindTextureUnit = NULL ;
PFNGLGETTEXTUREIMAGEPROC gl_GetTextureImage = NULL ;
PFNGLCREATEFRAMEBUFFERSPROC gl_CreateFramebuffers = NULL ;
PFNGLCLEARNAMEDFRAMEBUFFERFVPROC gl_ClearNamedFramebufferfv = NULL ;
PFNGLCLEARNAMEDFRAMEBUFFERIVPROC gl_ClearNamedFramebufferiv = NULL ;
PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC gl_ClearNamedFramebufferuiv = NULL ;
PFNGLNAMEDFRAMEBUFFERTEXTUREPROC gl_NamedFramebufferTexture = NULL ;
PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC gl_NamedFramebufferDrawBuffers = NULL ;
PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC gl_NamedFramebufferReadBuffer = NULL ;
PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC gl_CheckNamedFramebufferStatus = NULL ;
PFNGLCREATEBUFFERSPROC gl_CreateBuffers = NULL ;
PFNGLNAMEDBUFFERSTORAGEPROC gl_NamedBufferStorage = NULL ;
PFNGLNAMEDBUFFERDATAPROC gl_NamedBufferData = NULL ;
PFNGLNAMEDBUFFERSUBDATAPROC gl_NamedBufferSubData = NULL ;
PFNGLMAPNAMEDBUFFERPROC gl_MapNamedBuffer = NULL ;
PFNGLMAPNAMEDBUFFERRANGEPROC gl_MapNamedBufferRange = NULL ;
PFNGLUNMAPNAMEDBUFFERPROC gl_UnmapNamedBuffer = NULL ;
PFNGLCREATESAMPLERSPROC gl_CreateSamplers = NULL ;
PFNGLCREATEPROGRAMPIPELINESPROC gl_CreateProgramPipelines = NULL ;
PFNGLCLIPCONTROLPROC gl_ClipControl = NULL ;
2014-01-31 21:30:54 +00:00
2013-07-13 11:39:45 +00:00
# endif
2013-01-14 09:15:39 +00:00
namespace GLLoader {
2014-03-29 09:47:53 +00:00
bool fglrx_buggy_driver = false ;
bool mesa_amd_buggy_driver = false ;
bool nvidia_buggy_driver = false ;
bool intel_buggy_driver = false ;
bool in_replayer = false ;
2013-07-11 17:08:42 +00:00
2013-08-03 08:29:01 +00:00
// Optional
2013-05-19 12:42:55 +00:00
bool found_GL_ARB_separate_shader_objects = false ;
2014-09-30 20:04:42 +00:00
bool found_geometry_shader = true ; // we require GL3.3 so geometry must be supported by default
2013-08-17 08:57:52 +00:00
bool found_GL_ARB_clear_texture = false ; // Don't know if GL3 GPU can support it
2013-08-03 08:29:01 +00:00
bool found_GL_ARB_buffer_storage = false ;
2013-08-28 08:44:16 +00:00
bool found_GL_ARB_explicit_uniform_location = false ; // need by subroutine
2013-08-03 08:29:01 +00:00
// GL4 hardware
2013-08-17 08:57:52 +00:00
bool found_GL_ARB_copy_image = false ; // Not sure actually maybe GL3 GPU can do it
2013-06-16 16:33:08 +00:00
bool found_GL_ARB_gpu_shader5 = false ;
2014-03-29 09:47:53 +00:00
bool found_GL_ARB_shader_image_load_store = false ; // GLES3.1
2013-08-10 19:43:59 +00:00
bool found_GL_ARB_shader_subroutine = false ;
2013-08-17 08:57:52 +00:00
bool found_GL_ARB_bindless_texture = false ; // GL5 GPU?
2013-08-03 08:29:01 +00:00
2014-09-07 15:27:49 +00:00
// GL4.5 for the future (dx10/dx11 compatibility)
bool found_GL_ARB_clip_control = false ;
bool found_GL_ARB_direct_state_access = false ;
2013-08-03 08:29:01 +00:00
// Mandatory for FULL GL (but optional for GLES)
2014-03-24 09:53:40 +00:00
bool found_GL_ARB_shading_language_420pack = false ; // GLES 3.1 ???
2013-08-03 08:29:01 +00:00
2014-09-30 19:56:36 +00:00
// Mandatory for opengl ES (allow to use GL code)
bool found_GL_EXT_shader_io_blocks = false ;
2013-08-03 08:29:01 +00:00
// Mandatory
bool found_GL_ARB_texture_storage = false ;
static bool status_and_override ( bool & found , const std : : string & name , bool mandatory = false )
{
if ( ! found ) {
2014-09-07 15:27:49 +00:00
fprintf ( stderr , " INFO: %s is NOT SUPPORTED \n " , name . c_str ( ) ) ;
2013-08-03 08:29:01 +00:00
if ( mandatory ) return false ;
2014-02-01 11:11:14 +00:00
} else {
2014-09-07 15:27:49 +00:00
fprintf ( stderr , " INFO: %s is available \n " , name . c_str ( ) ) ;
2013-08-03 08:29:01 +00:00
}
std : : string opt ( " override_ " ) ;
opt + = name ;
if ( theApp . GetConfig ( opt . c_str ( ) , - 1 ) ! = - 1 ) {
found = ! ! theApp . GetConfig ( opt . c_str ( ) , - 1 ) ;
fprintf ( stderr , " Override %s detection (%s) \n " , name . c_str ( ) , found ? " Enabled " : " Disabled " ) ;
}
return true ;
}
2013-05-19 12:42:55 +00:00
2013-01-14 09:15:39 +00:00
bool check_gl_version ( uint32 major , uint32 minor ) {
2013-05-19 12:42:55 +00:00
const GLubyte * s = glGetString ( GL_VERSION ) ;
2013-07-28 14:40:43 +00:00
if ( s = = NULL ) {
fprintf ( stderr , " Error: GLLoader failed to get GL version \n " ) ;
return false ;
}
2013-05-19 12:42:55 +00:00
2013-06-11 11:14:26 +00:00
const char * vendor = ( const char * ) glGetString ( GL_VENDOR ) ;
fprintf ( stderr , " Supported Opengl version: %s on GPU: %s. Vendor: %s \n " , s , glGetString ( GL_RENDERER ) , vendor ) ;
2014-04-12 10:40:23 +00:00
# ifndef ENABLE_GLES
2014-03-29 09:47:53 +00:00
fprintf ( stderr , " Note: the maximal version supported by GSdx is 3.3 (even if you driver support more)! \n " ) ;
2014-04-12 10:40:23 +00:00
# endif
2013-06-11 11:14:26 +00:00
// Name change but driver is still bad!
if ( strstr ( vendor , " ATI " ) | | strstr ( vendor , " Advanced Micro Devices " ) )
2013-05-19 12:42:55 +00:00
fglrx_buggy_driver = true ;
2013-07-11 17:08:42 +00:00
if ( strstr ( vendor , " NVIDIA Corporation " ) )
nvidia_buggy_driver = true ;
2013-12-30 09:30:10 +00:00
if ( strstr ( vendor , " Intel " ) )
intel_buggy_driver = true ;
2014-03-29 09:47:53 +00:00
if ( strstr ( vendor , " X.Org " ) ) // Note: it might actually catch nouveau too, but bug are likely to be the same anyway
mesa_amd_buggy_driver = true ;
2013-01-14 09:15:39 +00:00
GLuint dot = 0 ;
while ( s [ dot ] ! = ' \0 ' & & s [ dot ] ! = ' . ' ) dot + + ;
if ( dot = = 0 ) return false ;
GLuint major_gl = s [ dot - 1 ] - ' 0 ' ;
GLuint minor_gl = s [ dot + 1 ] - ' 0 ' ;
2013-07-12 21:12:34 +00:00
# ifndef ENABLE_GLES
2014-03-29 09:47:53 +00:00
if ( mesa_amd_buggy_driver | | intel_buggy_driver ) {
2013-07-11 17:08:42 +00:00
fprintf ( stderr , " Buggy driver detected. Geometry shaders will be disabled \n " ) ;
found_geometry_shader = false ;
}
2013-05-27 16:53:38 +00:00
if ( theApp . GetConfig ( " override_geometry_shader " , - 1 ) ! = - 1 ) {
found_geometry_shader = ! ! theApp . GetConfig ( " override_geometry_shader " , - 1 ) ;
fprintf ( stderr , " Override geometry shaders detection \n " ) ;
}
2013-07-12 21:12:34 +00:00
# else
found_geometry_shader = false ;
# endif
2014-04-12 10:40:23 +00:00
# ifndef ENABLE_GLES
2013-01-14 09:15:39 +00:00
if ( ( major_gl < major ) | | ( major_gl = = major & & minor_gl < minor ) ) {
2013-05-19 09:19:20 +00:00
fprintf ( stderr , " OPENGL %d.%d is not supported \n " , major , minor ) ;
2013-01-14 09:15:39 +00:00
return false ;
}
2014-04-12 10:40:23 +00:00
# endif
2013-01-14 09:15:39 +00:00
return true ;
}
bool check_gl_supported_extension ( ) {
int max_ext = 0 ;
glGetIntegerv ( GL_NUM_EXTENSIONS , & max_ext ) ;
2013-05-19 09:19:20 +00:00
if ( gl_GetStringi & & max_ext ) {
2013-01-14 09:15:39 +00:00
for ( GLint i = 0 ; i < max_ext ; i + + ) {
2013-05-19 09:19:20 +00:00
string ext ( ( const char * ) gl_GetStringi ( GL_EXTENSIONS , i ) ) ;
2014-09-30 19:56:36 +00:00
# ifndef ENABLE_GLES
2014-09-27 17:12:30 +00:00
// GL4.0
if ( ext . compare ( " GL_ARB_gpu_shader5 " ) = = 0 ) found_GL_ARB_gpu_shader5 = true ;
// GL4.1
2013-01-14 09:15:39 +00:00
if ( ext . compare ( " GL_ARB_separate_shader_objects " ) = = 0 ) {
2014-08-23 15:09:38 +00:00
if ( ! fglrx_buggy_driver & & ! mesa_amd_buggy_driver & & ! intel_buggy_driver ) found_GL_ARB_separate_shader_objects = true ;
2013-06-01 09:29:57 +00:00
else fprintf ( stderr , " Buggy driver detected, GL_ARB_separate_shader_objects will be disabled \n " ) ;
2013-01-14 09:15:39 +00:00
}
2013-08-10 19:43:59 +00:00
#if 0
2013-08-28 08:44:16 +00:00
// Erratum: on nvidia implementation, gain is very nice : 42.5 fps => 46.5 fps
//
2013-08-10 19:43:59 +00:00
// Strangely it doesn't provide the speed boost as expected.
// Note: only atst/colclip was replaced with subroutine for the moment. It replace 2000 program switch on
// colin mcrae 3 by 2100 uniform, but code is slower!
//
// Current hypothesis: the validation of useprogram is done in the "driver thread" whereas the extra function calls
// are done on the overloaded main threads.
// Apitrace profiling shows faster GPU draw times
if ( ext . compare ( " GL_ARB_shader_subroutine " ) = = 0 ) found_GL_ARB_shader_subroutine = true ;
# endif
2014-09-27 17:12:30 +00:00
// GL4.2
if ( ext . compare ( " GL_ARB_shading_language_420pack " ) = = 0 ) found_GL_ARB_shading_language_420pack = true ;
if ( ext . compare ( " GL_ARB_texture_storage " ) = = 0 ) found_GL_ARB_texture_storage = true ;
// Only enable this extension on nvidia
if ( nvidia_buggy_driver & & ext . compare ( " GL_ARB_shader_image_load_store " ) = = 0 ) found_GL_ARB_shader_image_load_store = true ;
// GL4.3
if ( ext . compare ( " GL_ARB_copy_image " ) = = 0 ) found_GL_ARB_copy_image = true ;
if ( ext . compare ( " GL_ARB_explicit_uniform_location " ) = = 0 ) found_GL_ARB_explicit_uniform_location = true ;
// GL4.4
if ( ext . compare ( " GL_ARB_buffer_storage " ) = = 0 ) found_GL_ARB_buffer_storage = true ;
2013-08-02 16:38:12 +00:00
if ( ext . compare ( " GL_ARB_clear_texture " ) = = 0 ) found_GL_ARB_clear_texture = true ;
2013-08-17 08:57:52 +00:00
if ( ext . compare ( " GL_ARB_bindless_texture " ) = = 0 ) found_GL_ARB_bindless_texture = true ;
2014-09-15 20:28:35 +00:00
// GL4.5
if ( ext . compare ( " GL_ARB_direct_state_access " ) = = 0 ) found_GL_ARB_direct_state_access = true ;
if ( ext . compare ( " GL_ARB_clip_control " ) = = 0 ) found_GL_ARB_clip_control = true ;
2014-09-30 19:56:36 +00:00
# else // ENABLE_GLES
if ( ext . compare ( " GL_EXT_shader_io_blocks " ) = = 0 ) found_GL_EXT_shader_io_blocks = true ;
2013-07-12 21:12:34 +00:00
# endif
2014-09-30 19:56:36 +00:00
//fprintf(stderr, "DEBUG ext: %s\n", ext.c_str());
2013-01-14 09:15:39 +00:00
}
}
2013-08-03 08:29:01 +00:00
bool status = true ;
fprintf ( stderr , " \n " ) ;
2013-01-14 09:15:39 +00:00
2014-09-30 19:56:36 +00:00
# ifndef ENABLE_GLES
2014-09-27 17:12:30 +00:00
// GL4.0
2013-08-03 08:29:01 +00:00
status & = status_and_override ( found_GL_ARB_gpu_shader5 , " GL_ARB_gpu_shader5 " ) ;
2014-09-27 17:12:30 +00:00
// GL4.1
status & = status_and_override ( found_GL_ARB_separate_shader_objects , " GL_ARB_separate_shader_objects " ) ;
2013-08-10 19:43:59 +00:00
status & = status_and_override ( found_GL_ARB_shader_subroutine , " GL_ARB_shader_subroutine " ) ;
2014-09-27 17:12:30 +00:00
// GL4.2
status & = status_and_override ( found_GL_ARB_shader_image_load_store , " GL_ARB_shader_image_load_store " ) ;
status & = status_and_override ( found_GL_ARB_shading_language_420pack , " GL_ARB_shading_language_420pack " ) ; // Mostly mandatory. Some Nvidia driver failed to report it correctly
2013-08-03 08:29:01 +00:00
status & = status_and_override ( found_GL_ARB_texture_storage , " GL_ARB_texture_storage " , true ) ;
2014-09-27 17:12:30 +00:00
// GL4.3
status & = status_and_override ( found_GL_ARB_explicit_uniform_location , " GL_ARB_explicit_uniform_location " ) ;
status & = status_and_override ( found_GL_ARB_copy_image , " GL_ARB_copy_image " ) ;
// GL4.4
status & = status_and_override ( found_GL_ARB_buffer_storage , " GL_ARB_buffer_storage " ) ;
2013-08-17 08:57:52 +00:00
status & = status_and_override ( found_GL_ARB_bindless_texture , " GL_ARB_bindless_texture " ) ;
2014-09-27 17:12:30 +00:00
status & = status_and_override ( found_GL_ARB_clear_texture , " GL_ARB_clear_texture " ) ;
// GL4.5
2014-09-07 15:27:49 +00:00
status & = status_and_override ( found_GL_ARB_clip_control , " GL_ARB_clip_control " ) ;
2014-09-28 10:11:22 +00:00
status & = status_and_override ( found_GL_ARB_direct_state_access , " GL_ARB_direct_state_access " ) ;
2014-09-30 19:56:36 +00:00
# else // ENABLE_GLES
status & = status_and_override ( found_GL_EXT_shader_io_blocks , " GL_EXT_shader_io_blocks " ) ;
# endif
2014-09-07 15:27:49 +00:00
2013-08-03 08:29:01 +00:00
fprintf ( stderr , " \n " ) ;
2013-05-26 13:05:03 +00:00
2013-08-03 08:29:01 +00:00
return status ;
2013-01-14 09:15:39 +00:00
}
}