1 2 // Copyright Michael D. Parker 2018. 3 // Distributed under the Boost Software License, Version 1.0. 4 // (See accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 7 module bindbc.opengl.bind.arb.core_41; 8 9 import bindbc.loader; 10 import bindbc.opengl.config, 11 bindbc.opengl.context; 12 import bindbc.opengl.bind.types; 13 14 static if(glSupport >= GLSupport.gl41) { 15 enum has41 = true; 16 } 17 else enum has41 = false; 18 19 // ARB_ES2_compatibility 20 version(GL_ARB) enum useARBES2Compatibility = true; 21 else version(GL_ARB_ES2_compatibility) enum useARBES2Compatibility = true; 22 else enum useARBES2Compatibility = has41; 23 24 static if(useARBES2Compatibility) { 25 private bool _hasARBES2Compatibility; 26 bool hasARBES2Compatibility() { return _hasARBES2Compatibility; } 27 28 enum : uint { 29 GL_FIXED = 0x140C, 30 GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, 31 GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B, 32 GL_LOW_FLOAT = 0x8DF0, 33 GL_MEDIUM_FLOAT = 0x8DF1, 34 GL_HIGH_FLOAT = 0x8DF2, 35 GL_LOW_INT = 0x8DF3, 36 GL_MEDIUM_INT = 0x8DF4, 37 GL_HIGH_INT = 0x8DF5, 38 GL_SHADER_COMPILER = 0x8DFA, 39 GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9, 40 GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, 41 GL_MAX_VARYING_VECTORS = 0x8DFC, 42 GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, 43 } 44 45 extern(System) @nogc nothrow { 46 alias pglReleaseShaderCompiler = void function(); 47 alias pglShaderBinary = void function(GLsizei, const(GLuint)*, GLenum, const(GLvoid)*, GLsizei); 48 alias pglGetShaderPrecisionFormat = void function(GLenum, GLenum, GLint*, GLint*); 49 alias pglDepthRangef = void function(GLclampf, GLclampf); 50 alias pglClearDepthf = void function(GLclampf); 51 } 52 53 __gshared { 54 pglReleaseShaderCompiler glReleaseShaderCompiler; 55 pglShaderBinary glShaderBinary; 56 pglGetShaderPrecisionFormat glGetShaderPrecisionFormat; 57 pglDepthRangef glDepthRangef; 58 pglClearDepthf glClearDepthf; 59 } 60 61 private @nogc nothrow 62 bool loadARBES2Compatibility(SharedLib lib, GLSupport contextVersion) 63 { 64 lib.bindGLSymbol(cast(void**)&glReleaseShaderCompiler, "glReleaseShaderCompiler"); 65 lib.bindGLSymbol(cast(void**)&glShaderBinary, "glShaderBinary"); 66 lib.bindGLSymbol(cast(void**)&glGetShaderPrecisionFormat, "glGetShaderPrecisionFormat"); 67 lib.bindGLSymbol(cast(void**)&glDepthRangef, "glDepthRangef"); 68 lib.bindGLSymbol(cast(void**)&glClearDepthf, "glClearDepthf"); 69 return resetErrorCountGL(); 70 } 71 } 72 else enum hasARBES2Compatibility = false; 73 74 // ARB_get_program_binary 75 version(GL_ARB) enum useARBGetProgramBinary = true; 76 else version(GL_ARB_get_program_binary) enum useARBGetProgramBinary = true; 77 else enum useARBGetProgramBinary = has41; 78 79 static if(useARBGetProgramBinary) { 80 private bool _hasARBGetProgramBinary; 81 bool hasARBGetProgramBinary() { return _hasARBGetProgramBinary; } 82 83 enum : uint { 84 GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257, 85 GL_PROGRAM_BINARY_LENGTH = 0x8741, 86 GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE, 87 GL_PROGRAM_BINARY_FORMATS = 0x87FF, 88 } 89 90 extern(System) @nogc nothrow { 91 alias pglGetProgramBinary = void function(GLuint,GLsizei,GLsizei*,GLenum*,GLvoid*); 92 alias pglProgramBinary = void function(GLuint,GLenum,const(GLvoid)*,GLsizei); 93 alias pglProgramParameteri = void function(GLuint,GLenum,GLint); 94 } 95 96 __gshared { 97 pglGetProgramBinary glGetProgramBinary; 98 pglProgramBinary glProgramBinary; 99 pglProgramParameteri glProgramParameteri; 100 } 101 102 private @nogc nothrow 103 bool loadARBGetProgramBinary(SharedLib lib, GLSupport contextVersion) 104 { 105 lib.bindGLSymbol(cast(void**)&glGetProgramBinary,"glGetProgramBinary"); 106 lib.bindGLSymbol(cast(void**)&glProgramBinary,"glProgramBinary"); 107 lib.bindGLSymbol(cast(void**)&glProgramParameteri,"glProgramParameteri"); 108 return resetErrorCountGL(); 109 } 110 } 111 else enum hasARBGetProgramBinary = false; 112 113 // ARB_separate_shader_objects 114 version(GL_ARB) enum useARBSeparateShaderObjects = true; 115 else version(GL_ARB_separate_shader_objects) enum useARBSeparateShaderObjects = true; 116 else enum useARBSeparateShaderObjects = has41; 117 118 static if(useARBSeparateShaderObjects) { 119 private bool _hasARBSeparateShaderObjects; 120 bool hasARBSeparateShaderObjects() { return _hasARBSeparateShaderObjects; } 121 122 enum : uint { 123 GL_VERTEX_SHADER_BIT = 0x00000001, 124 GL_FRAGMENT_SHADER_BIT = 0x00000002, 125 GL_GEOMETRY_SHADER_BIT = 0x00000004, 126 GL_TESS_CONTROL_SHADER_BIT = 0x00000008, 127 GL_TESS_EVALUATION_SHADER_BIT = 0x00000010, 128 GL_ALL_SHADER_BITS = 0xFFFFFFFF, 129 GL_PROGRAM_SEPARABLE = 0x8258, 130 GL_ACTIVE_PROGRAM = 0x8259, 131 GL_PROGRAM_PIPELINE_BINDING = 0x825A, 132 } 133 134 extern(System) @nogc nothrow { 135 alias pglUseProgramStages = void function(GLuint, GLbitfield, GLuint); 136 alias pglActiveShaderProgram = void function(GLuint, GLuint); 137 alias pglCreateShaderProgramv = GLuint function(GLenum, GLsizei, const(GLchar*)*); 138 alias pglBindProgramPipeline = void function(GLuint); 139 alias pglDeleteProgramPipelines = void function(GLsizei, const(GLuint)*); 140 alias pglGenProgramPipelines = void function(GLsizei, GLuint*); 141 alias pglIsProgramPipeline = GLboolean function(GLuint); 142 alias pglGetProgramPipelineiv = void function(GLuint, GLenum, GLint*); 143 alias pglProgramUniform1i = void function(GLuint, GLint, GLint); 144 alias pglProgramUniform1iv = void function(GLuint, GLint, GLsizei, const(GLint)*); 145 alias pglProgramUniform1f = void function(GLuint, GLint, GLfloat); 146 alias pglProgramUniform1fv = void function(GLuint, GLint, GLsizei, const(GLfloat)*); 147 alias pglProgramUniform1d = void function(GLuint, GLint, GLdouble); 148 alias pglProgramUniform1dv = void function(GLuint, GLint, GLsizei, const(GLdouble)*); 149 alias pglProgramUniform1ui = void function(GLuint, GLint, GLuint); 150 alias pglProgramUniform1uiv = void function(GLuint, GLint, GLsizei, const(GLuint)*); 151 alias pglProgramUniform2i = void function(GLuint, GLint, GLint, GLint); 152 alias pglProgramUniform2iv = void function(GLuint, GLint, GLsizei, const(GLint)*); 153 alias pglProgramUniform2f = void function(GLuint, GLint, GLfloat, GLfloat); 154 alias pglProgramUniform2fv = void function(GLuint, GLint, GLsizei, const(GLfloat)*); 155 alias pglProgramUniform2d = void function(GLuint, GLint, GLdouble, GLdouble); 156 alias pglProgramUniform2dv = void function(GLuint, GLint, GLsizei, const(GLdouble)*); 157 alias pglProgramUniform2ui = void function(GLuint, GLint, GLuint, GLuint); 158 alias pglProgramUniform2uiv = void function(GLuint, GLint, GLsizei, const(GLuint)*); 159 alias pglProgramUniform3i = void function(GLuint, GLint, GLint, GLint, GLint); 160 alias pglProgramUniform3iv = void function(GLuint, GLint, GLsizei, const(GLint)*); 161 alias pglProgramUniform3f = void function(GLuint, GLint, GLfloat, GLfloat, GLfloat); 162 alias pglProgramUniform3fv = void function(GLuint, GLint, GLsizei, const(GLfloat)*); 163 alias pglProgramUniform3d = void function(GLuint, GLint, GLdouble, GLdouble, GLdouble); 164 alias pglProgramUniform3dv = void function(GLuint, GLint, GLsizei, const(GLdouble)*); 165 alias pglProgramUniform3ui = void function(GLuint, GLint, GLuint, GLuint, GLuint); 166 alias pglProgramUniform3uiv = void function(GLuint, GLint, GLsizei, const(GLuint)*); 167 alias pglProgramUniform4i = void function(GLuint, GLint, GLint, GLint, GLint, GLint); 168 alias pglProgramUniform4iv = void function(GLuint, GLint, GLsizei, const(GLint)*); 169 alias pglProgramUniform4f = void function(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat); 170 alias pglProgramUniform4fv = void function(GLuint, GLint, GLsizei, const(GLfloat)*); 171 alias pglProgramUniform4d = void function(GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble); 172 alias pglProgramUniform4dv = void function(GLuint, GLint, GLsizei, const(GLdouble)*); 173 alias pglProgramUniform4ui = void function(GLuint, GLint, GLuint, GLuint, GLuint, GLuint); 174 alias pglProgramUniform4uiv = void function(GLuint, GLint, GLsizei, const(GLuint)*); 175 alias pglProgramUniformMatrix2fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*); 176 alias pglProgramUniformMatrix3fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*); 177 alias pglProgramUniformMatrix4fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*); 178 alias pglProgramUniformMatrix2dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*); 179 alias pglProgramUniformMatrix3dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*); 180 alias pglProgramUniformMatrix4dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*); 181 alias pglProgramUniformMatrix2x3fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*); 182 alias pglProgramUniformMatrix3x2fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*); 183 alias pglProgramUniformMatrix2x4fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*); 184 alias pglProgramUniformMatrix4x2fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*); 185 alias pglProgramUniformMatrix3x4fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*); 186 alias pglProgramUniformMatrix4x3fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*); 187 alias pglProgramUniformMatrix2x3dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*); 188 alias pglProgramUniformMatrix3x2dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*); 189 alias pglProgramUniformMatrix2x4dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*); 190 alias pglProgramUniformMatrix4x2dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*); 191 alias pglProgramUniformMatrix3x4dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*); 192 alias pglProgramUniformMatrix4x3dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*); 193 alias pglValidateProgramPipeline = void function(GLuint); 194 alias pglGetProgramPipelineInfoLog = void function(GLuint, GLsizei, GLsizei*, GLchar*); 195 } 196 197 __gshared { 198 pglUseProgramStages glUseProgramStages; 199 pglActiveShaderProgram glActiveShaderProgram; 200 pglCreateShaderProgramv glCreateShaderProgramv; 201 pglBindProgramPipeline glBindProgramPipeline; 202 pglDeleteProgramPipelines glDeleteProgramPipelines; 203 pglGenProgramPipelines glGenProgramPipelines; 204 pglIsProgramPipeline glIsProgramPipeline; 205 pglGetProgramPipelineiv glGetProgramPipelineiv; 206 pglProgramUniform1i glProgramUniform1i; 207 pglProgramUniform1iv glProgramUniform1iv; 208 pglProgramUniform1f glProgramUniform1f; 209 pglProgramUniform1fv glProgramUniform1fv; 210 pglProgramUniform1d glProgramUniform1d; 211 pglProgramUniform1dv glProgramUniform1dv; 212 pglProgramUniform1ui glProgramUniform1ui; 213 pglProgramUniform1uiv glProgramUniform1uiv; 214 pglProgramUniform2i glProgramUniform2i; 215 pglProgramUniform2iv glProgramUniform2iv; 216 pglProgramUniform2f glProgramUniform2f; 217 pglProgramUniform2fv glProgramUniform2fv; 218 pglProgramUniform2d glProgramUniform2d; 219 pglProgramUniform2dv glProgramUniform2dv; 220 pglProgramUniform2ui glProgramUniform2ui; 221 pglProgramUniform2uiv glProgramUniform2uiv; 222 pglProgramUniform3i glProgramUniform3i; 223 pglProgramUniform3iv glProgramUniform3iv; 224 pglProgramUniform3f glProgramUniform3f; 225 pglProgramUniform3fv glProgramUniform3fv; 226 pglProgramUniform3d glProgramUniform3d; 227 pglProgramUniform3dv glProgramUniform3dv; 228 pglProgramUniform3ui glProgramUniform3ui; 229 pglProgramUniform3uiv glProgramUniform3uiv; 230 pglProgramUniform4i glProgramUniform4i; 231 pglProgramUniform4iv glProgramUniform4iv; 232 pglProgramUniform4f glProgramUniform4f; 233 pglProgramUniform4fv glProgramUniform4fv; 234 pglProgramUniform4d glProgramUniform4d; 235 pglProgramUniform4dv glProgramUniform4dv; 236 pglProgramUniform4ui glProgramUniform4ui; 237 pglProgramUniform4uiv glProgramUniform4uiv; 238 pglProgramUniformMatrix2fv glProgramUniformMatrix2fv; 239 pglProgramUniformMatrix3fv glProgramUniformMatrix3fv; 240 pglProgramUniformMatrix4fv glProgramUniformMatrix4fv; 241 pglProgramUniformMatrix2dv glProgramUniformMatrix2dv; 242 pglProgramUniformMatrix3dv glProgramUniformMatrix3dv; 243 pglProgramUniformMatrix4dv glProgramUniformMatrix4dv; 244 pglProgramUniformMatrix2x3fv glProgramUniformMatrix2x3fv; 245 pglProgramUniformMatrix3x2fv glProgramUniformMatrix3x2fv; 246 pglProgramUniformMatrix2x4fv glProgramUniformMatrix2x4fv; 247 pglProgramUniformMatrix4x2fv glProgramUniformMatrix4x2fv; 248 pglProgramUniformMatrix3x4fv glProgramUniformMatrix3x4fv; 249 pglProgramUniformMatrix4x3fv glProgramUniformMatrix4x3fv; 250 pglProgramUniformMatrix2x3dv glProgramUniformMatrix2x3dv; 251 pglProgramUniformMatrix3x2dv glProgramUniformMatrix3x2dv; 252 pglProgramUniformMatrix2x4dv glProgramUniformMatrix2x4dv; 253 pglProgramUniformMatrix4x2dv glProgramUniformMatrix4x2dv; 254 pglProgramUniformMatrix3x4dv glProgramUniformMatrix3x4dv; 255 pglProgramUniformMatrix4x3dv glProgramUniformMatrix4x3dv; 256 pglValidateProgramPipeline glValidateProgramPipeline; 257 pglGetProgramPipelineInfoLog glGetProgramPipelineInfoLog; 258 } 259 260 private @nogc nothrow 261 bool loadARBSeparateShaderObjects(SharedLib lib, GLSupport contextVersion) 262 { 263 lib.bindGLSymbol(cast(void**)&glUseProgramStages, "glUseProgramStages"); 264 lib.bindGLSymbol(cast(void**)&glActiveShaderProgram, "glActiveShaderProgram"); 265 lib.bindGLSymbol(cast(void**)&glCreateShaderProgramv, "glCreateShaderProgramv"); 266 lib.bindGLSymbol(cast(void**)&glBindProgramPipeline, "glBindProgramPipeline"); 267 lib.bindGLSymbol(cast(void**)&glDeleteProgramPipelines, "glDeleteProgramPipelines"); 268 lib.bindGLSymbol(cast(void**)&glGenProgramPipelines, "glGenProgramPipelines"); 269 lib.bindGLSymbol(cast(void**)&glIsProgramPipeline, "glIsProgramPipeline"); 270 lib.bindGLSymbol(cast(void**)&glGetProgramPipelineiv, "glGetProgramPipelineiv"); 271 lib.bindGLSymbol(cast(void**)&glProgramUniform1i, "glProgramUniform1i"); 272 lib.bindGLSymbol(cast(void**)&glProgramUniform1iv, "glProgramUniform1iv"); 273 lib.bindGLSymbol(cast(void**)&glProgramUniform1f, "glProgramUniform1f"); 274 lib.bindGLSymbol(cast(void**)&glProgramUniform1fv, "glProgramUniform1fv"); 275 lib.bindGLSymbol(cast(void**)&glProgramUniform1d, "glProgramUniform1d"); 276 lib.bindGLSymbol(cast(void**)&glProgramUniform1dv, "glProgramUniform1dv"); 277 lib.bindGLSymbol(cast(void**)&glProgramUniform1ui, "glProgramUniform1ui"); 278 lib.bindGLSymbol(cast(void**)&glProgramUniform1uiv, "glProgramUniform1uiv"); 279 lib.bindGLSymbol(cast(void**)&glProgramUniform2i, "glProgramUniform2i"); 280 lib.bindGLSymbol(cast(void**)&glProgramUniform2iv, "glProgramUniform2iv"); 281 lib.bindGLSymbol(cast(void**)&glProgramUniform2f, "glProgramUniform2f"); 282 lib.bindGLSymbol(cast(void**)&glProgramUniform2fv, "glProgramUniform2fv"); 283 lib.bindGLSymbol(cast(void**)&glProgramUniform2d, "glProgramUniform2d"); 284 lib.bindGLSymbol(cast(void**)&glProgramUniform2dv, "glProgramUniform2dv"); 285 lib.bindGLSymbol(cast(void**)&glProgramUniform2ui, "glProgramUniform2ui"); 286 lib.bindGLSymbol(cast(void**)&glProgramUniform2uiv, "glProgramUniform2uiv"); 287 lib.bindGLSymbol(cast(void**)&glProgramUniform3i, "glProgramUniform3i"); 288 lib.bindGLSymbol(cast(void**)&glProgramUniform3iv, "glProgramUniform3iv"); 289 lib.bindGLSymbol(cast(void**)&glProgramUniform3f, "glProgramUniform3f"); 290 lib.bindGLSymbol(cast(void**)&glProgramUniform3fv, "glProgramUniform3fv"); 291 lib.bindGLSymbol(cast(void**)&glProgramUniform3d, "glProgramUniform3d"); 292 lib.bindGLSymbol(cast(void**)&glProgramUniform3dv, "glProgramUniform3dv"); 293 lib.bindGLSymbol(cast(void**)&glProgramUniform3ui, "glProgramUniform3ui"); 294 lib.bindGLSymbol(cast(void**)&glProgramUniform3uiv, "glProgramUniform3uiv"); 295 lib.bindGLSymbol(cast(void**)&glProgramUniform4i, "glProgramUniform4i"); 296 lib.bindGLSymbol(cast(void**)&glProgramUniform4iv, "glProgramUniform4iv"); 297 lib.bindGLSymbol(cast(void**)&glProgramUniform4f, "glProgramUniform4f"); 298 lib.bindGLSymbol(cast(void**)&glProgramUniform4fv, "glProgramUniform4fv"); 299 lib.bindGLSymbol(cast(void**)&glProgramUniform4d, "glProgramUniform4d"); 300 lib.bindGLSymbol(cast(void**)&glProgramUniform4dv, "glProgramUniform4dv"); 301 lib.bindGLSymbol(cast(void**)&glProgramUniform4ui, "glProgramUniform4ui"); 302 lib.bindGLSymbol(cast(void**)&glProgramUniform4uiv, "glProgramUniform4uiv"); 303 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2fv, "glProgramUniformMatrix2fv"); 304 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3fv, "glProgramUniformMatrix3fv"); 305 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4fv, "glProgramUniformMatrix4fv"); 306 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2dv, "glProgramUniformMatrix2dv"); 307 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3dv, "glProgramUniformMatrix3dv"); 308 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4dv, "glProgramUniformMatrix4dv"); 309 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2x3fv, "glProgramUniformMatrix2x3fv"); 310 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3x2fv, "glProgramUniformMatrix3x2fv"); 311 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2x4fv, "glProgramUniformMatrix2x4fv"); 312 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4x2fv, "glProgramUniformMatrix4x2fv"); 313 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3x4fv, "glProgramUniformMatrix3x4fv"); 314 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4x3fv, "glProgramUniformMatrix4x3fv"); 315 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2x3dv, "glProgramUniformMatrix2x3dv"); 316 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3x2dv, "glProgramUniformMatrix3x2dv"); 317 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2x4dv, "glProgramUniformMatrix2x4dv"); 318 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4x2dv, "glProgramUniformMatrix4x2dv"); 319 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3x4dv, "glProgramUniformMatrix3x4dv"); 320 lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4x3dv, "glProgramUniformMatrix4x3dv"); 321 lib.bindGLSymbol(cast(void**)&glValidateProgramPipeline, "glValidateProgramPipeline"); 322 lib.bindGLSymbol(cast(void**)&glGetProgramPipelineInfoLog, "glGetProgramPipelineInfoLog"); 323 return resetErrorCountGL(); 324 } 325 } 326 else enum hasARBSeparateShaderObjects = false; 327 328 // ARB_vertex_attrib_64bit 329 version(GL_ARB) enum useARBVertexAttrib64Bit = true; 330 else version(GL_ARB_vertex_attrib_64bit) enum useARBVertexAttrib64Bit = true; 331 else enum useARBVertexAttrib64Bit = has41; 332 333 static if(useARBVertexAttrib64Bit) { 334 private bool _hasARBVertexAttrib64Bit; 335 bool hasARBVertexAttrib64Bit() { return _hasARBVertexAttrib64Bit; } 336 337 extern(System) @nogc nothrow { 338 alias pglVertexAttribL1d = void function(GLuint, GLdouble); 339 alias pglVertexAttribL2d = void function(GLuint, GLdouble, GLdouble); 340 alias pglVertexAttribL3d = void function(GLuint, GLdouble, GLdouble, GLdouble); 341 alias pglVertexAttribL4d = void function(GLuint, GLdouble, GLdouble, GLdouble, GLdouble); 342 alias pglVertexAttribL1dv = void function(GLuint, const(GLdouble)*); 343 alias pglVertexAttribL2dv = void function(GLuint, const(GLdouble)*); 344 alias pglVertexAttribL3dv = void function(GLuint, const(GLdouble)*); 345 alias pglVertexAttribL4dv = void function(GLuint, const(GLdouble)*); 346 alias pglVertexAttribLPointer = void function(GLuint, GLint, GLenum, GLsizei, const(GLvoid)*); 347 alias pglGetVertexAttribLdv = void function(GLuint, GLenum, GLdouble*); 348 } 349 350 __gshared { 351 pglVertexAttribL1d glVertexAttribL1d; 352 pglVertexAttribL2d glVertexAttribL2d; 353 pglVertexAttribL3d glVertexAttribL3d; 354 pglVertexAttribL4d glVertexAttribL4d; 355 pglVertexAttribL1dv glVertexAttribL1dv; 356 pglVertexAttribL2dv glVertexAttribL2dv; 357 pglVertexAttribL3dv glVertexAttribL3dv; 358 pglVertexAttribL4dv glVertexAttribL4dv; 359 pglVertexAttribLPointer glVertexAttribLPointer; 360 pglGetVertexAttribLdv glGetVertexAttribLdv; 361 } 362 363 private @nogc nothrow 364 bool loadARBVertexAttrib64Bit(SharedLib lib, GLSupport contextVersion) 365 { 366 lib.bindGLSymbol(cast(void**)&glVertexAttribL1d, "glVertexAttribL1d"); 367 lib.bindGLSymbol(cast(void**)&glVertexAttribL2d, "glVertexAttribL2d"); 368 lib.bindGLSymbol(cast(void**)&glVertexAttribL3d, "glVertexAttribL3d"); 369 lib.bindGLSymbol(cast(void**)&glVertexAttribL4d, "glVertexAttribL4d"); 370 lib.bindGLSymbol(cast(void**)&glVertexAttribL1dv, "glVertexAttribL1dv"); 371 lib.bindGLSymbol(cast(void**)&glVertexAttribL2dv, "glVertexAttribL2dv"); 372 lib.bindGLSymbol(cast(void**)&glVertexAttribL3dv, "glVertexAttribL3dv"); 373 lib.bindGLSymbol(cast(void**)&glVertexAttribL4dv, "glVertexAttribL4dv"); 374 lib.bindGLSymbol(cast(void**)&glVertexAttribLPointer, "glVertexAttribLPointer"); 375 lib.bindGLSymbol(cast(void**)&glGetVertexAttribLdv, "glGetVertexAttribLdv"); 376 return resetErrorCountGL(); 377 } 378 } 379 else enum hasARBVertexAttrib64Bit = false; 380 381 // ARB_viewport_array 382 version(GL_ARB) enum useARBViewportArray = true; 383 else version(GL_ARB_viewport_array) enum useARBViewportArray = true; 384 else enum useARBViewportArray = has41; 385 386 static if(useARBViewportArray) { 387 private bool _hasARBViewportArray; 388 bool hasARBViewportArray() { return _hasARBViewportArray; } 389 390 enum : uint { 391 GL_MAX_VIEWPORTS = 0x825B, 392 GL_VIEWPORT_SUBPIXEL_BITS = 0x825C, 393 GL_VIEWPORT_BOUNDS_RANGE = 0x825D, 394 GL_LAYER_PROVOKING_VERTEX = 0x825E, 395 GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F, 396 GL_UNDEFINED_VERTEX = 0x8260, 397 } 398 399 extern(System) @nogc nothrow { 400 alias pglViewportArrayv = void function(GLuint, GLsizei, const(GLfloat)*); 401 alias pglViewportIndexedf = void function(GLuint, GLfloat, GLfloat, GLfloat, GLfloat); 402 alias pglViewportIndexedfv = void function(GLuint, const(GLfloat)*); 403 alias pglScissorArrayv = void function(GLuint, GLsizei, const(GLint)*); 404 alias pglScissorIndexed = void function(GLuint, GLint, GLint, GLsizei, GLsizei); 405 alias pglScissorIndexedv = void function(GLuint, const(GLint)*); 406 alias pglDepthRangeArrayv = void function(GLuint, GLsizei, const(GLclampd)*); 407 alias pglDepthRangeIndexed = void function(GLuint, GLclampd, GLclampd); 408 alias pglGetFloati_v = void function(GLenum, GLuint, GLfloat*); 409 alias pglGetDoublei_v = void function(GLenum, GLuint, GLdouble*); 410 } 411 412 __gshared { 413 pglViewportArrayv glViewportArrayv; 414 pglViewportIndexedf glViewportIndexedf; 415 pglViewportIndexedfv glViewportIndexedfv; 416 pglScissorArrayv glScissorArrayv; 417 pglScissorIndexed glScissorIndexed; 418 pglScissorIndexedv glScissorIndexedv; 419 pglDepthRangeArrayv glDepthRangeArrayv; 420 pglDepthRangeIndexed glDepthRangeIndexed; 421 pglGetFloati_v glGetFloati_v; 422 pglGetDoublei_v glGetDoublei_v; 423 } 424 425 private @nogc nothrow 426 bool loadARBViewportArray(SharedLib lib, GLSupport contextVersion) 427 { 428 lib.bindGLSymbol(cast(void**)&glViewportArrayv, "glViewportArrayv"); 429 lib.bindGLSymbol(cast(void**)&glViewportIndexedf, "glViewportIndexedf"); 430 lib.bindGLSymbol(cast(void**)&glViewportIndexedfv, "glViewportIndexedfv"); 431 lib.bindGLSymbol(cast(void**)&glScissorArrayv, "glScissorArrayv"); 432 lib.bindGLSymbol(cast(void**)&glScissorIndexed, "glScissorIndexed"); 433 lib.bindGLSymbol(cast(void**)&glScissorIndexedv, "glScissorIndexedv"); 434 lib.bindGLSymbol(cast(void**)&glDepthRangeArrayv, "glDepthRangeArrayv"); 435 lib.bindGLSymbol(cast(void**)&glDepthRangeIndexed, "glDepthRangeIndexed"); 436 lib.bindGLSymbol(cast(void**)&glGetFloati_v, "glGetFloati_v"); 437 lib.bindGLSymbol(cast(void**)&glGetDoublei_v, "glGetDoublei_v"); 438 return resetErrorCountGL(); 439 } 440 } 441 else enum hasARBViewportArray = false; 442 443 package(bindbc.opengl) @nogc nothrow 444 bool loadARB41(SharedLib lib, GLSupport contextVersion) 445 { 446 static if(has41) { 447 if(contextVersion >= GLSupport.gl41) { 448 bool ret = true; 449 ret = _hasARBES2Compatibility = lib.loadARBES2Compatibility(contextVersion); 450 ret = _hasARBGetProgramBinary = lib.loadARBGetProgramBinary(contextVersion); 451 ret = _hasARBSeparateShaderObjects = lib.loadARBSeparateShaderObjects(contextVersion); 452 ret = _hasARBVertexAttrib64Bit = lib.loadARBVertexAttrib64Bit(contextVersion); 453 ret = _hasARBViewportArray = lib.loadARBViewportArray(contextVersion); 454 return ret; 455 } 456 } 457 458 static if(useARBES2Compatibility) _hasARBES2Compatibility = 459 hasExtension(contextVersion, "GL_ARB_ES2_compatibility") && 460 lib.loadARBES2Compatibility(contextVersion); 461 462 static if(useARBGetProgramBinary) _hasARBGetProgramBinary = 463 hasExtension(contextVersion, "GL_ARB_get_program_binary") && 464 lib.loadARBGetProgramBinary(contextVersion); 465 466 static if(useARBSeparateShaderObjects) _hasARBSeparateShaderObjects = 467 hasExtension(contextVersion, "GL_ARB_separate_shader_objects") && 468 lib.loadARBSeparateShaderObjects(contextVersion); 469 470 static if(useARBVertexAttrib64Bit) _hasARBVertexAttrib64Bit = 471 hasExtension(contextVersion, "GL_ARB_vertex_attrib_64bit") && 472 lib.loadARBVertexAttrib64Bit(contextVersion); 473 474 static if(useARBViewportArray) _hasARBViewportArray = 475 hasExtension(contextVersion, "GL_ARB_viewport_array") && 476 lib.loadARBViewportArray(contextVersion); 477 478 return true; 479 }