internal.h (35817B)
1 //======================================================================== 2 // GLFW 3.4 - www.glfw.org 3 //------------------------------------------------------------------------ 4 // Copyright (c) 2002-2006 Marcus Geelnard 5 // Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org> 6 // 7 // This software is provided 'as-is', without any express or implied 8 // warranty. In no event will the authors be held liable for any damages 9 // arising from the use of this software. 10 // 11 // Permission is granted to anyone to use this software for any purpose, 12 // including commercial applications, and to alter it and redistribute it 13 // freely, subject to the following restrictions: 14 // 15 // 1. The origin of this software must not be misrepresented; you must not 16 // claim that you wrote the original software. If you use this software 17 // in a product, an acknowledgment in the product documentation would 18 // be appreciated but is not required. 19 // 20 // 2. Altered source versions must be plainly marked as such, and must not 21 // be misrepresented as being the original software. 22 // 23 // 3. This notice may not be removed or altered from any source 24 // distribution. 25 // 26 //======================================================================== 27 28 #pragma once 29 30 #if defined(_GLFW_USE_CONFIG_H) 31 #include "glfw_config.h" 32 #endif 33 34 #if defined(GLFW_INCLUDE_GLCOREARB) || \ 35 defined(GLFW_INCLUDE_ES1) || \ 36 defined(GLFW_INCLUDE_ES2) || \ 37 defined(GLFW_INCLUDE_ES3) || \ 38 defined(GLFW_INCLUDE_ES31) || \ 39 defined(GLFW_INCLUDE_ES32) || \ 40 defined(GLFW_INCLUDE_NONE) || \ 41 defined(GLFW_INCLUDE_GLEXT) || \ 42 defined(GLFW_INCLUDE_GLU) || \ 43 defined(GLFW_INCLUDE_VULKAN) || \ 44 defined(GLFW_DLL) 45 #error "You must not define any header option macros when compiling GLFW" 46 #endif 47 48 #define GLFW_INCLUDE_NONE 49 #include "../include/GLFW/glfw3.h" 50 51 #define _GLFW_INSERT_FIRST 0 52 #define _GLFW_INSERT_LAST 1 53 54 #define _GLFW_POLL_PRESENCE 0 55 #define _GLFW_POLL_AXES 1 56 #define _GLFW_POLL_BUTTONS 2 57 #define _GLFW_POLL_ALL (_GLFW_POLL_AXES | _GLFW_POLL_BUTTONS) 58 59 #define _GLFW_MESSAGE_SIZE 1024 60 61 typedef int GLFWbool; 62 typedef void (*GLFWproc)(void); 63 64 typedef struct _GLFWerror _GLFWerror; 65 typedef struct _GLFWinitconfig _GLFWinitconfig; 66 typedef struct _GLFWwndconfig _GLFWwndconfig; 67 typedef struct _GLFWctxconfig _GLFWctxconfig; 68 typedef struct _GLFWfbconfig _GLFWfbconfig; 69 typedef struct _GLFWcontext _GLFWcontext; 70 typedef struct _GLFWwindow _GLFWwindow; 71 typedef struct _GLFWplatform _GLFWplatform; 72 typedef struct _GLFWlibrary _GLFWlibrary; 73 typedef struct _GLFWmonitor _GLFWmonitor; 74 typedef struct _GLFWcursor _GLFWcursor; 75 typedef struct _GLFWmapelement _GLFWmapelement; 76 typedef struct _GLFWmapping _GLFWmapping; 77 typedef struct _GLFWjoystick _GLFWjoystick; 78 typedef struct _GLFWtls _GLFWtls; 79 typedef struct _GLFWmutex _GLFWmutex; 80 81 #define GL_VERSION 0x1f02 82 #define GL_NONE 0 83 #define GL_COLOR_BUFFER_BIT 0x00004000 84 #define GL_UNSIGNED_BYTE 0x1401 85 #define GL_EXTENSIONS 0x1f03 86 #define GL_NUM_EXTENSIONS 0x821d 87 #define GL_CONTEXT_FLAGS 0x821e 88 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 89 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 90 #define GL_CONTEXT_PROFILE_MASK 0x9126 91 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 92 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 93 #define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 94 #define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 95 #define GL_NO_RESET_NOTIFICATION_ARB 0x8261 96 #define GL_CONTEXT_RELEASE_BEHAVIOR 0x82fb 97 #define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82fc 98 #define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 99 100 typedef int GLint; 101 typedef unsigned int GLuint; 102 typedef unsigned int GLenum; 103 typedef unsigned int GLbitfield; 104 typedef unsigned char GLubyte; 105 106 typedef void (APIENTRY * PFNGLCLEARPROC)(GLbitfield); 107 typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum); 108 typedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*); 109 typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint); 110 111 #define EGL_SUCCESS 0x3000 112 #define EGL_NOT_INITIALIZED 0x3001 113 #define EGL_BAD_ACCESS 0x3002 114 #define EGL_BAD_ALLOC 0x3003 115 #define EGL_BAD_ATTRIBUTE 0x3004 116 #define EGL_BAD_CONFIG 0x3005 117 #define EGL_BAD_CONTEXT 0x3006 118 #define EGL_BAD_CURRENT_SURFACE 0x3007 119 #define EGL_BAD_DISPLAY 0x3008 120 #define EGL_BAD_MATCH 0x3009 121 #define EGL_BAD_NATIVE_PIXMAP 0x300a 122 #define EGL_BAD_NATIVE_WINDOW 0x300b 123 #define EGL_BAD_PARAMETER 0x300c 124 #define EGL_BAD_SURFACE 0x300d 125 #define EGL_CONTEXT_LOST 0x300e 126 #define EGL_COLOR_BUFFER_TYPE 0x303f 127 #define EGL_RGB_BUFFER 0x308e 128 #define EGL_SURFACE_TYPE 0x3033 129 #define EGL_WINDOW_BIT 0x0004 130 #define EGL_RENDERABLE_TYPE 0x3040 131 #define EGL_OPENGL_ES_BIT 0x0001 132 #define EGL_OPENGL_ES2_BIT 0x0004 133 #define EGL_OPENGL_BIT 0x0008 134 #define EGL_ALPHA_SIZE 0x3021 135 #define EGL_BLUE_SIZE 0x3022 136 #define EGL_GREEN_SIZE 0x3023 137 #define EGL_RED_SIZE 0x3024 138 #define EGL_DEPTH_SIZE 0x3025 139 #define EGL_STENCIL_SIZE 0x3026 140 #define EGL_SAMPLES 0x3031 141 #define EGL_OPENGL_ES_API 0x30a0 142 #define EGL_OPENGL_API 0x30a2 143 #define EGL_NONE 0x3038 144 #define EGL_RENDER_BUFFER 0x3086 145 #define EGL_SINGLE_BUFFER 0x3085 146 #define EGL_EXTENSIONS 0x3055 147 #define EGL_CONTEXT_CLIENT_VERSION 0x3098 148 #define EGL_NATIVE_VISUAL_ID 0x302e 149 #define EGL_NO_SURFACE ((EGLSurface) 0) 150 #define EGL_NO_DISPLAY ((EGLDisplay) 0) 151 #define EGL_NO_CONTEXT ((EGLContext) 0) 152 #define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType) 0) 153 154 #define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 155 #define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 156 #define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 157 #define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 158 #define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31bd 159 #define EGL_NO_RESET_NOTIFICATION_KHR 0x31be 160 #define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31bf 161 #define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 162 #define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 163 #define EGL_CONTEXT_MINOR_VERSION_KHR 0x30fb 164 #define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30fd 165 #define EGL_CONTEXT_FLAGS_KHR 0x30fc 166 #define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31b3 167 #define EGL_GL_COLORSPACE_KHR 0x309d 168 #define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 169 #define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 170 #define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0 171 #define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 172 #define EGL_PLATFORM_X11_EXT 0x31d5 173 #define EGL_PLATFORM_WAYLAND_EXT 0x31d8 174 #define EGL_PRESENT_OPAQUE_EXT 0x31df 175 #define EGL_PLATFORM_ANGLE_ANGLE 0x3202 176 #define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3203 177 #define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320d 178 #define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320e 179 #define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3207 180 #define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208 181 #define EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450 182 #define EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE 0x3489 183 #define EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE 0x348f 184 185 typedef int EGLint; 186 typedef unsigned int EGLBoolean; 187 typedef unsigned int EGLenum; 188 typedef void* EGLConfig; 189 typedef void* EGLContext; 190 typedef void* EGLDisplay; 191 typedef void* EGLSurface; 192 193 typedef void* EGLNativeDisplayType; 194 typedef void* EGLNativeWindowType; 195 196 // EGL function pointer typedefs 197 typedef EGLBoolean (APIENTRY * PFN_eglGetConfigAttrib)(EGLDisplay,EGLConfig,EGLint,EGLint*); 198 typedef EGLBoolean (APIENTRY * PFN_eglGetConfigs)(EGLDisplay,EGLConfig*,EGLint,EGLint*); 199 typedef EGLDisplay (APIENTRY * PFN_eglGetDisplay)(EGLNativeDisplayType); 200 typedef EGLint (APIENTRY * PFN_eglGetError)(void); 201 typedef EGLBoolean (APIENTRY * PFN_eglInitialize)(EGLDisplay,EGLint*,EGLint*); 202 typedef EGLBoolean (APIENTRY * PFN_eglTerminate)(EGLDisplay); 203 typedef EGLBoolean (APIENTRY * PFN_eglBindAPI)(EGLenum); 204 typedef EGLContext (APIENTRY * PFN_eglCreateContext)(EGLDisplay,EGLConfig,EGLContext,const EGLint*); 205 typedef EGLBoolean (APIENTRY * PFN_eglDestroySurface)(EGLDisplay,EGLSurface); 206 typedef EGLBoolean (APIENTRY * PFN_eglDestroyContext)(EGLDisplay,EGLContext); 207 typedef EGLSurface (APIENTRY * PFN_eglCreateWindowSurface)(EGLDisplay,EGLConfig,EGLNativeWindowType,const EGLint*); 208 typedef EGLBoolean (APIENTRY * PFN_eglMakeCurrent)(EGLDisplay,EGLSurface,EGLSurface,EGLContext); 209 typedef EGLBoolean (APIENTRY * PFN_eglSwapBuffers)(EGLDisplay,EGLSurface); 210 typedef EGLBoolean (APIENTRY * PFN_eglSwapInterval)(EGLDisplay,EGLint); 211 typedef const char* (APIENTRY * PFN_eglQueryString)(EGLDisplay,EGLint); 212 typedef GLFWglproc (APIENTRY * PFN_eglGetProcAddress)(const char*); 213 #define eglGetConfigAttrib _glfw.egl.GetConfigAttrib 214 #define eglGetConfigs _glfw.egl.GetConfigs 215 #define eglGetDisplay _glfw.egl.GetDisplay 216 #define eglGetError _glfw.egl.GetError 217 #define eglInitialize _glfw.egl.Initialize 218 #define eglTerminate _glfw.egl.Terminate 219 #define eglBindAPI _glfw.egl.BindAPI 220 #define eglCreateContext _glfw.egl.CreateContext 221 #define eglDestroySurface _glfw.egl.DestroySurface 222 #define eglDestroyContext _glfw.egl.DestroyContext 223 #define eglCreateWindowSurface _glfw.egl.CreateWindowSurface 224 #define eglMakeCurrent _glfw.egl.MakeCurrent 225 #define eglSwapBuffers _glfw.egl.SwapBuffers 226 #define eglSwapInterval _glfw.egl.SwapInterval 227 #define eglQueryString _glfw.egl.QueryString 228 #define eglGetProcAddress _glfw.egl.GetProcAddress 229 230 typedef EGLDisplay (APIENTRY * PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum,void*,const EGLint*); 231 typedef EGLSurface (APIENTRY * PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)(EGLDisplay,EGLConfig,void*,const EGLint*); 232 #define eglGetPlatformDisplayEXT _glfw.egl.GetPlatformDisplayEXT 233 #define eglCreatePlatformWindowSurfaceEXT _glfw.egl.CreatePlatformWindowSurfaceEXT 234 235 #define OSMESA_RGBA 0x1908 236 #define OSMESA_FORMAT 0x22 237 #define OSMESA_DEPTH_BITS 0x30 238 #define OSMESA_STENCIL_BITS 0x31 239 #define OSMESA_ACCUM_BITS 0x32 240 #define OSMESA_PROFILE 0x33 241 #define OSMESA_CORE_PROFILE 0x34 242 #define OSMESA_COMPAT_PROFILE 0x35 243 #define OSMESA_CONTEXT_MAJOR_VERSION 0x36 244 #define OSMESA_CONTEXT_MINOR_VERSION 0x37 245 246 typedef void* OSMesaContext; 247 typedef void (*OSMESAproc)(void); 248 249 typedef OSMesaContext (GLAPIENTRY * PFN_OSMesaCreateContextExt)(GLenum,GLint,GLint,GLint,OSMesaContext); 250 typedef OSMesaContext (GLAPIENTRY * PFN_OSMesaCreateContextAttribs)(const int*,OSMesaContext); 251 typedef void (GLAPIENTRY * PFN_OSMesaDestroyContext)(OSMesaContext); 252 typedef int (GLAPIENTRY * PFN_OSMesaMakeCurrent)(OSMesaContext,void*,int,int,int); 253 typedef int (GLAPIENTRY * PFN_OSMesaGetColorBuffer)(OSMesaContext,int*,int*,int*,void**); 254 typedef int (GLAPIENTRY * PFN_OSMesaGetDepthBuffer)(OSMesaContext,int*,int*,int*,void**); 255 typedef GLFWglproc (GLAPIENTRY * PFN_OSMesaGetProcAddress)(const char*); 256 #define OSMesaCreateContextExt _glfw.osmesa.CreateContextExt 257 #define OSMesaCreateContextAttribs _glfw.osmesa.CreateContextAttribs 258 #define OSMesaDestroyContext _glfw.osmesa.DestroyContext 259 #define OSMesaMakeCurrent _glfw.osmesa.MakeCurrent 260 #define OSMesaGetColorBuffer _glfw.osmesa.GetColorBuffer 261 #define OSMesaGetDepthBuffer _glfw.osmesa.GetDepthBuffer 262 #define OSMesaGetProcAddress _glfw.osmesa.GetProcAddress 263 264 #define VK_NULL_HANDLE 0 265 266 typedef void* VkInstance; 267 typedef void* VkPhysicalDevice; 268 typedef uint64_t VkSurfaceKHR; 269 typedef uint32_t VkFlags; 270 typedef uint32_t VkBool32; 271 272 typedef enum VkStructureType 273 { 274 VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000, 275 VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000, 276 VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000, 277 VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000, 278 VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000, 279 VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000, 280 VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF 281 } VkStructureType; 282 283 typedef enum VkResult 284 { 285 VK_SUCCESS = 0, 286 VK_NOT_READY = 1, 287 VK_TIMEOUT = 2, 288 VK_EVENT_SET = 3, 289 VK_EVENT_RESET = 4, 290 VK_INCOMPLETE = 5, 291 VK_ERROR_OUT_OF_HOST_MEMORY = -1, 292 VK_ERROR_OUT_OF_DEVICE_MEMORY = -2, 293 VK_ERROR_INITIALIZATION_FAILED = -3, 294 VK_ERROR_DEVICE_LOST = -4, 295 VK_ERROR_MEMORY_MAP_FAILED = -5, 296 VK_ERROR_LAYER_NOT_PRESENT = -6, 297 VK_ERROR_EXTENSION_NOT_PRESENT = -7, 298 VK_ERROR_FEATURE_NOT_PRESENT = -8, 299 VK_ERROR_INCOMPATIBLE_DRIVER = -9, 300 VK_ERROR_TOO_MANY_OBJECTS = -10, 301 VK_ERROR_FORMAT_NOT_SUPPORTED = -11, 302 VK_ERROR_SURFACE_LOST_KHR = -1000000000, 303 VK_SUBOPTIMAL_KHR = 1000001003, 304 VK_ERROR_OUT_OF_DATE_KHR = -1000001004, 305 VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001, 306 VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001, 307 VK_ERROR_VALIDATION_FAILED_EXT = -1000011001, 308 VK_RESULT_MAX_ENUM = 0x7FFFFFFF 309 } VkResult; 310 311 typedef struct VkAllocationCallbacks VkAllocationCallbacks; 312 313 typedef struct VkExtensionProperties 314 { 315 char extensionName[256]; 316 uint32_t specVersion; 317 } VkExtensionProperties; 318 319 typedef void (APIENTRY * PFN_vkVoidFunction)(void); 320 321 typedef PFN_vkVoidFunction (APIENTRY * PFN_vkGetInstanceProcAddr)(VkInstance,const char*); 322 typedef VkResult (APIENTRY * PFN_vkEnumerateInstanceExtensionProperties)(const char*,uint32_t*,VkExtensionProperties*); 323 #define vkGetInstanceProcAddr _glfw.vk.GetInstanceProcAddr 324 325 #include "platform.h" 326 327 #define GLFW_NATIVE_INCLUDE_NONE 328 #include "../include/GLFW/glfw3native.h" 329 330 // Checks for whether the library has been initialized 331 #define _GLFW_REQUIRE_INIT() \ 332 if (!_glfw.initialized) \ 333 { \ 334 _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \ 335 return; \ 336 } 337 #define _GLFW_REQUIRE_INIT_OR_RETURN(x) \ 338 if (!_glfw.initialized) \ 339 { \ 340 _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \ 341 return x; \ 342 } 343 344 // Swaps the provided pointers 345 #define _GLFW_SWAP(type, x, y) \ 346 { \ 347 type t; \ 348 t = x; \ 349 x = y; \ 350 y = t; \ 351 } 352 353 // Per-thread error structure 354 // 355 struct _GLFWerror 356 { 357 _GLFWerror* next; 358 int code; 359 char description[_GLFW_MESSAGE_SIZE]; 360 }; 361 362 // Initialization configuration 363 // 364 // Parameters relating to the initialization of the library 365 // 366 struct _GLFWinitconfig 367 { 368 GLFWbool hatButtons; 369 int angleType; 370 int platformID; 371 PFN_vkGetInstanceProcAddr vulkanLoader; 372 struct { 373 GLFWbool menubar; 374 GLFWbool chdir; 375 } ns; 376 struct { 377 GLFWbool xcbVulkanSurface; 378 } x11; 379 struct { 380 int libdecorMode; 381 } wl; 382 }; 383 384 // Window configuration 385 // 386 // Parameters relating to the creation of the window but not directly related 387 // to the framebuffer. This is used to pass window creation parameters from 388 // shared code to the platform API. 389 // 390 struct _GLFWwndconfig 391 { 392 int xpos; 393 int ypos; 394 int width; 395 int height; 396 const char* title; 397 GLFWbool resizable; 398 GLFWbool visible; 399 GLFWbool decorated; 400 GLFWbool focused; 401 GLFWbool autoIconify; 402 GLFWbool floating; 403 GLFWbool maximized; 404 GLFWbool centerCursor; 405 GLFWbool focusOnShow; 406 GLFWbool mousePassthrough; 407 GLFWbool scaleToMonitor; 408 GLFWbool scaleFramebuffer; 409 struct { 410 char frameName[256]; 411 } ns; 412 struct { 413 char className[256]; 414 char instanceName[256]; 415 } x11; 416 struct { 417 GLFWbool keymenu; 418 GLFWbool showDefault; 419 } win32; 420 struct { 421 char appId[256]; 422 } wl; 423 }; 424 425 // Context configuration 426 // 427 // Parameters relating to the creation of the context but not directly related 428 // to the framebuffer. This is used to pass context creation parameters from 429 // shared code to the platform API. 430 // 431 struct _GLFWctxconfig 432 { 433 int client; 434 int source; 435 int major; 436 int minor; 437 GLFWbool forward; 438 GLFWbool debug; 439 GLFWbool noerror; 440 int profile; 441 int robustness; 442 int release; 443 _GLFWwindow* share; 444 struct { 445 GLFWbool offline; 446 } nsgl; 447 }; 448 449 // Framebuffer configuration 450 // 451 // This describes buffers and their sizes. It also contains 452 // a platform-specific ID used to map back to the backend API object. 453 // 454 // It is used to pass framebuffer parameters from shared code to the platform 455 // API and also to enumerate and select available framebuffer configs. 456 // 457 struct _GLFWfbconfig 458 { 459 int redBits; 460 int greenBits; 461 int blueBits; 462 int alphaBits; 463 int depthBits; 464 int stencilBits; 465 int accumRedBits; 466 int accumGreenBits; 467 int accumBlueBits; 468 int accumAlphaBits; 469 int auxBuffers; 470 GLFWbool stereo; 471 int samples; 472 GLFWbool sRGB; 473 GLFWbool doublebuffer; 474 GLFWbool transparent; 475 uintptr_t handle; 476 }; 477 478 // Context structure 479 // 480 struct _GLFWcontext 481 { 482 int client; 483 int source; 484 int major, minor, revision; 485 GLFWbool forward, debug, noerror; 486 int profile; 487 int robustness; 488 int release; 489 490 PFNGLGETSTRINGIPROC GetStringi; 491 PFNGLGETINTEGERVPROC GetIntegerv; 492 PFNGLGETSTRINGPROC GetString; 493 494 void (*makeCurrent)(_GLFWwindow*); 495 void (*swapBuffers)(_GLFWwindow*); 496 void (*swapInterval)(int); 497 int (*extensionSupported)(const char*); 498 GLFWglproc (*getProcAddress)(const char*); 499 void (*destroy)(_GLFWwindow*); 500 501 struct { 502 EGLConfig config; 503 EGLContext handle; 504 EGLSurface surface; 505 void* client; 506 } egl; 507 508 struct { 509 OSMesaContext handle; 510 int width; 511 int height; 512 void* buffer; 513 } osmesa; 514 515 // This is defined in platform.h 516 GLFW_PLATFORM_CONTEXT_STATE 517 }; 518 519 // Window and context structure 520 // 521 struct _GLFWwindow 522 { 523 struct _GLFWwindow* next; 524 525 // Window settings and state 526 GLFWbool resizable; 527 GLFWbool decorated; 528 GLFWbool autoIconify; 529 GLFWbool floating; 530 GLFWbool focusOnShow; 531 GLFWbool mousePassthrough; 532 GLFWbool shouldClose; 533 void* userPointer; 534 GLFWbool doublebuffer; 535 GLFWvidmode videoMode; 536 _GLFWmonitor* monitor; 537 _GLFWcursor* cursor; 538 char* title; 539 540 int minwidth, minheight; 541 int maxwidth, maxheight; 542 int numer, denom; 543 544 GLFWbool stickyKeys; 545 GLFWbool stickyMouseButtons; 546 GLFWbool lockKeyMods; 547 int cursorMode; 548 char mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1]; 549 char keys[GLFW_KEY_LAST + 1]; 550 // Virtual cursor position when cursor is disabled 551 double virtualCursorPosX, virtualCursorPosY; 552 GLFWbool rawMouseMotion; 553 554 _GLFWcontext context; 555 556 struct { 557 GLFWwindowposfun pos; 558 GLFWwindowsizefun size; 559 GLFWwindowclosefun close; 560 GLFWwindowrefreshfun refresh; 561 GLFWwindowfocusfun focus; 562 GLFWwindowiconifyfun iconify; 563 GLFWwindowmaximizefun maximize; 564 GLFWframebuffersizefun fbsize; 565 GLFWwindowcontentscalefun scale; 566 GLFWmousebuttonfun mouseButton; 567 GLFWcursorposfun cursorPos; 568 GLFWcursorenterfun cursorEnter; 569 GLFWscrollfun scroll; 570 GLFWkeyfun key; 571 GLFWcharfun character; 572 GLFWcharmodsfun charmods; 573 GLFWdropfun drop; 574 } callbacks; 575 576 // This is defined in platform.h 577 GLFW_PLATFORM_WINDOW_STATE 578 }; 579 580 // Monitor structure 581 // 582 struct _GLFWmonitor 583 { 584 char name[128]; 585 void* userPointer; 586 587 // Physical dimensions in millimeters. 588 int widthMM, heightMM; 589 590 // The window whose video mode is current on this monitor 591 _GLFWwindow* window; 592 593 GLFWvidmode* modes; 594 int modeCount; 595 GLFWvidmode currentMode; 596 597 GLFWgammaramp originalRamp; 598 GLFWgammaramp currentRamp; 599 600 // This is defined in platform.h 601 GLFW_PLATFORM_MONITOR_STATE 602 }; 603 604 // Cursor structure 605 // 606 struct _GLFWcursor 607 { 608 _GLFWcursor* next; 609 // This is defined in platform.h 610 GLFW_PLATFORM_CURSOR_STATE 611 }; 612 613 // Gamepad mapping element structure 614 // 615 struct _GLFWmapelement 616 { 617 uint8_t type; 618 uint8_t index; 619 int8_t axisScale; 620 int8_t axisOffset; 621 }; 622 623 // Gamepad mapping structure 624 // 625 struct _GLFWmapping 626 { 627 char name[128]; 628 char guid[33]; 629 _GLFWmapelement buttons[15]; 630 _GLFWmapelement axes[6]; 631 }; 632 633 // Joystick structure 634 // 635 struct _GLFWjoystick 636 { 637 GLFWbool allocated; 638 GLFWbool connected; 639 float* axes; 640 int axisCount; 641 unsigned char* buttons; 642 int buttonCount; 643 unsigned char* hats; 644 int hatCount; 645 char name[128]; 646 void* userPointer; 647 char guid[33]; 648 _GLFWmapping* mapping; 649 650 // This is defined in platform.h 651 GLFW_PLATFORM_JOYSTICK_STATE 652 }; 653 654 // Thread local storage structure 655 // 656 struct _GLFWtls 657 { 658 // This is defined in platform.h 659 GLFW_PLATFORM_TLS_STATE 660 }; 661 662 // Mutex structure 663 // 664 struct _GLFWmutex 665 { 666 // This is defined in platform.h 667 GLFW_PLATFORM_MUTEX_STATE 668 }; 669 670 // Platform API structure 671 // 672 struct _GLFWplatform 673 { 674 int platformID; 675 // init 676 GLFWbool (*init)(void); 677 void (*terminate)(void); 678 // input 679 void (*getCursorPos)(_GLFWwindow*,double*,double*); 680 void (*setCursorPos)(_GLFWwindow*,double,double); 681 void (*setCursorMode)(_GLFWwindow*,int); 682 void (*setRawMouseMotion)(_GLFWwindow*,GLFWbool); 683 GLFWbool (*rawMouseMotionSupported)(void); 684 GLFWbool (*createCursor)(_GLFWcursor*,const GLFWimage*,int,int); 685 GLFWbool (*createStandardCursor)(_GLFWcursor*,int); 686 void (*destroyCursor)(_GLFWcursor*); 687 void (*setCursor)(_GLFWwindow*,_GLFWcursor*); 688 const char* (*getScancodeName)(int); 689 int (*getKeyScancode)(int); 690 void (*setClipboardString)(const char*); 691 const char* (*getClipboardString)(void); 692 GLFWbool (*initJoysticks)(void); 693 void (*terminateJoysticks)(void); 694 GLFWbool (*pollJoystick)(_GLFWjoystick*,int); 695 const char* (*getMappingName)(void); 696 void (*updateGamepadGUID)(char*); 697 // monitor 698 void (*freeMonitor)(_GLFWmonitor*); 699 void (*getMonitorPos)(_GLFWmonitor*,int*,int*); 700 void (*getMonitorContentScale)(_GLFWmonitor*,float*,float*); 701 void (*getMonitorWorkarea)(_GLFWmonitor*,int*,int*,int*,int*); 702 GLFWvidmode* (*getVideoModes)(_GLFWmonitor*,int*); 703 GLFWbool (*getVideoMode)(_GLFWmonitor*,GLFWvidmode*); 704 GLFWbool (*getGammaRamp)(_GLFWmonitor*,GLFWgammaramp*); 705 void (*setGammaRamp)(_GLFWmonitor*,const GLFWgammaramp*); 706 // window 707 GLFWbool (*createWindow)(_GLFWwindow*,const _GLFWwndconfig*,const _GLFWctxconfig*,const _GLFWfbconfig*); 708 void (*destroyWindow)(_GLFWwindow*); 709 void (*setWindowTitle)(_GLFWwindow*,const char*); 710 void (*setWindowIcon)(_GLFWwindow*,int,const GLFWimage*); 711 void (*getWindowPos)(_GLFWwindow*,int*,int*); 712 void (*setWindowPos)(_GLFWwindow*,int,int); 713 void (*getWindowSize)(_GLFWwindow*,int*,int*); 714 void (*setWindowSize)(_GLFWwindow*,int,int); 715 void (*setWindowSizeLimits)(_GLFWwindow*,int,int,int,int); 716 void (*setWindowAspectRatio)(_GLFWwindow*,int,int); 717 void (*getFramebufferSize)(_GLFWwindow*,int*,int*); 718 void (*getWindowFrameSize)(_GLFWwindow*,int*,int*,int*,int*); 719 void (*getWindowContentScale)(_GLFWwindow*,float*,float*); 720 void (*iconifyWindow)(_GLFWwindow*); 721 void (*restoreWindow)(_GLFWwindow*); 722 void (*maximizeWindow)(_GLFWwindow*); 723 void (*showWindow)(_GLFWwindow*); 724 void (*hideWindow)(_GLFWwindow*); 725 void (*requestWindowAttention)(_GLFWwindow*); 726 void (*focusWindow)(_GLFWwindow*); 727 void (*setWindowMonitor)(_GLFWwindow*,_GLFWmonitor*,int,int,int,int,int); 728 GLFWbool (*windowFocused)(_GLFWwindow*); 729 GLFWbool (*windowIconified)(_GLFWwindow*); 730 GLFWbool (*windowVisible)(_GLFWwindow*); 731 GLFWbool (*windowMaximized)(_GLFWwindow*); 732 GLFWbool (*windowHovered)(_GLFWwindow*); 733 GLFWbool (*framebufferTransparent)(_GLFWwindow*); 734 float (*getWindowOpacity)(_GLFWwindow*); 735 void (*setWindowResizable)(_GLFWwindow*,GLFWbool); 736 void (*setWindowDecorated)(_GLFWwindow*,GLFWbool); 737 void (*setWindowFloating)(_GLFWwindow*,GLFWbool); 738 void (*setWindowOpacity)(_GLFWwindow*,float); 739 void (*setWindowMousePassthrough)(_GLFWwindow*,GLFWbool); 740 void (*pollEvents)(void); 741 void (*waitEvents)(void); 742 void (*waitEventsTimeout)(double); 743 void (*postEmptyEvent)(void); 744 // EGL 745 EGLenum (*getEGLPlatform)(EGLint**); 746 EGLNativeDisplayType (*getEGLNativeDisplay)(void); 747 EGLNativeWindowType (*getEGLNativeWindow)(_GLFWwindow*); 748 // vulkan 749 void (*getRequiredInstanceExtensions)(char**); 750 GLFWbool (*getPhysicalDevicePresentationSupport)(VkInstance,VkPhysicalDevice,uint32_t); 751 VkResult (*createWindowSurface)(VkInstance,_GLFWwindow*,const VkAllocationCallbacks*,VkSurfaceKHR*); 752 }; 753 754 // Library global data 755 // 756 struct _GLFWlibrary 757 { 758 GLFWbool initialized; 759 GLFWallocator allocator; 760 761 _GLFWplatform platform; 762 763 struct { 764 _GLFWinitconfig init; 765 _GLFWfbconfig framebuffer; 766 _GLFWwndconfig window; 767 _GLFWctxconfig context; 768 int refreshRate; 769 } hints; 770 771 _GLFWerror* errorListHead; 772 _GLFWcursor* cursorListHead; 773 _GLFWwindow* windowListHead; 774 775 _GLFWmonitor** monitors; 776 int monitorCount; 777 778 GLFWbool joysticksInitialized; 779 _GLFWjoystick joysticks[GLFW_JOYSTICK_LAST + 1]; 780 _GLFWmapping* mappings; 781 int mappingCount; 782 783 _GLFWtls errorSlot; 784 _GLFWtls contextSlot; 785 _GLFWmutex errorLock; 786 787 struct { 788 uint64_t offset; 789 // This is defined in platform.h 790 GLFW_PLATFORM_LIBRARY_TIMER_STATE 791 } timer; 792 793 struct { 794 EGLenum platform; 795 EGLDisplay display; 796 EGLint major, minor; 797 GLFWbool prefix; 798 799 GLFWbool KHR_create_context; 800 GLFWbool KHR_create_context_no_error; 801 GLFWbool KHR_gl_colorspace; 802 GLFWbool KHR_get_all_proc_addresses; 803 GLFWbool KHR_context_flush_control; 804 GLFWbool EXT_client_extensions; 805 GLFWbool EXT_platform_base; 806 GLFWbool EXT_platform_x11; 807 GLFWbool EXT_platform_wayland; 808 GLFWbool EXT_present_opaque; 809 GLFWbool ANGLE_platform_angle; 810 GLFWbool ANGLE_platform_angle_opengl; 811 GLFWbool ANGLE_platform_angle_d3d; 812 GLFWbool ANGLE_platform_angle_vulkan; 813 GLFWbool ANGLE_platform_angle_metal; 814 815 void* handle; 816 817 PFN_eglGetConfigAttrib GetConfigAttrib; 818 PFN_eglGetConfigs GetConfigs; 819 PFN_eglGetDisplay GetDisplay; 820 PFN_eglGetError GetError; 821 PFN_eglInitialize Initialize; 822 PFN_eglTerminate Terminate; 823 PFN_eglBindAPI BindAPI; 824 PFN_eglCreateContext CreateContext; 825 PFN_eglDestroySurface DestroySurface; 826 PFN_eglDestroyContext DestroyContext; 827 PFN_eglCreateWindowSurface CreateWindowSurface; 828 PFN_eglMakeCurrent MakeCurrent; 829 PFN_eglSwapBuffers SwapBuffers; 830 PFN_eglSwapInterval SwapInterval; 831 PFN_eglQueryString QueryString; 832 PFN_eglGetProcAddress GetProcAddress; 833 834 PFNEGLGETPLATFORMDISPLAYEXTPROC GetPlatformDisplayEXT; 835 PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC CreatePlatformWindowSurfaceEXT; 836 } egl; 837 838 struct { 839 void* handle; 840 841 PFN_OSMesaCreateContextExt CreateContextExt; 842 PFN_OSMesaCreateContextAttribs CreateContextAttribs; 843 PFN_OSMesaDestroyContext DestroyContext; 844 PFN_OSMesaMakeCurrent MakeCurrent; 845 PFN_OSMesaGetColorBuffer GetColorBuffer; 846 PFN_OSMesaGetDepthBuffer GetDepthBuffer; 847 PFN_OSMesaGetProcAddress GetProcAddress; 848 849 } osmesa; 850 851 struct { 852 GLFWbool available; 853 void* handle; 854 char* extensions[2]; 855 PFN_vkGetInstanceProcAddr GetInstanceProcAddr; 856 GLFWbool KHR_surface; 857 GLFWbool KHR_win32_surface; 858 GLFWbool MVK_macos_surface; 859 GLFWbool EXT_metal_surface; 860 GLFWbool KHR_xlib_surface; 861 GLFWbool KHR_xcb_surface; 862 GLFWbool KHR_wayland_surface; 863 } vk; 864 865 struct { 866 GLFWmonitorfun monitor; 867 GLFWjoystickfun joystick; 868 } callbacks; 869 870 // These are defined in platform.h 871 GLFW_PLATFORM_LIBRARY_WINDOW_STATE 872 GLFW_PLATFORM_LIBRARY_CONTEXT_STATE 873 GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE 874 }; 875 876 // Global state shared between compilation units of GLFW 877 // 878 extern _GLFWlibrary _glfw; 879 880 881 ////////////////////////////////////////////////////////////////////////// 882 ////// GLFW platform API ////// 883 ////////////////////////////////////////////////////////////////////////// 884 885 void _glfwPlatformInitTimer(void); 886 uint64_t _glfwPlatformGetTimerValue(void); 887 uint64_t _glfwPlatformGetTimerFrequency(void); 888 889 GLFWbool _glfwPlatformCreateTls(_GLFWtls* tls); 890 void _glfwPlatformDestroyTls(_GLFWtls* tls); 891 void* _glfwPlatformGetTls(_GLFWtls* tls); 892 void _glfwPlatformSetTls(_GLFWtls* tls, void* value); 893 894 GLFWbool _glfwPlatformCreateMutex(_GLFWmutex* mutex); 895 void _glfwPlatformDestroyMutex(_GLFWmutex* mutex); 896 void _glfwPlatformLockMutex(_GLFWmutex* mutex); 897 void _glfwPlatformUnlockMutex(_GLFWmutex* mutex); 898 899 void* _glfwPlatformLoadModule(const char* path); 900 void _glfwPlatformFreeModule(void* module); 901 GLFWproc _glfwPlatformGetModuleSymbol(void* module, const char* name); 902 903 904 ////////////////////////////////////////////////////////////////////////// 905 ////// GLFW event API ////// 906 ////////////////////////////////////////////////////////////////////////// 907 908 void _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused); 909 void _glfwInputWindowPos(_GLFWwindow* window, int xpos, int ypos); 910 void _glfwInputWindowSize(_GLFWwindow* window, int width, int height); 911 void _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height); 912 void _glfwInputWindowContentScale(_GLFWwindow* window, 913 float xscale, float yscale); 914 void _glfwInputWindowIconify(_GLFWwindow* window, GLFWbool iconified); 915 void _glfwInputWindowMaximize(_GLFWwindow* window, GLFWbool maximized); 916 void _glfwInputWindowDamage(_GLFWwindow* window); 917 void _glfwInputWindowCloseRequest(_GLFWwindow* window); 918 void _glfwInputWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor); 919 920 void _glfwInputKey(_GLFWwindow* window, 921 int key, int scancode, int action, int mods); 922 void _glfwInputChar(_GLFWwindow* window, 923 uint32_t codepoint, int mods, GLFWbool plain); 924 void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset); 925 void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods); 926 void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos); 927 void _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered); 928 void _glfwInputDrop(_GLFWwindow* window, int count, const char** names); 929 void _glfwInputJoystick(_GLFWjoystick* js, int event); 930 void _glfwInputJoystickAxis(_GLFWjoystick* js, int axis, float value); 931 void _glfwInputJoystickButton(_GLFWjoystick* js, int button, char value); 932 void _glfwInputJoystickHat(_GLFWjoystick* js, int hat, char value); 933 934 void _glfwInputMonitor(_GLFWmonitor* monitor, int action, int placement); 935 void _glfwInputMonitorWindow(_GLFWmonitor* monitor, _GLFWwindow* window); 936 937 #if defined(__GNUC__) 938 void _glfwInputError(int code, const char* format, ...) 939 __attribute__((format(printf, 2, 3))); 940 #else 941 void _glfwInputError(int code, const char* format, ...); 942 #endif 943 944 945 ////////////////////////////////////////////////////////////////////////// 946 ////// GLFW internal API ////// 947 ////////////////////////////////////////////////////////////////////////// 948 949 GLFWbool _glfwSelectPlatform(int platformID, _GLFWplatform* platform); 950 951 GLFWbool _glfwStringInExtensionString(const char* string, const char* extensions); 952 const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired, 953 const _GLFWfbconfig* alternatives, 954 unsigned int count); 955 GLFWbool _glfwRefreshContextAttribs(_GLFWwindow* window, 956 const _GLFWctxconfig* ctxconfig); 957 GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig); 958 959 const GLFWvidmode* _glfwChooseVideoMode(_GLFWmonitor* monitor, 960 const GLFWvidmode* desired); 961 int _glfwCompareVideoModes(const GLFWvidmode* first, const GLFWvidmode* second); 962 _GLFWmonitor* _glfwAllocMonitor(const char* name, int widthMM, int heightMM); 963 void _glfwFreeMonitor(_GLFWmonitor* monitor); 964 void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size); 965 void _glfwFreeGammaArrays(GLFWgammaramp* ramp); 966 void _glfwSplitBPP(int bpp, int* red, int* green, int* blue); 967 968 void _glfwInitGamepadMappings(void); 969 _GLFWjoystick* _glfwAllocJoystick(const char* name, 970 const char* guid, 971 int axisCount, 972 int buttonCount, 973 int hatCount); 974 void _glfwFreeJoystick(_GLFWjoystick* js); 975 void _glfwCenterCursorInContentArea(_GLFWwindow* window); 976 977 GLFWbool _glfwInitEGL(void); 978 void _glfwTerminateEGL(void); 979 GLFWbool _glfwCreateContextEGL(_GLFWwindow* window, 980 const _GLFWctxconfig* ctxconfig, 981 const _GLFWfbconfig* fbconfig); 982 #if defined(_GLFW_X11) 983 GLFWbool _glfwChooseVisualEGL(const _GLFWwndconfig* wndconfig, 984 const _GLFWctxconfig* ctxconfig, 985 const _GLFWfbconfig* fbconfig, 986 Visual** visual, int* depth); 987 #endif /*_GLFW_X11*/ 988 989 GLFWbool _glfwInitOSMesa(void); 990 void _glfwTerminateOSMesa(void); 991 GLFWbool _glfwCreateContextOSMesa(_GLFWwindow* window, 992 const _GLFWctxconfig* ctxconfig, 993 const _GLFWfbconfig* fbconfig); 994 995 GLFWbool _glfwInitVulkan(int mode); 996 void _glfwTerminateVulkan(void); 997 const char* _glfwGetVulkanResultString(VkResult result); 998 999 size_t _glfwEncodeUTF8(char* s, uint32_t codepoint); 1000 char** _glfwParseUriList(char* text, int* count); 1001 1002 char* _glfw_strdup(const char* source); 1003 int _glfw_min(int a, int b); 1004 int _glfw_max(int a, int b); 1005 1006 void* _glfw_calloc(size_t count, size_t size); 1007 void* _glfw_realloc(void* pointer, size_t size); 1008 void _glfw_free(void* pointer); 1009