1 // Copyright 2018 - 2021 Michael D. Parker 2 // Distributed under the Boost Software License, Version 1.0. 3 // (See accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 module bindbc.opengl.bind.arb.arb_01; 7 8 import bindbc.loader; 9 import bindbc.opengl.config, 10 bindbc.opengl.context; 11 import bindbc.opengl.bind.types; 12 13 // ARB_bindless_texture 14 version(GL_ARB) enum useARBBindlessTexture = true; 15 else version(GL_ARB_bindless_texture) enum useARBBindlessTexture = true; 16 else enum useARBBindlessTexture = false; 17 18 static if(useARBBindlessTexture) { 19 private bool _hasARBBindlessTexture; 20 @nogc nothrow bool hasARBBindlessTexture() { return _hasARBBindlessTexture; } 21 22 enum uint GL_UNSIGNED_INT64_ARB = 0x140F; 23 24 extern(System) @nogc nothrow { 25 alias pglGetTextureHandleARB = GLuint64 function(GLuint); 26 alias pglGetTextureSamplerHandleARB = GLuint64 function(GLuint,GLuint); 27 alias pglMakeTextureHandleResidentARB = void function(GLuint64); 28 alias pglMakeTextureHandleNonResidentARB = void function(GLuint64); 29 alias pglGetImageHandleARB = GLuint64 function(GLuint,GLint,GLboolean,GLint,GLenum); 30 alias pglMakeImageHandleResidentARB = void function(GLuint64,GLenum); 31 alias pglMakeImageHandleNonResidentARB = void function(GLuint64); 32 alias pglUniformHandleui64ARB = void function(GLint,GLuint64); 33 alias pglUniformHandleui64vARB = void function(GLint,GLsizei,const(GLuint64)*); 34 alias pglProgramUniformHandleui64ARB = void function(GLuint,GLint,GLuint64); 35 alias pglProgramUniformHandleui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint64)*); 36 alias pglIsTextureHandleResidentARB = GLboolean function(GLuint64); 37 alias pglIsImageHandleResidentARB = GLboolean function(GLuint64); 38 alias pglVertexAttribL1ui64ARB = void function(GLuint,GLuint64); 39 alias pglVertexAttribL1ui64vARB = void function(GLuint,const(GLuint64)*); 40 alias pglGetVertexAttribLui64vARB = void function(GLuint,GLenum,GLuint64*); 41 } 42 43 __gshared { 44 pglGetTextureHandleARB glGetTextureHandleARB; 45 pglGetTextureSamplerHandleARB glGetTextureSamplerHandleARB; 46 pglMakeTextureHandleResidentARB glMakeTextureHandleResidentARB; 47 pglMakeTextureHandleNonResidentARB glMakeTextureHandleNonResidentARB; 48 pglGetImageHandleARB glGetImageHandleARB; 49 pglMakeImageHandleResidentARB glMakeImageHandleResidentARB; 50 pglMakeImageHandleNonResidentARB glMakeImageHandleNonResidentARB; 51 pglUniformHandleui64ARB glUniformHandleui64ARB; 52 pglUniformHandleui64vARB glUniformHandleui64vARB; 53 pglProgramUniformHandleui64ARB glProgramUniformHandleui64ARB; 54 pglProgramUniformHandleui64vARB glProgramUniformHandleui64vARB; 55 pglIsTextureHandleResidentARB glIsTextureHandleResidentARB; 56 pglIsImageHandleResidentARB glIsImageHandleResidentARB; 57 pglVertexAttribL1ui64ARB glVertexAttribL1ui64ARB; 58 pglVertexAttribL1ui64vARB glVertexAttribL1ui64vARB; 59 pglGetVertexAttribLui64vARB glGetVertexAttribLui64vARB; 60 } 61 62 private @nogc nothrow 63 bool loadARBBindlessTexture(SharedLib lib, GLSupport contextVersion) 64 { 65 lib.bindGLSymbol(cast(void**)&glGetTextureHandleARB, "glGetTextureHandleARB"); 66 lib.bindGLSymbol(cast(void**)&glGetTextureSamplerHandleARB, "glGetTextureSamplerHandleARB"); 67 lib.bindGLSymbol(cast(void**)&glMakeTextureHandleResidentARB, "glMakeTextureHandleResidentARB"); 68 lib.bindGLSymbol(cast(void**)&glMakeTextureHandleNonResidentARB, "glMakeTextureHandleNonResidentARB"); 69 lib.bindGLSymbol(cast(void**)&glGetImageHandleARB, "glGetImageHandleARB"); 70 lib.bindGLSymbol(cast(void**)&glMakeImageHandleResidentARB, "glMakeImageHandleResidentARB"); 71 lib.bindGLSymbol(cast(void**)&glMakeImageHandleNonResidentARB, "glMakeImageHandleNonResidentARB"); 72 lib.bindGLSymbol(cast(void**)&glUniformHandleui64ARB, "glUniformHandleui64ARB"); 73 lib.bindGLSymbol(cast(void**)&glUniformHandleui64vARB, "glUniformHandleui64vARB"); 74 lib.bindGLSymbol(cast(void**)&glProgramUniformHandleui64ARB, "glProgramUniformHandleui64ARB"); 75 lib.bindGLSymbol(cast(void**)&glProgramUniformHandleui64vARB, "glProgramUniformHandleui64vARB"); 76 lib.bindGLSymbol(cast(void**)&glIsTextureHandleResidentARB, "glIsTextureHandleResidentARB"); 77 lib.bindGLSymbol(cast(void**)&glIsImageHandleResidentARB, "glIsImageHandleResidentARB"); 78 lib.bindGLSymbol(cast(void**)&glVertexAttribL1ui64ARB, "glVertexAttribL1ui64ARB"); 79 lib.bindGLSymbol(cast(void**)&glVertexAttribL1ui64vARB, "glVertexAttribL1ui64vARB"); 80 lib.bindGLSymbol(cast(void**)&glGetVertexAttribLui64vARB, "glGetVertexAttribLui64vARB"); 81 return resetErrorCountGL(); 82 } 83 } 84 else enum hasARBBindlessTexture = false; 85 86 // ARB_cl_event 87 version(GL_ARB) enum useARBCLEvent = true; 88 else version(GL_ARB_cl_event) enum useARBCLEvent = true; 89 else enum useARBCLEvent = false; 90 91 static if(useARBCLEvent) { 92 import bindbc.opengl.bind.arb.core_32 : GLsync; 93 private bool _hasARBCLEvent; 94 @nogc nothrow bool hasARBCLEvent() { return _hasARBCLEvent; } 95 96 struct _cl_context; 97 struct _cl_event; 98 99 enum : uint { 100 GL_SYNC_CL_EVENT_ARB = 0x8240, 101 GL_SYNC_CL_EVENT_COMPLETE_ARB = 0x8241, 102 } 103 104 extern(System) @nogc nothrow alias pglCreateSyncFromCLeventARB = GLsync function(_cl_context*, _cl_event*, GLbitfield); 105 __gshared pglCreateSyncFromCLeventARB glCreateSyncFromCLeventARB; 106 107 private @nogc nothrow 108 bool loadARBCLEvent(SharedLib lib, GLSupport contextVersion) 109 { 110 lib.bindGLSymbol(cast(void**)&glCreateSyncFromCLeventARB, "glCreateSyncFromCLeventARB"); 111 return resetErrorCountGL(); 112 } 113 } 114 else enum hasARBCLEvent = false; 115 116 // ARB_compute_variable_group_size 117 version(GL_ARB) enum useARBComputeVariableGroupSize = true; 118 else version(GL_ARB_compute_variable_group_size) enum useARBComputeVariableGroupSize = true; 119 else enum useARBComputeVariableGroupSize = false; 120 121 static if(useARBComputeVariableGroupSize) { 122 private bool _hasARBComputeVariableGroupSize; 123 @nogc nothrow bool hasARBComputeVariableGroupSize() { return _hasARBComputeVariableGroupSize; } 124 125 enum : uint { 126 GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB = 0x9344, 127 GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB = 0x90EB, 128 GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB = 0x9345, 129 GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB = 0x91BF, 130 } 131 132 extern(System) @nogc nothrow alias pglDispatchComputeGroupSizeARB = GLsync function(GLuint,GLuint,GLuint,GLuint,GLuint,GLuint); 133 __gshared pglDispatchComputeGroupSizeARB glDispatchComputeGroupSizeARB; 134 135 private @nogc nothrow 136 bool loadARBComputeVariableGroupSize(SharedLib lib, GLSupport contextVersion) 137 { 138 lib.bindGLSymbol(cast(void**)&glDispatchComputeGroupSizeARB, "glDispatchComputeGroupSizeARB"); 139 return resetErrorCountGL(); 140 } 141 } 142 else enum hasARBComputeVariableGroupSize = false; 143 144 // ARB_debug_output 145 version(GL_ARB) enum useARBDebugOutput = true; 146 else version(GL_ARB_debug_output) enum useARBDebugOutput = true; 147 else enum useARBDebugOutput = false; 148 149 static if(useARBDebugOutput) { 150 private bool _hasARBDebugOutput; 151 @nogc nothrow bool hasARBDebugOutput() { return _hasARBDebugOutput; } 152 153 enum : uint { 154 GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB = 0x8242, 155 GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB = 0x8243, 156 GL_DEBUG_CALLBACK_FUNCTION_ARB = 0x8244, 157 GL_DEBUG_CALLBACK_USER_PARAM_ARB = 0x8245, 158 GL_DEBUG_SOURCE_API_ARB = 0x8246, 159 GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB = 0x8247, 160 GL_DEBUG_SOURCE_SHADER_COMPILER_ARB = 0x8248, 161 GL_DEBUG_SOURCE_THIRD_PARTY_ARB = 0x8249, 162 GL_DEBUG_SOURCE_APPLICATION_ARB = 0x824A, 163 GL_DEBUG_SOURCE_OTHER_ARB = 0x824B, 164 GL_DEBUG_TYPE_ERROR_ARB = 0x824C, 165 GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB = 0x824D, 166 GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB = 0x824E, 167 GL_DEBUG_TYPE_PORTABILITY_ARB = 0x824F, 168 GL_DEBUG_TYPE_PERFORMANCE_ARB = 0x8250, 169 GL_DEBUG_TYPE_OTHER_ARB = 0x8251, 170 GL_MAX_DEBUG_MESSAGE_LENGTH_ARB = 0x9143, 171 GL_MAX_DEBUG_LOGGED_MESSAGES_ARB = 0x9144, 172 GL_DEBUG_LOGGED_MESSAGES_ARB = 0x9145, 173 GL_DEBUG_SEVERITY_HIGH_ARB = 0x9146, 174 GL_DEBUG_SEVERITY_MEDIUM_ARB = 0x9147, 175 GL_DEBUG_SEVERITY_LOW_ARB = 0x9148, 176 } 177 178 extern(System) nothrow { 179 alias GLDEBUGPROCARB = void function(GLenum,GLenum,GLuint,GLenum,GLsizei,in GLchar*,GLvoid*); 180 alias GLDEBUGPROCAMD = void function(GLuint,GLenum,GLenum,GLsizei,in GLchar*,GLvoid*); 181 } 182 183 extern(System) @nogc nothrow { 184 alias pglDebugMessageControlARB = void function(GLenum,GLenum,GLenum,GLsizei,const(GLuint)*,GLboolean); 185 alias pglDebugMessageInsertARB = void function(GLenum,GLenum,GLuint,GLenum,GLsizei,const(GLchar)*); 186 alias pglGetDebugMessageLogARB = void function(GLuint,GLsizei,GLenum*,GLenum*,GLuint*,GLenum*,GLsizei*,GLchar*); 187 alias pglDebugMessageCallbackARB = void function(GLDEBUGPROCARB,const(GLvoid)*); 188 } 189 190 __gshared { 191 pglDebugMessageControlARB glDebugMessageControlARB; 192 pglDebugMessageInsertARB glDebugMessageInsertARB; 193 pglDebugMessageCallbackARB glDebugMessageCallbackARB; 194 pglGetDebugMessageLogARB glGetDebugMessageLogARB; 195 } 196 197 private @nogc nothrow 198 bool loadARBDebugOutput(SharedLib lib, GLSupport contextVersion) 199 { 200 lib.bindGLSymbol(cast(void**)&glDebugMessageControlARB, "glDebugMessageControlARB"); 201 lib.bindGLSymbol(cast(void**)&glDebugMessageInsertARB, "glDebugMessageInsertARB"); 202 lib.bindGLSymbol(cast(void**)&glDebugMessageCallbackARB, "glDebugMessageCallbackARB"); 203 lib.bindGLSymbol(cast(void**)&glGetDebugMessageLogARB, "glGetDebugMessageLogARB"); 204 return resetErrorCountGL(); 205 } 206 } 207 else enum hasARBDebugOutput = false; 208 209 // ARB_framebuffer_sRGB 210 version(GL_ARB) enum useARBFramebufferSRGB = true; 211 else version(GL_ARB_framebuffer_sRGB) enum useARBFramebufferSRGB = true; 212 else enum useARBFramebufferSRGB = false; 213 214 static if(useARBFramebufferSRGB) { 215 private bool _hasARBFramebufferSRGB; 216 @nogc nothrow bool hasARBFramebufferSRGB() { return _hasARBFramebufferSRGB; } 217 218 enum uint GL_FRAMEBUFFER_SRGB = 0x8DB9; 219 } 220 else enum hasARBFramebufferSRGB = false; 221 222 // ARB_geometry_shader4 223 version(GL_ARB) enum useARBGeometryShader4 = true; 224 else version(GL_ARB_geometry_shader4) enum useARBGeometryShader4 = true; 225 else enum useARBGeometryShader4 = false; 226 227 static if(useARBGeometryShader4) { 228 private bool _hasARBGeometryShader4; 229 @nogc nothrow bool hasARBGeometryShader4() { return _hasARBGeometryShader4; } 230 231 enum : uint { 232 GL_LINES_ADJACENCY_ARB = 0x000A, 233 GL_LINE_STRIP_ADJACENCY_ARB = 0x000B, 234 GL_TRIANGLES_ADJACENCY_ARB = 0x000C, 235 GL_TRIANGLE_STRIP_ADJACENCY_ARB = 0x000D, 236 GL_PROGRAM_POINT_SIZE_ARB = 0x8642, 237 GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB = 0x8C29, 238 GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB = 0x8DA7, 239 GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB = 0x8DA8, 240 GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB = 0x8DA9, 241 GL_GEOMETRY_SHADER_ARB = 0x8DD9, 242 GL_GEOMETRY_VERTICES_OUT_ARB = 0x8DDA, 243 GL_GEOMETRY_INPUT_TYPE_ARB = 0x8DDB, 244 GL_GEOMETRY_OUTPUT_TYPE_ARB = 0x8DDC, 245 GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB = 0x8DDD, 246 GL_MAX_VERTEX_VARYING_COMPONENTS_ARB = 0x8DDE, 247 GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB = 0x8DDF, 248 GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB = 0x8DE0, 249 GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB = 0x8DE1, 250 } 251 252 extern(System) @nogc nothrow { 253 alias pglProgramParameteriARB = void function(GLuint,GLenum,GLint); 254 alias pglFramebufferTextureARB = void function(GLuint,GLenum,GLuint,GLint); 255 alias pglFramebufferTextureLayerARB = void function(GLuint,GLenum,GLuint,GLint,GLint); 256 alias pglFramebufferTextureFaceARB = void function(GLuint,GLenum,GLuint,GLint,GLenum); 257 } 258 259 __gshared { 260 pglProgramParameteriARB glProgramParameteriARB; 261 pglFramebufferTextureARB glFramebufferTextureARB; 262 pglFramebufferTextureLayerARB glFramebufferTextureLayerARB; 263 pglFramebufferTextureFaceARB glFramebufferTextureFaceARB; 264 } 265 266 private @nogc nothrow 267 bool loadARBGeometryShader4(SharedLib lib, GLSupport contextVersion) 268 { 269 lib.bindGLSymbol(cast(void**)&glProgramParameteriARB,"glProgramParameteriARB"); 270 lib.bindGLSymbol(cast(void**)&glFramebufferTextureARB,"glFramebufferTextureARB"); 271 lib.bindGLSymbol(cast(void**)&glFramebufferTextureLayerARB,"glFramebufferTextureLayerARB"); 272 lib.bindGLSymbol(cast(void**)&glFramebufferTextureFaceARB,"glFramebufferTextureFaceARB"); 273 return resetErrorCountGL(); 274 } 275 } 276 else enum hasARBGeometryShader4 = false; 277 278 // ARB_gl_spirv 279 version(GL_ARB) enum useARBGLSPIRV = true; 280 else version(GL_ARB_gl_spirv) enum useARBGLSPIRV = true; 281 else enum useARBGLSPIRV = false; 282 283 static if(useARBGLSPIRV) { 284 private bool _hasARBGLSPIRV; 285 @nogc nothrow bool hasARBGLSPIRV() { return _hasARBGLSPIRV; } 286 287 enum : uint { 288 GL_SHADER_BINARY_FORMAT_SPIR_V_ARB = 0x9551, 289 GL_SPIR_V_BINARY_ARB = 0x9552, 290 } 291 292 extern(System) @nogc nothrow 293 alias pglSpecializeShaderARB = void function(GLuint,const(char)*,GLuint,const(GLuint)*,const(GLuint)*); 294 295 __gshared pglSpecializeShaderARB glSpecializeShaderARB; 296 297 private @nogc nothrow 298 bool loadARBGLSPIRV(SharedLib lib, GLSupport contextVersion) 299 { 300 lib.bindGLSymbol(cast(void**)&glSpecializeShaderARB,"glSpecializeShaderARB"); 301 return resetErrorCountGL(); 302 } 303 } 304 else enum hasARBGLSPIRV = false; 305 306 // ARB_gpu_shader_int64 307 version(GL_ARB) enum useARBGPUShaderInt64 = true; 308 else version(GL_ARB_gpu_shader_int64) enum useARBGPUShaderInt64 = true; 309 else enum useARBGPUShaderInt64 = false; 310 311 static if(useARBGPUShaderInt64) { 312 private bool _hasARBGPUShaderInt64; 313 @nogc nothrow bool hasARBGPUShaderInt64() { return _hasARBGPUShaderInt64; } 314 315 enum : uint { 316 GL_INT64_ARB = 0x140E, 317 GL_INT64_VEC2_ARB = 0x8FE9, 318 GL_INT64_VEC3_ARB = 0x8FEA, 319 GL_INT64_VEC4_ARB = 0x8FEB, 320 GL_UNSIGNED_INT64_VEC2_ARB = 0x8FF5, 321 GL_UNSIGNED_INT64_VEC3_ARB = 0x8FF6, 322 GL_UNSIGNED_INT64_VEC4_ARB = 0x8FF7, 323 } 324 325 extern(System) @nogc nothrow { 326 alias pglUniform1i64ARB = void function(GLint,GLint64); 327 alias pglUniform2i64ARB = void function(GLint,GLint64,GLint64); 328 alias pglUniform3i64ARB = void function(GLint,GLint64,GLint64,GLint64); 329 alias pglUniform4i64ARB = void function(GLint,GLint64,GLint64,GLint64,GLint64); 330 alias pglUniform1i64vARB = void function(GLint,GLsizei,const(GLint64)*); 331 alias pglUniform2i64vARB = void function(GLint,GLsizei,const(GLint64)*); 332 alias pglUniform3i64vARB = void function(GLint,GLsizei,const(GLint64)*); 333 alias pglUniform4i64vARB = void function(GLint,GLsizei,const(GLint64)*); 334 alias pglUniform1ui64ARB = void function(GLint,GLuint64); 335 alias pglUniform2ui64ARB = void function(GLint,GLuint64,GLuint64); 336 alias pglUniform3ui64ARB = void function(GLint,GLuint64,GLuint64,GLuint64); 337 alias pglUniform4ui64ARB = void function(GLint,GLuint64,GLuint64,GLuint64,GLuint64); 338 alias pglUniform1ui64vARB = void function(GLint,GLsizei,const(GLuint64)*); 339 alias pglUniform2ui64vARB = void function(GLint,GLsizei,const(GLuint64)*); 340 alias pglUniform3ui64vARB = void function(GLint,GLsizei,const(GLuint64)*); 341 alias pglUniform4ui64vARB = void function(GLint,GLsizei,const(GLuint64)*); 342 alias pglGetUniformi64vARB = void function(GLuint,GLint,GLint64*); 343 alias pglGetUniformui64vARB = void function(GLuint,GLint,GLuint64*); 344 alias pglGetnUniformi64vARB = void function(GLuint,GLint,GLsizei,GLint64*); 345 alias pglGetnUniformui64vARB = void function(GLuint,GLint,GLsizei,GLuint64*); 346 alias pglProgramUniform1i64ARB = void function(GLuint,GLint,GLint64); 347 alias pglProgramUniform2i64ARB = void function(GLuint,GLint,GLint64,GLint64); 348 alias pglProgramUniform3i64ARB = void function(GLuint,GLint,GLint64,GLint64,GLint64); 349 alias pglProgramUniform4i64ARB = void function(GLuint,GLint,GLint64,GLint64,GLint64,GLint64); 350 alias pglProgramUniform1i64vARB = void function(GLuint,GLint,GLsizei,const(GLint64)*); 351 alias pglProgramUniform2i64vARB = void function(GLuint,GLint,GLsizei,const(GLint64)*); 352 alias pglProgramUniform3i64vARB = void function(GLuint,GLint,GLsizei,const(GLint64)*); 353 alias pglProgramUniform4i64vARB = void function(GLuint,GLint,GLsizei,const(GLint64)*); 354 alias pglProgramUniform1ui64ARB = void function(GLuint,GLint,GLsizei,GLuint64); 355 alias pglProgramUniform2ui64ARB = void function(GLuint,GLint,GLsizei,GLuint64,GLuint64); 356 alias pglProgramUniform3ui64ARB = void function(GLuint,GLint,GLsizei,GLuint64,GLuint64,GLuint64); 357 alias pglProgramUniform4ui64ARB = void function(GLuint,GLint,GLsizei,GLuint64,GLuint64,GLuint64,GLuint64); 358 alias pglProgramUniform1ui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint)*); 359 alias pglProgramUniform2ui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint)*); 360 alias pglProgramUniform3ui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint)*); 361 alias pglProgramUniform4ui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint)*); 362 } 363 364 __gshared { 365 pglUniform1i64ARB glUniform1i64ARB; 366 pglUniform2i64ARB glUniform2i64ARB; 367 pglUniform3i64ARB glUniform3i64ARB; 368 pglUniform4i64ARB glUniform4i64ARB; 369 pglUniform1i64vARB glUniform1i64vARB; 370 pglUniform2i64vARB glUniform2i64vARB; 371 pglUniform3i64vARB glUniform3i64vARB; 372 pglUniform4i64vARB glUniform4i64vARB; 373 pglUniform1ui64ARB glUniform1ui64ARB; 374 pglUniform2ui64ARB glUniform2ui64ARB; 375 pglUniform3ui64ARB glUniform3ui64ARB; 376 pglUniform4ui64ARB glUniform4ui64ARB; 377 pglUniform1ui64vARB glUniform1ui64vARB; 378 pglUniform2ui64vARB glUniform2ui64vARB; 379 pglUniform3ui64vARB glUniform3ui64vARB; 380 pglUniform4ui64vARB glUniform4ui64vARB; 381 pglGetUniformi64vARB glGetUniformi64vARB; 382 pglGetUniformui64vARB glGetUniformui64vARB; 383 pglGetnUniformi64vARB glGetnUniformi64vARB; 384 pglGetnUniformui64vARB glGetnUniformui64vARB; 385 pglProgramUniform1i64ARB glProgramUniform1i64ARB; 386 pglProgramUniform2i64ARB glProgramUniform2i64ARB; 387 pglProgramUniform3i64ARB glProgramUniform3i64ARB; 388 pglProgramUniform4i64ARB glProgramUniform4i64ARB; 389 pglProgramUniform1i64vARB glProgramUniform1i64vARB; 390 pglProgramUniform2i64vARB glProgramUniform2i64vARB; 391 pglProgramUniform3i64vARB glProgramUniform3i64vARB; 392 pglProgramUniform4i64vARB glProgramUniform4i64vARB; 393 pglProgramUniform1ui64ARB glProgramUniform1ui64ARB; 394 pglProgramUniform2ui64ARB glProgramUniform2ui64ARB; 395 pglProgramUniform3ui64ARB glProgramUniform3ui64ARB; 396 pglProgramUniform4ui64ARB glProgramUniform4ui64ARB; 397 pglProgramUniform1ui64vARB glProgramUniform1ui64vARB; 398 pglProgramUniform2ui64vARB glProgramUniform2ui64vARB; 399 pglProgramUniform3ui64vARB glProgramUniform3ui64vARB; 400 pglProgramUniform4ui64vARB glProgramUniform4ui64vARB; 401 } 402 403 private @nogc nothrow 404 bool loadARBGPUShaderInt64(SharedLib lib, GLSupport contextVersion) 405 { 406 lib.bindGLSymbol(cast(void**)&glUniform1i64ARB,"glUniform1i64ARB"); 407 lib.bindGLSymbol(cast(void**)&glUniform2i64ARB,"glUniform2i64ARB"); 408 lib.bindGLSymbol(cast(void**)&glUniform3i64ARB,"glUniform3i64ARB"); 409 lib.bindGLSymbol(cast(void**)&glUniform4i64ARB,"glUniform4i64ARB"); 410 lib.bindGLSymbol(cast(void**)&glUniform1i64vARB,"glUniform1i64vARB"); 411 lib.bindGLSymbol(cast(void**)&glUniform2i64vARB,"glUniform2i64vARB"); 412 lib.bindGLSymbol(cast(void**)&glUniform3i64vARB,"glUniform3i64vARB"); 413 lib.bindGLSymbol(cast(void**)&glUniform4i64vARB,"glUniform4i64vARB"); 414 lib.bindGLSymbol(cast(void**)&glUniform1ui64ARB,"glUniform1ui64ARB"); 415 lib.bindGLSymbol(cast(void**)&glUniform2ui64ARB,"glUniform2ui64ARB"); 416 lib.bindGLSymbol(cast(void**)&glUniform3ui64ARB,"glUniform3ui64ARB"); 417 lib.bindGLSymbol(cast(void**)&glUniform4ui64ARB,"glUniform4ui64ARB"); 418 lib.bindGLSymbol(cast(void**)&glUniform1ui64vARB,"glUniform1ui64vARB"); 419 lib.bindGLSymbol(cast(void**)&glUniform2ui64vARB,"glUniform2ui64vARB"); 420 lib.bindGLSymbol(cast(void**)&glUniform3ui64vARB,"glUniform3ui64vARB"); 421 lib.bindGLSymbol(cast(void**)&glUniform4ui64vARB,"glUniform4ui64vARB"); 422 lib.bindGLSymbol(cast(void**)&glGetUniformi64vARB,"glGetUniformi64vARB"); 423 lib.bindGLSymbol(cast(void**)&glGetUniformui64vARB,"glGetUniformui64vARB"); 424 lib.bindGLSymbol(cast(void**)&glGetnUniformi64vARB,"glGetnUniformi64vARB"); 425 lib.bindGLSymbol(cast(void**)&glGetnUniformui64vARB,"glGetnUniformui64vARB"); 426 lib.bindGLSymbol(cast(void**)&glProgramUniform1i64ARB,"glProgramUniform1i64ARB"); 427 lib.bindGLSymbol(cast(void**)&glProgramUniform2i64ARB,"glProgramUniform2i64ARB"); 428 lib.bindGLSymbol(cast(void**)&glProgramUniform3i64ARB,"glProgramUniform3i64ARB"); 429 lib.bindGLSymbol(cast(void**)&glProgramUniform4i64ARB,"glProgramUniform4i64ARB"); 430 lib.bindGLSymbol(cast(void**)&glProgramUniform1i64vARB,"glProgramUniform1i64vARB"); 431 lib.bindGLSymbol(cast(void**)&glProgramUniform2i64vARB,"glProgramUniform2i64vARB"); 432 lib.bindGLSymbol(cast(void**)&glProgramUniform3i64vARB,"glProgramUniform3i64vARB"); 433 lib.bindGLSymbol(cast(void**)&glProgramUniform4i64vARB,"glProgramUniform4i64vARB"); 434 lib.bindGLSymbol(cast(void**)&glProgramUniform1ui64ARB,"glProgramUniform1ui64ARB"); 435 lib.bindGLSymbol(cast(void**)&glProgramUniform2ui64ARB,"glProgramUniform2ui64ARB"); 436 lib.bindGLSymbol(cast(void**)&glProgramUniform3ui64ARB,"glProgramUniform3ui64ARB"); 437 lib.bindGLSymbol(cast(void**)&glProgramUniform4ui64ARB,"glProgramUniform4ui64ARB"); 438 lib.bindGLSymbol(cast(void**)&glProgramUniform1ui64vARB,"glProgramUniform1ui64vARB"); 439 lib.bindGLSymbol(cast(void**)&glProgramUniform2ui64vARB,"glProgramUniform2ui64vARB"); 440 lib.bindGLSymbol(cast(void**)&glProgramUniform3ui64vARB,"glProgramUniform3ui64vARB"); 441 lib.bindGLSymbol(cast(void**)&glProgramUniform4ui64vARB,"glProgramUniform4ui64vARB"); 442 return resetErrorCountGL(); 443 } 444 } 445 else enum hasARBGPUShaderInt64 = false; 446 447 // ARB_indirect_parameters 448 version(GL_ARB) enum useARBIndirectParameters = true; 449 else version(GL_ARB_indirect_parameters) enum useARBIndirectParameters = true; 450 else enum useARBIndirectParameters = false; 451 452 static if(useARBIndirectParameters) { 453 private bool _hasARBIndirectParameters; 454 @nogc nothrow bool hasARBIndirectParameters() { return _hasARBIndirectParameters; } 455 456 enum : uint { 457 GL_PARAMETER_BUFFER_ARB = 0x80EE, 458 GL_PARAMETER_BUFFER_BINDING_ARB = 0x80EF, 459 } 460 461 extern(System) @nogc nothrow { 462 alias pglMultiDrawArraysIndirectCountARB = void function(GLenum,const(void)*,GLintptr,GLsizei,GLsizei); 463 alias pglMultiDrawElementsIndirectCountARB = void function(GLenum,GLenum,const(void)*,GLintptr,GLsizei,GLsizei); 464 } 465 466 __gshared { 467 pglMultiDrawArraysIndirectCountARB glMultiDrawArraysIndirectCountARB; 468 pglMultiDrawElementsIndirectCountARB glMultiDrawElementsIndirectCountARB; 469 } 470 471 private @nogc nothrow 472 bool loadARBIndirectParameters(SharedLib lib, GLSupport contextVersion) 473 { 474 lib.bindGLSymbol(cast(void**)&glMultiDrawArraysIndirectCountARB,"glMultiDrawArraysIndirectCountARB"); 475 lib.bindGLSymbol(cast(void**)&glMultiDrawElementsIndirectCountARB,"glMultiDrawElementsIndirectCountARB"); 476 return resetErrorCountGL(); 477 } 478 } 479 else enum hasARBIndirectParameters = false; 480 481 // ARB_instanced_arrays 482 version(GL_ARB) enum useARBInstancedArrays = true; 483 else version(GL_ARB_instanced_arrays) enum useARBInstancedArrays = true; 484 else enum useARBInstancedArrays = false; 485 486 static if(useARBInstancedArrays) { 487 private bool _hasARBInstancedArrays; 488 @nogc nothrow bool hasARBInstancedArrays() { return _hasARBInstancedArrays; } 489 490 enum : uint { 491 GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB = 0x88FE, 492 } 493 494 extern(System) @nogc nothrow { 495 alias pglVertexAttribDivisorARB = void function(GLuint,GLuint); 496 alias pglVertexArrayVertexAttribDivisorEXT = void function(GLuint,GLuint,GLuint); 497 } 498 499 __gshared { 500 pglVertexAttribDivisorARB glVertexAttribDivisorARB; 501 pglVertexArrayVertexAttribDivisorEXT glVertexArrayVertexAttribDivisorEXT; 502 } 503 504 private @nogc nothrow 505 bool loadARBInstancedArrays(SharedLib lib, GLSupport contextVersion) 506 { 507 lib.bindGLSymbol(cast(void**)&glVertexAttribDivisorARB,"glVertexAttribDivisorARB"); 508 509 // glVertexArrayVertexAttribDivisorEXT is only available when EXT_direct_state_access is supported. 510 // Save the error count to return and ignore the error if the EXT function isn't available. 511 bool ret = resetErrorCountGL(); 512 if(hasExtension(contextVersion, "GL_EXT_direct_state_access ")) { 513 lib.bindGLSymbol(cast(void**)&glVertexArrayVertexAttribDivisorEXT, "glVertexArrayVertexAttribDivisorEXT"); 514 resetErrorCountGL(); 515 } 516 return ret; 517 } 518 } 519 else enum hasARBInstancedArrays = false; 520 521 // ARB_pipeline_statistics_query 522 version(GL_ARB) enum useARBPipelineStatisticsQuery = true; 523 else version(GL_ARB_pipeline_statistics_query) enum useARBPipelineStatisticsQuery = true; 524 else enum useARBPipelineStatisticsQuery = false; 525 526 static if(useARBPipelineStatisticsQuery) { 527 private bool _hasARBPipelineStatisticsQuery; 528 @nogc nothrow bool hasARBPipelineStatisticsQuery() { return _hasARBPipelineStatisticsQuery; } 529 530 enum : uint { 531 GL_VERTICES_SUBMITTED_ARB = 0x82EE, 532 GL_PRIMITIVES_SUBMITTED_ARB = 0x82EF, 533 GL_VERTEX_SHADER_INVOCATIONS_ARB = 0x82F0, 534 GL_TESS_CONTROL_SHADER_PATCHES_ARB = 0x82F1, 535 GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB = 0x82F2, 536 GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB = 0x82F3, 537 GL_FRAGMENT_SHADER_INVOCATIONS_ARB = 0x82F4, 538 GL_COMPUTE_SHADER_INVOCATIONS_ARB = 0x82F5, 539 GL_CLIPPING_INPUT_PRIMITIVES_ARB = 0x82F6, 540 GL_CLIPPING_OUTPUT_PRIMITIVES_ARB = 0x82F7, 541 } 542 } 543 else enum hasARBPipelineStatisticsQuery = false; 544 545 // ARB_robustness_isolation 546 version(GL_ARB) enum useARBRobustnessIsolation = true; 547 else version(GL_ARB_robustness_isolation) enum useARBRobustnessIsolation = true; 548 else enum useARBRobustnessIsolation = false; 549 550 static if(useARBRobustnessIsolation) { 551 private bool _hasARBRobustnessIsolation; 552 @nogc nothrow bool hasARBRobustnessIsolation() { return _hasARBRobustnessIsolation; } 553 } 554 else enum hasARBRobustnessIsolation = false; 555 556 // ARB_sample_shading 557 version(GL_ARB) enum useARBSampleShading = true; 558 else version(GL_ARB_sample_shading) enum useARBSampleShading = true; 559 else enum useARBSampleShading = false; 560 561 static if(useARBSampleShading) { 562 private bool _hasARBSampleShading; 563 @nogc nothrow bool hasARBSampleShading() { return _hasARBSampleShading; } 564 565 enum : uint { 566 GL_SAMPLE_SHADING_ARB = 0x8C36, 567 GL_MIN_SAMPLE_SHADING_VALUE_ARB = 0x8C37, 568 } 569 570 extern(System) @nogc nothrow alias pglMinSampleShadingARB = void function(GLclampf); 571 __gshared pglMinSampleShadingARB glMinSampleShadingARB; 572 573 private @nogc nothrow 574 bool loadARBSampleShading(SharedLib lib, GLSupport contextVersion) 575 { 576 lib.bindGLSymbol(cast(void**)&glMinSampleShadingARB,"glMinSampleShadingARB"); 577 return resetErrorCountGL(); 578 } 579 } 580 else enum hasARBSampleShading = false; 581 582 // ARB_texture_buffer_object 583 version(GL_ARB) enum useARBTextureBufferObject = true; 584 else version(GL_ARB_texture_buffer_object) enum useARBTextureBufferObject = true; 585 else enum useARBTextureBufferObject = false; 586 587 static if(useARBTextureBufferObject) { 588 private bool _hasARBTextureBufferObject; 589 @nogc nothrow bool hasARBTextureBufferObject() { return _hasARBTextureBufferObject; } 590 591 enum : uint { 592 GL_TEXTURE_BUFFER_ARB = 0x8C2A, 593 GL_MAX_TEXTURE_BUFFER_SIZE_ARB = 0x8C2B, 594 GL_TEXTURE_BINDING_BUFFER_ARB = 0x8C2C, 595 GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB = 0x8C2D, 596 GL_TEXTURE_BUFFER_FORMAT_ARB = 0x8C2E, 597 } 598 599 extern(System) @nogc nothrow 600 alias pglTexBufferARB = void function(GLenum,GLenum,GLuint); 601 602 __gshared pglTexBufferARB glTexBufferARB; 603 604 private @nogc nothrow 605 bool loadARBTextureBufferObject(SharedLib lib, GLSupport contextVersion) 606 { 607 lib.bindGLSymbol(cast(void**)&glTexBufferARB,"glTexBufferARB"); 608 return resetErrorCountGL(); 609 } 610 } 611 else enum hasARBTextureBufferObject = false; 612 613 // ARB_texture_compression_bptc 614 version(GL_ARB) enum useARBTextureCompressionBPTC = true; 615 else version(GL_ARB_texture_compression_bptc) enum useARBTextureCompressionBPTC = true; 616 else enum useARBTextureCompressionBPTC = false; 617 618 static if(useARBTextureCompressionBPTC) { 619 private bool _hasARBTextureCompressionBPTC; 620 @nogc nothrow bool hasARBTextureCompressionBPTC() { return _hasARBTextureCompressionBPTC; } 621 622 enum : uint { 623 GL_COMPRESSED_RGBA_BPTC_UNORM_ARB = 0x8E8C, 624 GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB = 0x8E8D, 625 GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB = 0x8E8E, 626 GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB = 0x8E8F, 627 } 628 } 629 else enum hasARBTextureCompressionBPTC = false; 630 631 // ARB_texture_cube_map_array 632 version(GL_ARB) enum useARBTextureCubeMapArray = true; 633 else version(GL_ARB_texture_cube_map_array) enum useARBTextureCubeMapArray = true; 634 else enum useARBTextureCubeMapArray = false; 635 636 static if(useARBTextureCubeMapArray) { 637 private bool _hasARBTextureCubeMapArray; 638 @nogc nothrow bool hasARBTextureCubeMapArray() { return _hasARBTextureCubeMapArray; } 639 640 enum : uint { 641 GL_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x9009, 642 GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB = 0x900A, 643 GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x900B, 644 GL_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900C, 645 GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB = 0x900D, 646 GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900E, 647 GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900F, 648 } 649 } 650 else enum hasARBTextureCubeMapArray = false; 651 652 // ARB_texture_gather 653 version(GL_ARB) enum useARBTextureGather = true; 654 else version(GL_ARB_texture_gather) enum useARBTextureGather = true; 655 else enum useARBTextureGather = false; 656 657 static if(useARBTextureGather) { 658 private bool _hasARBTextureGather; 659 @nogc nothrow bool hasARBTextureGather() { return _hasARBTextureGather; } 660 661 enum : uint { 662 GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5E, 663 GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5F, 664 } 665 } 666 else enum hasARBTextureGather = false; 667 668 // ARB_transform_feedback_overflow_query 669 version(GL_ARB) enum useARBTransformFeedbackOverflowQuery = true; 670 else version(GL_ARB_transform_feedback_overflow_query) enum useARBTransformFeedbackOverflowQuery = true; 671 else enum useARBTransformFeedbackOverflowQuery = false; 672 673 static if(useARBTransformFeedbackOverflowQuery) { 674 private bool _hasARBTransformFeedbackOverflowQuery; 675 @nogc nothrow bool hasARBTransformFeedbackOverflowQuery() { return _hasARBTransformFeedbackOverflowQuery; } 676 677 enum : uint { 678 GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB = 0x82EC, 679 GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB = 0x82ED, 680 } 681 } 682 else enum hasARBTransformFeedbackOverflowQuery = false; 683 684 // ARB_sparse_texture 685 version(GL_ARB) enum useARBSparseTexture = true; 686 else version(GL_ARB_sparse_texture) enum useARBSparseTexture = true; 687 else enum useARBSparseTexture = false; 688 689 static if(useARBSparseTexture) { 690 import bindbc.opengl.bind.arb.core_45 : useARBDirectStateAccess, hasARBDirectStateAccess; 691 692 private bool _hasARBSparseTexture; 693 @nogc nothrow bool hasARBSparseTexture() { return _hasARBSparseTexture; } 694 695 enum : uint { 696 GL_TEXTURE_SPARSE_ARB = 0x91A6, 697 GL_VIRTUAL_PAGE_SIZE_INDEX_ARB = 0x91A7, 698 699 GL_NUM_SPARSE_LEVELS_ARB = 0x91AA, 700 701 GL_NUM_VIRTUAL_PAGE_SIZES_ARB = 0x91A8, 702 GL_VIRTUAL_PAGE_SIZE_X_ARB = 0x9195, 703 GL_VIRTUAL_PAGE_SIZE_Y_ARB = 0x9196, 704 GL_VIRTUAL_PAGE_SIZE_Z_ARB = 0x9197, 705 706 GL_MAX_SPARSE_TEXTURE_SIZE_ARB = 0x9198, 707 GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB = 0x9199, 708 GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB = 0x919A, 709 GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB = 0x91A9 710 } 711 712 extern(System) @nogc nothrow { 713 alias pglTexPageCommitmentARB = 714 void function(GLenum,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLboolean); 715 static if(useARBDirectStateAccess) { 716 alias pglTexturePageCommitmentEXT = 717 void function(GLuint,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLboolean); 718 } 719 } 720 721 __gshared { 722 pglTexPageCommitmentARB glTexPageCommitmentARB; 723 static if(useARBDirectStateAccess) 724 pglTexturePageCommitmentEXT glTexturePageCommitmentEXT; 725 } 726 727 private @nogc nothrow 728 bool loadARBSparseTexture(SharedLib lib, GLSupport contextVersion) 729 { 730 lib.bindGLSymbol(cast(void**)&glTexPageCommitmentARB, "glTexPageCommitmentARB"); 731 732 static if(useARBDirectStateAccess) { 733 if(hasARBDirectStateAccess) 734 lib.bindGLSymbol(cast(void**)&glTexturePageCommitmentEXT, "glTexturePageCommitmentEXT"); 735 } 736 737 return resetErrorCountGL(); 738 } 739 } 740 741 // ARB_sparse_texture2 742 version(GL_ARB) enum useARBSparseTexture2 = true; 743 else version(GL_ARB_sparse_texture2) enum useARBSparseTexture2 = true; 744 else enum useARBSparseTexture2 = false; 745 746 static if(useARBSparseTexture2) { 747 private bool _hasARBSparseTexture2; 748 @nogc nothrow bool hasARBSparseTexture2() { return _hasARBSparseTexture2; } 749 } 750 751 // ARB_sparse_texture_clamp 752 version(GL_ARB) enum useARBSparseTextureClamp = true; 753 else version(GL_ARB_sparse_texture_clamp) enum useARBSparseTextureClamp = true; 754 else enum useARBSparseTextureClamp = false; 755 756 static if(useARBSparseTextureClamp) { 757 private bool _hasARBSparseTextureClamp; 758 @nogc nothrow bool hasARBSparseTextureClamp() { return _hasARBSparseTextureClamp; } 759 } 760 761 package @nogc nothrow 762 void loadARB_01(SharedLib lib, GLSupport contextVersion) 763 { 764 static if(useARBBindlessTexture) _hasARBBindlessTexture = 765 hasExtension(contextVersion, "GL_ARB_bindless_texture") && 766 lib.loadARBBindlessTexture(contextVersion); 767 768 static if(useARBCLEvent) _hasARBCLEvent = 769 hasExtension(contextVersion, "GL_ARB_cl_event") && 770 lib.loadARBCLEvent(contextVersion); 771 772 static if(useARBComputeVariableGroupSize) _hasARBComputeVariableGroupSize = 773 hasExtension(contextVersion, "GL_ARB_compute_variable_group_size") && 774 lib.loadARBComputeVariableGroupSize(contextVersion); 775 776 static if(useARBDebugOutput) _hasARBDebugOutput = 777 hasExtension(contextVersion, "GL_ARB_debug_output") && 778 lib.loadARBDebugOutput(contextVersion); 779 780 static if(useARBFramebufferSRGB) _hasARBFramebufferSRGB = 781 hasExtension(contextVersion, "GL_ARB_framebuffer_sRGB"); 782 783 static if(useARBGeometryShader4) _hasARBGeometryShader4 = 784 hasExtension(contextVersion, "GL_ARB_geometry_shader4") && 785 lib.loadARBGeometryShader4(contextVersion); 786 787 static if(useARBGLSPIRV) _hasARBGLSPIRV = 788 hasExtension(contextVersion, "GL_ARB_gl_spirv") && 789 lib.loadARBGLSPIRV(contextVersion); 790 791 static if(useARBGPUShaderInt64) _hasARBGPUShaderInt64 = 792 hasExtension(contextVersion, "GL_ARB_gpu_shader_int64") && 793 lib.loadARBGPUShaderInt64(contextVersion); 794 795 static if(useARBIndirectParameters) _hasARBIndirectParameters = 796 hasExtension(contextVersion, "GL_ARB_indirect_parameters") && 797 lib.loadARBIndirectParameters(contextVersion); 798 799 static if(useARBInstancedArrays) _hasARBInstancedArrays = 800 hasExtension(contextVersion, "GL_ARB_instanced_arrays") && 801 lib.loadARBInstancedArrays(contextVersion); 802 803 static if(useARBPipelineStatisticsQuery) _hasARBPipelineStatisticsQuery = 804 hasExtension(contextVersion, "GL_ARB_pipeline_statistics_query"); 805 806 static if(useARBRobustnessIsolation) _hasARBRobustnessIsolation = 807 hasExtension(contextVersion, "GL_ARB_robustness_isolation"); 808 809 static if(useARBSampleShading ) _hasARBSampleShading = 810 hasExtension(contextVersion, "GL_ARB_sample_shading") && 811 lib.loadARBSampleShading (contextVersion); 812 813 static if(useARBTextureBufferObject) _hasARBTextureBufferObject = 814 hasExtension(contextVersion, "GL_ARB_texture_buffer_object") && 815 lib.loadARBTextureBufferObject(contextVersion); 816 817 static if(useARBTextureCompressionBPTC) _hasARBTextureCompressionBPTC = 818 hasExtension(contextVersion, "GL_ARB_texture_compression_bptc"); 819 820 static if(useARBTextureCubeMapArray) _hasARBTextureCubeMapArray = 821 hasExtension(contextVersion, "GL_ARB_texture_cube_map_array"); 822 823 static if(useARBTextureGather) _hasARBTextureGather = 824 hasExtension(contextVersion, "GL_ARB_texture_gather"); 825 826 static if(useARBTransformFeedbackOverflowQuery) _hasARBTransformFeedbackOverflowQuery = 827 hasExtension(contextVersion, "GL_ARB_transform_feedback_overflow_query"); 828 829 static if(useARBSparseTexture) _hasARBSparseTexture = 830 hasExtension(contextVersion, "GL_ARB_sparse_texture") && 831 lib.loadARBSparseTexture(contextVersion); 832 833 static if(useARBSparseTexture2) _hasARBSparseTexture2 = 834 hasExtension(contextVersion, "GL_ARB_sparse_texture2"); 835 836 static if(useARBSparseTextureClamp) _hasARBSparseTextureClamp = 837 hasExtension(contextVersion, "GL_ARB_sparse_texture_clamp"); 838 }