aboutsummaryrefslogtreecommitdiff
path: root/3rdparty/glfw/source/tests
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/glfw/source/tests')
-rw-r--r--3rdparty/glfw/source/tests/CMakeLists.txt86
-rw-r--r--3rdparty/glfw/source/tests/allocator.c142
-rw-r--r--3rdparty/glfw/source/tests/clipboard.c146
-rw-r--r--3rdparty/glfw/source/tests/cursor.c489
-rw-r--r--3rdparty/glfw/source/tests/empty.c133
-rw-r--r--3rdparty/glfw/source/tests/events.c692
-rw-r--r--3rdparty/glfw/source/tests/gamma.c187
-rw-r--r--3rdparty/glfw/source/tests/glfwinfo.c1061
-rw-r--r--3rdparty/glfw/source/tests/icon.c150
-rw-r--r--3rdparty/glfw/source/tests/iconify.c298
-rw-r--r--3rdparty/glfw/source/tests/inputlag.c310
-rw-r--r--3rdparty/glfw/source/tests/joysticks.c346
-rw-r--r--3rdparty/glfw/source/tests/monitors.c263
-rw-r--r--3rdparty/glfw/source/tests/msaa.c221
-rw-r--r--3rdparty/glfw/source/tests/reopen.c241
-rw-r--r--3rdparty/glfw/source/tests/tearing.c251
-rw-r--r--3rdparty/glfw/source/tests/threads.c153
-rw-r--r--3rdparty/glfw/source/tests/timeout.c99
-rw-r--r--3rdparty/glfw/source/tests/title.c73
-rw-r--r--3rdparty/glfw/source/tests/triangle-vulkan.c2129
-rw-r--r--3rdparty/glfw/source/tests/window.c428
21 files changed, 0 insertions, 7898 deletions
diff --git a/3rdparty/glfw/source/tests/CMakeLists.txt b/3rdparty/glfw/source/tests/CMakeLists.txt
deleted file mode 100644
index f81cfeb..0000000
--- a/3rdparty/glfw/source/tests/CMakeLists.txt
+++ /dev/null
@@ -1,86 +0,0 @@
-
-link_libraries(glfw)
-
-include_directories("${GLFW_SOURCE_DIR}/deps")
-
-if (MATH_LIBRARY)
- link_libraries("${MATH_LIBRARY}")
-endif()
-
-# Workaround for the MS CRT deprecating parts of the standard library
-if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
- add_definitions(-D_CRT_SECURE_NO_WARNINGS)
-endif()
-
-set(GLAD_GL "${GLFW_SOURCE_DIR}/deps/glad/gl.h")
-set(GLAD_VULKAN "${GLFW_SOURCE_DIR}/deps/glad/vulkan.h")
-set(GETOPT "${GLFW_SOURCE_DIR}/deps/getopt.h"
- "${GLFW_SOURCE_DIR}/deps/getopt.c")
-set(TINYCTHREAD "${GLFW_SOURCE_DIR}/deps/tinycthread.h"
- "${GLFW_SOURCE_DIR}/deps/tinycthread.c")
-
-add_executable(allocator allocator.c ${GLAD_GL})
-add_executable(clipboard clipboard.c ${GETOPT} ${GLAD_GL})
-add_executable(events events.c ${GETOPT} ${GLAD_GL})
-add_executable(msaa msaa.c ${GETOPT} ${GLAD_GL})
-add_executable(glfwinfo glfwinfo.c ${GETOPT} ${GLAD_GL} ${GLAD_VULKAN})
-add_executable(iconify iconify.c ${GETOPT} ${GLAD_GL})
-add_executable(monitors monitors.c ${GETOPT} ${GLAD_GL})
-add_executable(reopen reopen.c ${GLAD_GL})
-add_executable(cursor cursor.c ${GLAD_GL})
-
-add_executable(empty WIN32 MACOSX_BUNDLE empty.c ${TINYCTHREAD} ${GLAD_GL})
-add_executable(gamma WIN32 MACOSX_BUNDLE gamma.c ${GLAD_GL})
-add_executable(icon WIN32 MACOSX_BUNDLE icon.c ${GLAD_GL})
-add_executable(inputlag WIN32 MACOSX_BUNDLE inputlag.c ${GETOPT} ${GLAD_GL})
-add_executable(joysticks WIN32 MACOSX_BUNDLE joysticks.c ${GLAD_GL})
-add_executable(tearing WIN32 MACOSX_BUNDLE tearing.c ${GLAD_GL})
-add_executable(threads WIN32 MACOSX_BUNDLE threads.c ${TINYCTHREAD} ${GLAD_GL})
-add_executable(timeout WIN32 MACOSX_BUNDLE timeout.c ${GLAD_GL})
-add_executable(title WIN32 MACOSX_BUNDLE title.c ${GLAD_GL})
-add_executable(triangle-vulkan WIN32 triangle-vulkan.c ${GLAD_VULKAN})
-add_executable(window WIN32 MACOSX_BUNDLE window.c ${GLAD_GL})
-
-target_link_libraries(empty Threads::Threads)
-target_link_libraries(threads Threads::Threads)
-if (RT_LIBRARY)
- target_link_libraries(empty "${RT_LIBRARY}")
- target_link_libraries(threads "${RT_LIBRARY}")
-endif()
-
-set(GUI_ONLY_BINARIES empty gamma icon inputlag joysticks tearing threads
- timeout title triangle-vulkan window)
-set(CONSOLE_BINARIES allocator clipboard events msaa glfwinfo iconify monitors
- reopen cursor)
-
-set_target_properties(${GUI_ONLY_BINARIES} ${CONSOLE_BINARIES} PROPERTIES
- C_STANDARD 99
- FOLDER "GLFW3/Tests")
-
-if (MSVC)
- # Tell MSVC to use main instead of WinMain
- set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
- LINK_FLAGS "/ENTRY:mainCRTStartup")
-elseif (CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
- # Tell Clang using MS CRT to use main instead of WinMain
- set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
- LINK_FLAGS "-Wl,/entry:mainCRTStartup")
-endif()
-
-if (APPLE)
- set_target_properties(empty PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Empty Event")
- set_target_properties(gamma PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Gamma")
- set_target_properties(inputlag PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Input Lag")
- set_target_properties(joysticks PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Joysticks")
- set_target_properties(tearing PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Tearing")
- set_target_properties(threads PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Threads")
- set_target_properties(timeout PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Timeout")
- set_target_properties(title PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Title")
- set_target_properties(window PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Window")
-
- set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES
- MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}
- MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION}
- MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/Info.plist.in")
-endif()
-
diff --git a/3rdparty/glfw/source/tests/allocator.c b/3rdparty/glfw/source/tests/allocator.c
deleted file mode 100644
index 3fb004d..0000000
--- a/3rdparty/glfw/source/tests/allocator.c
+++ /dev/null
@@ -1,142 +0,0 @@
-//========================================================================
-// Custom heap allocator test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define CALL(x) (function_name = #x, x)
-static const char* function_name = NULL;
-
-struct allocator_stats
-{
- size_t total;
- size_t current;
- size_t maximum;
-};
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void* allocate(size_t size, void* user)
-{
- struct allocator_stats* stats = user;
- assert(size > 0);
-
- stats->total += size;
- stats->current += size;
- if (stats->current > stats->maximum)
- stats->maximum = stats->current;
-
- printf("%s: allocate %zu bytes (current %zu maximum %zu total %zu)\n",
- function_name, size, stats->current, stats->maximum, stats->total);
-
- size_t* real_block = malloc(size + sizeof(size_t));
- assert(real_block != NULL);
- *real_block = size;
- return real_block + 1;
-}
-
-static void deallocate(void* block, void* user)
-{
- struct allocator_stats* stats = user;
- assert(block != NULL);
-
- size_t* real_block = (size_t*) block - 1;
- stats->current -= *real_block;
-
- printf("%s: deallocate %zu bytes (current %zu maximum %zu total %zu)\n",
- function_name, *real_block, stats->current, stats->maximum, stats->total);
-
- free(real_block);
-}
-
-static void* reallocate(void* block, size_t size, void* user)
-{
- struct allocator_stats* stats = user;
- assert(block != NULL);
- assert(size > 0);
-
- size_t* real_block = (size_t*) block - 1;
- stats->total += size;
- stats->current += size - *real_block;
- if (stats->current > stats->maximum)
- stats->maximum = stats->current;
-
- printf("%s: reallocate %zu bytes to %zu bytes (current %zu maximum %zu total %zu)\n",
- function_name, *real_block, size, stats->current, stats->maximum, stats->total);
-
- real_block = realloc(real_block, size + sizeof(size_t));
- assert(real_block != NULL);
- *real_block = size;
- return real_block + 1;
-}
-
-int main(void)
-{
- struct allocator_stats stats = {0};
- const GLFWallocator allocator =
- {
- .allocate = allocate,
- .deallocate = deallocate,
- .reallocate = reallocate,
- .user = &stats
- };
-
- glfwSetErrorCallback(error_callback);
- glfwInitAllocator(&allocator);
-
- if (!CALL(glfwInit)())
- exit(EXIT_FAILURE);
-
- GLFWwindow* window = CALL(glfwCreateWindow)(400, 400, "Custom allocator test", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- CALL(glfwMakeContextCurrent)(window);
- gladLoadGL(glfwGetProcAddress);
- CALL(glfwSwapInterval)(1);
-
- while (!CALL(glfwWindowShouldClose)(window))
- {
- glClear(GL_COLOR_BUFFER_BIT);
- CALL(glfwSwapBuffers)(window);
- CALL(glfwWaitEvents)();
- }
-
- CALL(glfwTerminate)();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/clipboard.c b/3rdparty/glfw/source/tests/clipboard.c
deleted file mode 100644
index eaad516..0000000
--- a/3rdparty/glfw/source/tests/clipboard.c
+++ /dev/null
@@ -1,146 +0,0 @@
-//========================================================================
-// Clipboard test program
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This program is used to test the clipboard functionality.
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "getopt.h"
-
-#if defined(__APPLE__)
- #define MODIFIER GLFW_MOD_SUPER
-#else
- #define MODIFIER GLFW_MOD_CONTROL
-#endif
-
-static void usage(void)
-{
- printf("Usage: clipboard [-h]\n");
-}
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (action != GLFW_PRESS)
- return;
-
- switch (key)
- {
- case GLFW_KEY_ESCAPE:
- glfwSetWindowShouldClose(window, GLFW_TRUE);
- break;
-
- case GLFW_KEY_V:
- if (mods == MODIFIER)
- {
- const char* string;
-
- string = glfwGetClipboardString(NULL);
- if (string)
- printf("Clipboard contains \"%s\"\n", string);
- else
- printf("Clipboard does not contain a string\n");
- }
- break;
-
- case GLFW_KEY_C:
- if (mods == MODIFIER)
- {
- const char* string = "Hello GLFW World!";
- glfwSetClipboardString(NULL, string);
- printf("Setting clipboard to \"%s\"\n", string);
- }
- break;
- }
-}
-
-int main(int argc, char** argv)
-{
- int ch;
- GLFWwindow* window;
-
- while ((ch = getopt(argc, argv, "h")) != -1)
- {
- switch (ch)
- {
- case 'h':
- usage();
- exit(EXIT_SUCCESS);
-
- default:
- usage();
- exit(EXIT_FAILURE);
- }
- }
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- {
- fprintf(stderr, "Failed to initialize GLFW\n");
- exit(EXIT_FAILURE);
- }
-
- window = glfwCreateWindow(200, 200, "Clipboard Test", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
-
- fprintf(stderr, "Failed to open GLFW window\n");
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSwapInterval(1);
-
- glfwSetKeyCallback(window, key_callback);
-
- glClearColor(0.5f, 0.5f, 0.5f, 0);
-
- while (!glfwWindowShouldClose(window))
- {
- glClear(GL_COLOR_BUFFER_BIT);
-
- glfwSwapBuffers(window);
- glfwWaitEvents();
- }
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/cursor.c b/3rdparty/glfw/source/tests/cursor.c
deleted file mode 100644
index 9be4274..0000000
--- a/3rdparty/glfw/source/tests/cursor.c
+++ /dev/null
@@ -1,489 +0,0 @@
-//========================================================================
-// Cursor & input mode tests
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test provides an interface to the cursor image and cursor mode
-// parts of the API.
-//
-// Custom cursor image generation by urraka.
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#if defined(_MSC_VER)
- // Make MS math.h define M_PI
- #define _USE_MATH_DEFINES
-#endif
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "linmath.h"
-
-#define CURSOR_FRAME_COUNT 60
-
-static const char* vertex_shader_text =
-"#version 110\n"
-"uniform mat4 MVP;\n"
-"attribute vec2 vPos;\n"
-"void main()\n"
-"{\n"
-" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
-"}\n";
-
-static const char* fragment_shader_text =
-"#version 110\n"
-"void main()\n"
-"{\n"
-" gl_FragColor = vec4(1.0);\n"
-"}\n";
-
-static double cursor_x;
-static double cursor_y;
-static int swap_interval = 1;
-static int wait_events = GLFW_TRUE;
-static int animate_cursor = GLFW_FALSE;
-static int track_cursor = GLFW_FALSE;
-static GLFWcursor* standard_cursors[10];
-static GLFWcursor* tracking_cursor = NULL;
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static float star(int x, int y, float t)
-{
- const float c = 64 / 2.f;
-
- const float i = (0.25f * (float) sin(2.f * M_PI * t) + 0.75f);
- const float k = 64 * 0.046875f * i;
-
- const float dist = (float) sqrt((x - c) * (x - c) + (y - c) * (y - c));
-
- const float salpha = 1.f - dist / c;
- const float xalpha = (float) x == c ? c : k / (float) fabs(x - c);
- const float yalpha = (float) y == c ? c : k / (float) fabs(y - c);
-
- return (float) fmax(0.f, fmin(1.f, i * salpha * 0.2f + salpha * xalpha * yalpha));
-}
-
-static GLFWcursor* create_cursor_frame(float t)
-{
- int i = 0, x, y;
- unsigned char buffer[64 * 64 * 4];
- const GLFWimage image = { 64, 64, buffer };
-
- for (y = 0; y < image.width; y++)
- {
- for (x = 0; x < image.height; x++)
- {
- buffer[i++] = 255;
- buffer[i++] = 255;
- buffer[i++] = 255;
- buffer[i++] = (unsigned char) (255 * star(x, y, t));
- }
- }
-
- return glfwCreateCursor(&image, image.width / 2, image.height / 2);
-}
-
-static GLFWcursor* create_tracking_cursor(void)
-{
- int i = 0, x, y;
- unsigned char buffer[32 * 32 * 4];
- const GLFWimage image = { 32, 32, buffer };
-
- for (y = 0; y < image.width; y++)
- {
- for (x = 0; x < image.height; x++)
- {
- if (x == 7 || y == 7)
- {
- buffer[i++] = 255;
- buffer[i++] = 0;
- buffer[i++] = 0;
- buffer[i++] = 255;
- }
- else
- {
- buffer[i++] = 0;
- buffer[i++] = 0;
- buffer[i++] = 0;
- buffer[i++] = 0;
- }
- }
- }
-
- return glfwCreateCursor(&image, 7, 7);
-}
-
-static void cursor_position_callback(GLFWwindow* window, double x, double y)
-{
- printf("%0.3f: Cursor position: %f %f (%+f %+f)\n",
- glfwGetTime(),
- x, y, x - cursor_x, y - cursor_y);
-
- cursor_x = x;
- cursor_y = y;
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (action != GLFW_PRESS)
- return;
-
- switch (key)
- {
- case GLFW_KEY_A:
- {
- animate_cursor = !animate_cursor;
- if (!animate_cursor)
- glfwSetCursor(window, NULL);
-
- break;
- }
-
- case GLFW_KEY_ESCAPE:
- {
- if (glfwGetInputMode(window, GLFW_CURSOR) != GLFW_CURSOR_DISABLED)
- {
- glfwSetWindowShouldClose(window, GLFW_TRUE);
- break;
- }
-
- /* FALLTHROUGH */
- }
-
- case GLFW_KEY_N:
- glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
- glfwGetCursorPos(window, &cursor_x, &cursor_y);
- printf("(( cursor is normal ))\n");
- break;
-
- case GLFW_KEY_D:
- glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
- printf("(( cursor is disabled ))\n");
- break;
-
- case GLFW_KEY_H:
- glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
- printf("(( cursor is hidden ))\n");
- break;
-
- case GLFW_KEY_R:
- if (!glfwRawMouseMotionSupported())
- break;
-
- if (glfwGetInputMode(window, GLFW_RAW_MOUSE_MOTION))
- {
- glfwSetInputMode(window, GLFW_RAW_MOUSE_MOTION, GLFW_FALSE);
- printf("(( raw input is disabled ))\n");
- }
- else
- {
- glfwSetInputMode(window, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE);
- printf("(( raw input is enabled ))\n");
- }
- break;
-
- case GLFW_KEY_SPACE:
- swap_interval = 1 - swap_interval;
- printf("(( swap interval: %i ))\n", swap_interval);
- glfwSwapInterval(swap_interval);
- break;
-
- case GLFW_KEY_W:
- wait_events = !wait_events;
- printf("(( %sing for events ))\n", wait_events ? "wait" : "poll");
- break;
-
- case GLFW_KEY_T:
- track_cursor = !track_cursor;
- if (track_cursor)
- glfwSetCursor(window, tracking_cursor);
- else
- glfwSetCursor(window, NULL);
-
- break;
-
- case GLFW_KEY_P:
- {
- double x, y;
- glfwGetCursorPos(window, &x, &y);
-
- printf("Query before set: %f %f (%+f %+f)\n",
- x, y, x - cursor_x, y - cursor_y);
- cursor_x = x;
- cursor_y = y;
-
- glfwSetCursorPos(window, cursor_x, cursor_y);
- glfwGetCursorPos(window, &x, &y);
-
- printf("Query after set: %f %f (%+f %+f)\n",
- x, y, x - cursor_x, y - cursor_y);
- cursor_x = x;
- cursor_y = y;
- break;
- }
-
- case GLFW_KEY_UP:
- glfwSetCursorPos(window, 0, 0);
- glfwGetCursorPos(window, &cursor_x, &cursor_y);
- break;
-
- case GLFW_KEY_DOWN:
- {
- int width, height;
- glfwGetWindowSize(window, &width, &height);
- glfwSetCursorPos(window, width - 1, height - 1);
- glfwGetCursorPos(window, &cursor_x, &cursor_y);
- break;
- }
-
- case GLFW_KEY_0:
- glfwSetCursor(window, NULL);
- break;
-
- case GLFW_KEY_1:
- case GLFW_KEY_2:
- case GLFW_KEY_3:
- case GLFW_KEY_4:
- case GLFW_KEY_5:
- case GLFW_KEY_6:
- case GLFW_KEY_7:
- case GLFW_KEY_8:
- case GLFW_KEY_9:
- {
- int index = key - GLFW_KEY_1;
- if (mods & GLFW_MOD_SHIFT)
- index += 9;
-
- if (index < sizeof(standard_cursors) / sizeof(standard_cursors[0]))
- glfwSetCursor(window, standard_cursors[index]);
-
- break;
- }
-
- case GLFW_KEY_F11:
- case GLFW_KEY_ENTER:
- {
- static int x, y, width, height;
-
- if (mods != GLFW_MOD_ALT)
- return;
-
- if (glfwGetWindowMonitor(window))
- glfwSetWindowMonitor(window, NULL, x, y, width, height, 0);
- else
- {
- GLFWmonitor* monitor = glfwGetPrimaryMonitor();
- const GLFWvidmode* mode = glfwGetVideoMode(monitor);
- glfwGetWindowPos(window, &x, &y);
- glfwGetWindowSize(window, &width, &height);
- glfwSetWindowMonitor(window, monitor,
- 0, 0, mode->width, mode->height,
- mode->refreshRate);
- }
-
- glfwGetCursorPos(window, &cursor_x, &cursor_y);
- break;
- }
- }
-}
-
-int main(void)
-{
- int i;
- GLFWwindow* window;
- GLFWcursor* star_cursors[CURSOR_FRAME_COUNT];
- GLFWcursor* current_frame = NULL;
- GLuint vertex_buffer, vertex_shader, fragment_shader, program;
- GLint mvp_location, vpos_location;
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- tracking_cursor = create_tracking_cursor();
- if (!tracking_cursor)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- for (i = 0; i < CURSOR_FRAME_COUNT; i++)
- {
- star_cursors[i] = create_cursor_frame(i / (float) CURSOR_FRAME_COUNT);
- if (!star_cursors[i])
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
- }
-
- for (i = 0; i < sizeof(standard_cursors) / sizeof(standard_cursors[0]); i++)
- {
- const int shapes[] = {
- GLFW_ARROW_CURSOR,
- GLFW_IBEAM_CURSOR,
- GLFW_CROSSHAIR_CURSOR,
- GLFW_POINTING_HAND_CURSOR,
- GLFW_RESIZE_EW_CURSOR,
- GLFW_RESIZE_NS_CURSOR,
- GLFW_RESIZE_NWSE_CURSOR,
- GLFW_RESIZE_NESW_CURSOR,
- GLFW_RESIZE_ALL_CURSOR,
- GLFW_NOT_ALLOWED_CURSOR
- };
-
- standard_cursors[i] = glfwCreateStandardCursor(shapes[i]);
- }
-
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
-
- window = glfwCreateWindow(640, 480, "Cursor Test", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
-
- glGenBuffers(1, &vertex_buffer);
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
-
- vertex_shader = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
- glCompileShader(vertex_shader);
-
- fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
- glCompileShader(fragment_shader);
-
- program = glCreateProgram();
- glAttachShader(program, vertex_shader);
- glAttachShader(program, fragment_shader);
- glLinkProgram(program);
-
- mvp_location = glGetUniformLocation(program, "MVP");
- vpos_location = glGetAttribLocation(program, "vPos");
-
- glEnableVertexAttribArray(vpos_location);
- glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
- sizeof(vec2), (void*) 0);
- glUseProgram(program);
-
- glfwGetCursorPos(window, &cursor_x, &cursor_y);
- printf("Cursor position: %f %f\n", cursor_x, cursor_y);
-
- glfwSetCursorPosCallback(window, cursor_position_callback);
- glfwSetKeyCallback(window, key_callback);
-
- while (!glfwWindowShouldClose(window))
- {
- glClear(GL_COLOR_BUFFER_BIT);
-
- if (track_cursor)
- {
- int wnd_width, wnd_height, fb_width, fb_height;
- float scale;
- vec2 vertices[4];
- mat4x4 mvp;
-
- glfwGetWindowSize(window, &wnd_width, &wnd_height);
- glfwGetFramebufferSize(window, &fb_width, &fb_height);
-
- glViewport(0, 0, fb_width, fb_height);
-
- scale = (float) fb_width / (float) wnd_width;
- vertices[0][0] = 0.5f;
- vertices[0][1] = (float) (fb_height - floor(cursor_y * scale) - 1.f + 0.5f);
- vertices[1][0] = (float) fb_width + 0.5f;
- vertices[1][1] = (float) (fb_height - floor(cursor_y * scale) - 1.f + 0.5f);
- vertices[2][0] = (float) floor(cursor_x * scale) + 0.5f;
- vertices[2][1] = 0.5f;
- vertices[3][0] = (float) floor(cursor_x * scale) + 0.5f;
- vertices[3][1] = (float) fb_height + 0.5f;
-
- glBufferData(GL_ARRAY_BUFFER,
- sizeof(vertices),
- vertices,
- GL_STREAM_DRAW);
-
- mat4x4_ortho(mvp, 0.f, (float) fb_width, 0.f, (float) fb_height, 0.f, 1.f);
- glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
-
- glDrawArrays(GL_LINES, 0, 4);
- }
-
- glfwSwapBuffers(window);
-
- if (animate_cursor)
- {
- const int i = (int) (glfwGetTime() * 30.0) % CURSOR_FRAME_COUNT;
- if (current_frame != star_cursors[i])
- {
- glfwSetCursor(window, star_cursors[i]);
- current_frame = star_cursors[i];
- }
- }
- else
- current_frame = NULL;
-
- if (wait_events)
- {
- if (animate_cursor)
- glfwWaitEventsTimeout(1.0 / 30.0);
- else
- glfwWaitEvents();
- }
- else
- glfwPollEvents();
-
- // Workaround for an issue with msvcrt and mintty
- fflush(stdout);
- }
-
- glfwDestroyWindow(window);
-
- for (i = 0; i < CURSOR_FRAME_COUNT; i++)
- glfwDestroyCursor(star_cursors[i]);
-
- for (i = 0; i < sizeof(standard_cursors) / sizeof(standard_cursors[0]); i++)
- glfwDestroyCursor(standard_cursors[i]);
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/empty.c b/3rdparty/glfw/source/tests/empty.c
deleted file mode 100644
index 72caccb..0000000
--- a/3rdparty/glfw/source/tests/empty.c
+++ /dev/null
@@ -1,133 +0,0 @@
-//========================================================================
-// Empty event test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test is intended to verify that posting of empty events works
-//
-//========================================================================
-
-#include "tinycthread.h"
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static volatile int running = GLFW_TRUE;
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static int thread_main(void* data)
-{
- struct timespec time;
-
- while (running)
- {
- clock_gettime(CLOCK_REALTIME, &time);
- time.tv_sec += 1;
- thrd_sleep(&time, NULL);
-
- glfwPostEmptyEvent();
- }
-
- return 0;
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
- glfwSetWindowShouldClose(window, GLFW_TRUE);
-}
-
-static float nrand(void)
-{
- return (float) rand() / (float) RAND_MAX;
-}
-
-int main(void)
-{
- int result;
- thrd_t thread;
- GLFWwindow* window;
-
- srand((unsigned int) time(NULL));
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- window = glfwCreateWindow(640, 480, "Empty Event Test", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSetKeyCallback(window, key_callback);
-
- if (thrd_create(&thread, thread_main, NULL) != thrd_success)
- {
- fprintf(stderr, "Failed to create secondary thread\n");
-
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- while (running)
- {
- int width, height;
- float r = nrand(), g = nrand(), b = nrand();
- float l = (float) sqrt(r * r + g * g + b * b);
-
- glfwGetFramebufferSize(window, &width, &height);
-
- glViewport(0, 0, width, height);
- glClearColor(r / l, g / l, b / l, 1.f);
- glClear(GL_COLOR_BUFFER_BIT);
- glfwSwapBuffers(window);
-
- glfwWaitEvents();
-
- if (glfwWindowShouldClose(window))
- running = GLFW_FALSE;
- }
-
- glfwHideWindow(window);
- thrd_join(thread, &result);
- glfwDestroyWindow(window);
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/events.c b/3rdparty/glfw/source/tests/events.c
deleted file mode 100644
index f14449a..0000000
--- a/3rdparty/glfw/source/tests/events.c
+++ /dev/null
@@ -1,692 +0,0 @@
-//========================================================================
-// Event linter (event spewer)
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test hooks every available callback and outputs their arguments
-//
-// Log messages go to stdout, error messages to stderr
-//
-// Every event also gets a (sequential) number to aid discussion of logs
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <locale.h>
-
-#include "getopt.h"
-
-// Event index
-static unsigned int counter = 0;
-
-typedef struct
-{
- GLFWwindow* window;
- int number;
- int closeable;
-} Slot;
-
-static void usage(void)
-{
- printf("Usage: events [-f] [-h] [-n WINDOWS]\n");
- printf("Options:\n");
- printf(" -f use full screen\n");
- printf(" -h show this help\n");
- printf(" -n the number of windows to create\n");
-}
-
-static const char* get_key_name(int key)
-{
- switch (key)
- {
- // Printable keys
- case GLFW_KEY_A: return "A";
- case GLFW_KEY_B: return "B";
- case GLFW_KEY_C: return "C";
- case GLFW_KEY_D: return "D";
- case GLFW_KEY_E: return "E";
- case GLFW_KEY_F: return "F";
- case GLFW_KEY_G: return "G";
- case GLFW_KEY_H: return "H";
- case GLFW_KEY_I: return "I";
- case GLFW_KEY_J: return "J";
- case GLFW_KEY_K: return "K";
- case GLFW_KEY_L: return "L";
- case GLFW_KEY_M: return "M";
- case GLFW_KEY_N: return "N";
- case GLFW_KEY_O: return "O";
- case GLFW_KEY_P: return "P";
- case GLFW_KEY_Q: return "Q";
- case GLFW_KEY_R: return "R";
- case GLFW_KEY_S: return "S";
- case GLFW_KEY_T: return "T";
- case GLFW_KEY_U: return "U";
- case GLFW_KEY_V: return "V";
- case GLFW_KEY_W: return "W";
- case GLFW_KEY_X: return "X";
- case GLFW_KEY_Y: return "Y";
- case GLFW_KEY_Z: return "Z";
- case GLFW_KEY_1: return "1";
- case GLFW_KEY_2: return "2";
- case GLFW_KEY_3: return "3";
- case GLFW_KEY_4: return "4";
- case GLFW_KEY_5: return "5";
- case GLFW_KEY_6: return "6";
- case GLFW_KEY_7: return "7";
- case GLFW_KEY_8: return "8";
- case GLFW_KEY_9: return "9";
- case GLFW_KEY_0: return "0";
- case GLFW_KEY_SPACE: return "SPACE";
- case GLFW_KEY_MINUS: return "MINUS";
- case GLFW_KEY_EQUAL: return "EQUAL";
- case GLFW_KEY_LEFT_BRACKET: return "LEFT BRACKET";
- case GLFW_KEY_RIGHT_BRACKET: return "RIGHT BRACKET";
- case GLFW_KEY_BACKSLASH: return "BACKSLASH";
- case GLFW_KEY_SEMICOLON: return "SEMICOLON";
- case GLFW_KEY_APOSTROPHE: return "APOSTROPHE";
- case GLFW_KEY_GRAVE_ACCENT: return "GRAVE ACCENT";
- case GLFW_KEY_COMMA: return "COMMA";
- case GLFW_KEY_PERIOD: return "PERIOD";
- case GLFW_KEY_SLASH: return "SLASH";
- case GLFW_KEY_WORLD_1: return "WORLD 1";
- case GLFW_KEY_WORLD_2: return "WORLD 2";
-
- // Function keys
- case GLFW_KEY_ESCAPE: return "ESCAPE";
- case GLFW_KEY_F1: return "F1";
- case GLFW_KEY_F2: return "F2";
- case GLFW_KEY_F3: return "F3";
- case GLFW_KEY_F4: return "F4";
- case GLFW_KEY_F5: return "F5";
- case GLFW_KEY_F6: return "F6";
- case GLFW_KEY_F7: return "F7";
- case GLFW_KEY_F8: return "F8";
- case GLFW_KEY_F9: return "F9";
- case GLFW_KEY_F10: return "F10";
- case GLFW_KEY_F11: return "F11";
- case GLFW_KEY_F12: return "F12";
- case GLFW_KEY_F13: return "F13";
- case GLFW_KEY_F14: return "F14";
- case GLFW_KEY_F15: return "F15";
- case GLFW_KEY_F16: return "F16";
- case GLFW_KEY_F17: return "F17";
- case GLFW_KEY_F18: return "F18";
- case GLFW_KEY_F19: return "F19";
- case GLFW_KEY_F20: return "F20";
- case GLFW_KEY_F21: return "F21";
- case GLFW_KEY_F22: return "F22";
- case GLFW_KEY_F23: return "F23";
- case GLFW_KEY_F24: return "F24";
- case GLFW_KEY_F25: return "F25";
- case GLFW_KEY_UP: return "UP";
- case GLFW_KEY_DOWN: return "DOWN";
- case GLFW_KEY_LEFT: return "LEFT";
- case GLFW_KEY_RIGHT: return "RIGHT";
- case GLFW_KEY_LEFT_SHIFT: return "LEFT SHIFT";
- case GLFW_KEY_RIGHT_SHIFT: return "RIGHT SHIFT";
- case GLFW_KEY_LEFT_CONTROL: return "LEFT CONTROL";
- case GLFW_KEY_RIGHT_CONTROL: return "RIGHT CONTROL";
- case GLFW_KEY_LEFT_ALT: return "LEFT ALT";
- case GLFW_KEY_RIGHT_ALT: return "RIGHT ALT";
- case GLFW_KEY_TAB: return "TAB";
- case GLFW_KEY_ENTER: return "ENTER";
- case GLFW_KEY_BACKSPACE: return "BACKSPACE";
- case GLFW_KEY_INSERT: return "INSERT";
- case GLFW_KEY_DELETE: return "DELETE";
- case GLFW_KEY_PAGE_UP: return "PAGE UP";
- case GLFW_KEY_PAGE_DOWN: return "PAGE DOWN";
- case GLFW_KEY_HOME: return "HOME";
- case GLFW_KEY_END: return "END";
- case GLFW_KEY_KP_0: return "KEYPAD 0";
- case GLFW_KEY_KP_1: return "KEYPAD 1";
- case GLFW_KEY_KP_2: return "KEYPAD 2";
- case GLFW_KEY_KP_3: return "KEYPAD 3";
- case GLFW_KEY_KP_4: return "KEYPAD 4";
- case GLFW_KEY_KP_5: return "KEYPAD 5";
- case GLFW_KEY_KP_6: return "KEYPAD 6";
- case GLFW_KEY_KP_7: return "KEYPAD 7";
- case GLFW_KEY_KP_8: return "KEYPAD 8";
- case GLFW_KEY_KP_9: return "KEYPAD 9";
- case GLFW_KEY_KP_DIVIDE: return "KEYPAD DIVIDE";
- case GLFW_KEY_KP_MULTIPLY: return "KEYPAD MULTIPLY";
- case GLFW_KEY_KP_SUBTRACT: return "KEYPAD SUBTRACT";
- case GLFW_KEY_KP_ADD: return "KEYPAD ADD";
- case GLFW_KEY_KP_DECIMAL: return "KEYPAD DECIMAL";
- case GLFW_KEY_KP_EQUAL: return "KEYPAD EQUAL";
- case GLFW_KEY_KP_ENTER: return "KEYPAD ENTER";
- case GLFW_KEY_PRINT_SCREEN: return "PRINT SCREEN";
- case GLFW_KEY_NUM_LOCK: return "NUM LOCK";
- case GLFW_KEY_CAPS_LOCK: return "CAPS LOCK";
- case GLFW_KEY_SCROLL_LOCK: return "SCROLL LOCK";
- case GLFW_KEY_PAUSE: return "PAUSE";
- case GLFW_KEY_LEFT_SUPER: return "LEFT SUPER";
- case GLFW_KEY_RIGHT_SUPER: return "RIGHT SUPER";
- case GLFW_KEY_MENU: return "MENU";
-
- default: return "UNKNOWN";
- }
-}
-
-static const char* get_action_name(int action)
-{
- switch (action)
- {
- case GLFW_PRESS:
- return "pressed";
- case GLFW_RELEASE:
- return "released";
- case GLFW_REPEAT:
- return "repeated";
- }
-
- return "caused unknown action";
-}
-
-static const char* get_button_name(int button)
-{
- switch (button)
- {
- case GLFW_MOUSE_BUTTON_LEFT:
- return "left";
- case GLFW_MOUSE_BUTTON_RIGHT:
- return "right";
- case GLFW_MOUSE_BUTTON_MIDDLE:
- return "middle";
- default:
- {
- static char name[16];
- snprintf(name, sizeof(name), "%i", button);
- return name;
- }
- }
-}
-
-static const char* get_mods_name(int mods)
-{
- static char name[512];
-
- if (mods == 0)
- return " no mods";
-
- name[0] = '\0';
-
- if (mods & GLFW_MOD_SHIFT)
- strcat(name, " shift");
- if (mods & GLFW_MOD_CONTROL)
- strcat(name, " control");
- if (mods & GLFW_MOD_ALT)
- strcat(name, " alt");
- if (mods & GLFW_MOD_SUPER)
- strcat(name, " super");
- if (mods & GLFW_MOD_CAPS_LOCK)
- strcat(name, " capslock-on");
- if (mods & GLFW_MOD_NUM_LOCK)
- strcat(name, " numlock-on");
-
- return name;
-}
-
-static size_t encode_utf8(char* s, unsigned int ch)
-{
- size_t count = 0;
-
- if (ch < 0x80)
- s[count++] = (char) ch;
- else if (ch < 0x800)
- {
- s[count++] = (ch >> 6) | 0xc0;
- s[count++] = (ch & 0x3f) | 0x80;
- }
- else if (ch < 0x10000)
- {
- s[count++] = (ch >> 12) | 0xe0;
- s[count++] = ((ch >> 6) & 0x3f) | 0x80;
- s[count++] = (ch & 0x3f) | 0x80;
- }
- else if (ch < 0x110000)
- {
- s[count++] = (ch >> 18) | 0xf0;
- s[count++] = ((ch >> 12) & 0x3f) | 0x80;
- s[count++] = ((ch >> 6) & 0x3f) | 0x80;
- s[count++] = (ch & 0x3f) | 0x80;
- }
-
- return count;
-}
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void window_pos_callback(GLFWwindow* window, int x, int y)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Window position: %i %i\n",
- counter++, slot->number, glfwGetTime(), x, y);
-}
-
-static void window_size_callback(GLFWwindow* window, int width, int height)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Window size: %i %i\n",
- counter++, slot->number, glfwGetTime(), width, height);
-}
-
-static void framebuffer_size_callback(GLFWwindow* window, int width, int height)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Framebuffer size: %i %i\n",
- counter++, slot->number, glfwGetTime(), width, height);
-}
-
-static void window_content_scale_callback(GLFWwindow* window, float xscale, float yscale)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Window content scale: %0.3f %0.3f\n",
- counter++, slot->number, glfwGetTime(), xscale, yscale);
-}
-
-static void window_close_callback(GLFWwindow* window)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Window close\n",
- counter++, slot->number, glfwGetTime());
-
- if (!slot->closeable)
- {
- printf("(( closing is disabled, press %s to re-enable )\n",
- glfwGetKeyName(GLFW_KEY_C, 0));
- }
-
- glfwSetWindowShouldClose(window, slot->closeable);
-}
-
-static void window_refresh_callback(GLFWwindow* window)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Window refresh\n",
- counter++, slot->number, glfwGetTime());
-
- glfwMakeContextCurrent(window);
- glClear(GL_COLOR_BUFFER_BIT);
- glfwSwapBuffers(window);
-}
-
-static void window_focus_callback(GLFWwindow* window, int focused)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Window %s\n",
- counter++, slot->number, glfwGetTime(),
- focused ? "focused" : "defocused");
-}
-
-static void window_iconify_callback(GLFWwindow* window, int iconified)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Window was %s\n",
- counter++, slot->number, glfwGetTime(),
- iconified ? "iconified" : "uniconified");
-}
-
-static void window_maximize_callback(GLFWwindow* window, int maximized)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Window was %s\n",
- counter++, slot->number, glfwGetTime(),
- maximized ? "maximized" : "unmaximized");
-}
-
-static void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Mouse button %i (%s) (with%s) was %s\n",
- counter++, slot->number, glfwGetTime(), button,
- get_button_name(button),
- get_mods_name(mods),
- get_action_name(action));
-}
-
-static void cursor_position_callback(GLFWwindow* window, double x, double y)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Cursor position: %f %f\n",
- counter++, slot->number, glfwGetTime(), x, y);
-}
-
-static void cursor_enter_callback(GLFWwindow* window, int entered)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Cursor %s window\n",
- counter++, slot->number, glfwGetTime(),
- entered ? "entered" : "left");
-}
-
-static void scroll_callback(GLFWwindow* window, double x, double y)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- printf("%08x to %i at %0.3f: Scroll: %0.3f %0.3f\n",
- counter++, slot->number, glfwGetTime(), x, y);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- const char* name = glfwGetKeyName(key, scancode);
-
- GLFWkeyboard* keyboard = glfwGetLastActiveKeyboard();
-
- if (name)
- {
- printf("%08x to %i at %0.3f: Key 0x%04x Scancode 0x%04x Keyboard %s (%s) (%s) (with%s) was %s\n",
- counter++, slot->number, glfwGetTime(), key, scancode,
- keyboard ? glfwGetKeyboardName(keyboard) : "NULL",
- get_key_name(key),
- name,
- get_mods_name(mods),
- get_action_name(action));
- }
- else
- {
- printf("%08x to %i at %0.3f: Key 0x%04x Scancode 0x%04x Keyboard %s (%s) (with%s) was %s\n",
- counter++, slot->number, glfwGetTime(), key, scancode,
- keyboard ? glfwGetKeyboardName(keyboard) : "NULL",
- get_key_name(key),
- get_mods_name(mods),
- get_action_name(action));
- }
-
- if (action != GLFW_PRESS)
- return;
-
- switch (key)
- {
- case GLFW_KEY_C:
- {
- slot->closeable = !slot->closeable;
-
- printf("(( closing %s ))\n", slot->closeable ? "enabled" : "disabled");
- break;
- }
-
- case GLFW_KEY_L:
- {
- const int state = glfwGetInputMode(window, GLFW_LOCK_KEY_MODS);
- glfwSetInputMode(window, GLFW_LOCK_KEY_MODS, !state);
-
- printf("(( lock key mods %s ))\n", !state ? "enabled" : "disabled");
- break;
- }
- }
-}
-
-static void char_callback(GLFWwindow* window, unsigned int codepoint)
-{
- Slot* slot = glfwGetWindowUserPointer(window);
- char string[5] = "";
-
- encode_utf8(string, codepoint);
- printf("%08x to %i at %0.3f: Character 0x%08x (%s) input\n",
- counter++, slot->number, glfwGetTime(), codepoint, string);
-}
-
-static void drop_callback(GLFWwindow* window, int count, const char* paths[])
-{
- int i;
- Slot* slot = glfwGetWindowUserPointer(window);
-
- printf("%08x to %i at %0.3f: Drop input\n",
- counter++, slot->number, glfwGetTime());
-
- for (i = 0; i < count; i++)
- printf(" %i: \"%s\"\n", i, paths[i]);
-}
-
-static void monitor_callback(GLFWmonitor* monitor, int event)
-{
- if (event == GLFW_CONNECTED)
- {
- int x, y, widthMM, heightMM;
- const GLFWvidmode* mode = glfwGetVideoMode(monitor);
-
- glfwGetMonitorPos(monitor, &x, &y);
- glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM);
-
- printf("%08x at %0.3f: Monitor %s (%ix%i at %ix%i, %ix%i mm) was connected\n",
- counter++,
- glfwGetTime(),
- glfwGetMonitorName(monitor),
- mode->width, mode->height,
- x, y,
- widthMM, heightMM);
- }
- else if (event == GLFW_DISCONNECTED)
- {
- printf("%08x at %0.3f: Monitor %s was disconnected\n",
- counter++,
- glfwGetTime(),
- glfwGetMonitorName(monitor));
- }
-}
-
-static void keyboard_callback(GLFWkeyboard* keyboard, int event)
-{
- if (event == GLFW_CONNECTED)
- {
- printf("%08x at %0.3f: Keyboard %s was connected\n",
- counter++, glfwGetTime(),
- glfwGetKeyboardName(keyboard));
- }
- else if (event == GLFW_DISCONNECTED)
- {
- printf("%08x at %0.3f: Keyboard %s was disconnected\n",
- counter++, glfwGetTime(),
- glfwGetKeyboardName(keyboard));
- }
-}
-
-static void joystick_callback(int jid, int event)
-{
- if (event == GLFW_CONNECTED)
- {
- int axisCount, buttonCount, hatCount;
-
- glfwGetJoystickAxes(jid, &axisCount);
- glfwGetJoystickButtons(jid, &buttonCount);
- glfwGetJoystickHats(jid, &hatCount);
-
- printf("%08x at %0.3f: Joystick %i (%s) was connected with %i axes, %i buttons, and %i hats\n",
- counter++, glfwGetTime(),
- jid,
- glfwGetJoystickName(jid),
- axisCount,
- buttonCount,
- hatCount);
-
- if (glfwJoystickIsGamepad(jid))
- {
- printf(" Joystick %i (%s) has a gamepad mapping (%s)\n",
- jid,
- glfwGetJoystickGUID(jid),
- glfwGetGamepadName(jid));
- }
- else
- {
- printf(" Joystick %i (%s) has no gamepad mapping\n",
- jid,
- glfwGetJoystickGUID(jid));
- }
- }
- else
- {
- printf("%08x at %0.3f: Joystick %i was disconnected\n",
- counter++, glfwGetTime(), jid);
- }
-}
-
-int main(int argc, char** argv)
-{
- Slot* slots;
- GLFWmonitor* monitor = NULL;
- int ch, i, width, height, count = 1;
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- printf("Library initialized\n");
-
- glfwSetMonitorCallback(monitor_callback);
- glfwSetKeyboardCallback(keyboard_callback);
- glfwSetJoystickCallback(joystick_callback);
-
- while ((ch = getopt(argc, argv, "hfn:")) != -1)
- {
- switch (ch)
- {
- case 'h':
- usage();
- exit(EXIT_SUCCESS);
-
- case 'f':
- monitor = glfwGetPrimaryMonitor();
- break;
-
- case 'n':
- count = (int) strtoul(optarg, NULL, 10);
- break;
-
- default:
- usage();
- exit(EXIT_FAILURE);
- }
- }
-
- if (monitor)
- {
- const GLFWvidmode* mode = glfwGetVideoMode(monitor);
-
- glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);
- glfwWindowHint(GLFW_RED_BITS, mode->redBits);
- glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
- glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);
-
- width = mode->width;
- height = mode->height;
- }
- else
- {
- width = 640;
- height = 480;
- }
-
- slots = calloc(count, sizeof(Slot));
-
- for (i = 0; i < count; i++)
- {
- char title[128];
-
- slots[i].closeable = GLFW_TRUE;
- slots[i].number = i + 1;
-
- snprintf(title, sizeof(title), "Event Linter (Window %i)", slots[i].number);
-
- if (monitor)
- {
- printf("Creating full screen window %i (%ix%i on %s)\n",
- slots[i].number,
- width, height,
- glfwGetMonitorName(monitor));
- }
- else
- {
- printf("Creating windowed mode window %i (%ix%i)\n",
- slots[i].number,
- width, height);
- }
-
- slots[i].window = glfwCreateWindow(width, height, title, monitor, NULL);
- if (!slots[i].window)
- {
- free(slots);
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwSetWindowUserPointer(slots[i].window, slots + i);
-
- glfwSetWindowPosCallback(slots[i].window, window_pos_callback);
- glfwSetWindowSizeCallback(slots[i].window, window_size_callback);
- glfwSetFramebufferSizeCallback(slots[i].window, framebuffer_size_callback);
- glfwSetWindowContentScaleCallback(slots[i].window, window_content_scale_callback);
- glfwSetWindowCloseCallback(slots[i].window, window_close_callback);
- glfwSetWindowRefreshCallback(slots[i].window, window_refresh_callback);
- glfwSetWindowFocusCallback(slots[i].window, window_focus_callback);
- glfwSetWindowIconifyCallback(slots[i].window, window_iconify_callback);
- glfwSetWindowMaximizeCallback(slots[i].window, window_maximize_callback);
- glfwSetMouseButtonCallback(slots[i].window, mouse_button_callback);
- glfwSetCursorPosCallback(slots[i].window, cursor_position_callback);
- glfwSetCursorEnterCallback(slots[i].window, cursor_enter_callback);
- glfwSetScrollCallback(slots[i].window, scroll_callback);
- glfwSetKeyCallback(slots[i].window, key_callback);
- glfwSetCharCallback(slots[i].window, char_callback);
- glfwSetDropCallback(slots[i].window, drop_callback);
-
- glfwMakeContextCurrent(slots[i].window);
- gladLoadGL(glfwGetProcAddress);
- glfwSwapInterval(1);
- }
-
- printf("Main loop starting\n");
-
- for (;;)
- {
- for (i = 0; i < count; i++)
- {
- if (glfwWindowShouldClose(slots[i].window))
- break;
- }
-
- if (i < count)
- break;
-
- glfwWaitEvents();
-
- // Workaround for an issue with msvcrt and mintty
- fflush(stdout);
- }
-
- free(slots);
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/gamma.c b/3rdparty/glfw/source/tests/gamma.c
deleted file mode 100644
index d1f6dc2..0000000
--- a/3rdparty/glfw/source/tests/gamma.c
+++ /dev/null
@@ -1,187 +0,0 @@
-//========================================================================
-// Gamma correction test program
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This program is used to test the gamma correction functionality for
-// both full screen and windowed mode windows
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#define NK_IMPLEMENTATION
-#define NK_INCLUDE_FIXED_TYPES
-#define NK_INCLUDE_FONT_BAKING
-#define NK_INCLUDE_DEFAULT_FONT
-#define NK_INCLUDE_DEFAULT_ALLOCATOR
-#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
-#define NK_INCLUDE_STANDARD_VARARGS
-#define NK_BUTTON_TRIGGER_ON_RELEASE
-#include <nuklear.h>
-
-#define NK_GLFW_GL2_IMPLEMENTATION
-#include <nuklear_glfw_gl2.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (action == GLFW_PRESS && key == GLFW_KEY_ESCAPE)
- glfwSetWindowShouldClose(window, GLFW_TRUE);
-}
-
-static void chart_ramp_array(struct nk_context* nk,
- struct nk_color color,
- int count, unsigned short int* values)
-{
- if (nk_chart_begin_colored(nk, NK_CHART_LINES,
- color, nk_rgb(255, 255, 255),
- count, 0, 65535))
- {
- int i;
- for (i = 0; i < count; i++)
- {
- char buffer[1024];
- if (nk_chart_push(nk, values[i]))
- {
- snprintf(buffer, sizeof(buffer), "#%u: %u (%0.5f) ",
- i, values[i], values[i] / 65535.f);
- nk_tooltip(nk, buffer);
- }
- }
-
- nk_chart_end(nk);
- }
-}
-
-int main(int argc, char** argv)
-{
- GLFWmonitor* monitor = NULL;
- GLFWwindow* window;
- GLFWgammaramp orig_ramp;
- struct nk_context* nk;
- struct nk_font_atlas* atlas;
- float gamma_value = 1.f;
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- monitor = glfwGetPrimaryMonitor();
-
- glfwWindowHint(GLFW_SCALE_TO_MONITOR, GLFW_TRUE);
- glfwWindowHint(GLFW_WIN32_KEYBOARD_MENU, GLFW_TRUE);
-
- window = glfwCreateWindow(800, 400, "Gamma Test", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- {
- const GLFWgammaramp* ramp = glfwGetGammaRamp(monitor);
- if (!ramp)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- const size_t array_size = ramp->size * sizeof(short);
- orig_ramp.size = ramp->size;
- orig_ramp.red = malloc(array_size);
- orig_ramp.green = malloc(array_size);
- orig_ramp.blue = malloc(array_size);
- memcpy(orig_ramp.red, ramp->red, array_size);
- memcpy(orig_ramp.green, ramp->green, array_size);
- memcpy(orig_ramp.blue, ramp->blue, array_size);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSwapInterval(1);
-
- nk = nk_glfw3_init(window, NK_GLFW3_INSTALL_CALLBACKS);
- nk_glfw3_font_stash_begin(&atlas);
- nk_glfw3_font_stash_end();
-
- glfwSetKeyCallback(window, key_callback);
-
- while (!glfwWindowShouldClose(window))
- {
- int width, height;
- struct nk_rect area;
-
- glfwGetWindowSize(window, &width, &height);
- area = nk_rect(0.f, 0.f, (float) width, (float) height);
- nk_window_set_bounds(nk, "", area);
-
- glClear(GL_COLOR_BUFFER_BIT);
- nk_glfw3_new_frame();
- if (nk_begin(nk, "", area, 0))
- {
- const GLFWgammaramp* ramp;
-
- nk_layout_row_dynamic(nk, 30, 3);
- if (nk_slider_float(nk, 0.1f, &gamma_value, 5.f, 0.1f))
- glfwSetGamma(monitor, gamma_value);
- nk_labelf(nk, NK_TEXT_LEFT, "%0.1f", gamma_value);
- if (nk_button_label(nk, "Revert"))
- glfwSetGammaRamp(monitor, &orig_ramp);
-
- ramp = glfwGetGammaRamp(monitor);
-
- nk_layout_row_dynamic(nk, height - 60.f, 3);
- chart_ramp_array(nk, nk_rgb(255, 0, 0), ramp->size, ramp->red);
- chart_ramp_array(nk, nk_rgb(0, 255, 0), ramp->size, ramp->green);
- chart_ramp_array(nk, nk_rgb(0, 0, 255), ramp->size, ramp->blue);
- }
-
- nk_end(nk);
- nk_glfw3_render(NK_ANTI_ALIASING_ON);
-
- glfwSwapBuffers(window);
- glfwWaitEventsTimeout(1.0);
- }
-
- free(orig_ramp.red);
- free(orig_ramp.green);
- free(orig_ramp.blue);
-
- nk_glfw3_shutdown();
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/glfwinfo.c b/3rdparty/glfw/source/tests/glfwinfo.c
deleted file mode 100644
index 14347e4..0000000
--- a/3rdparty/glfw/source/tests/glfwinfo.c
+++ /dev/null
@@ -1,1061 +0,0 @@
-//========================================================================
-// Context creation and information tool
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLAD_VULKAN_IMPLEMENTATION
-#include <glad/vulkan.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include "getopt.h"
-
-#ifdef _MSC_VER
-#define strcasecmp(x, y) _stricmp(x, y)
-#endif
-
-#define API_NAME_OPENGL "gl"
-#define API_NAME_OPENGL_ES "es"
-
-#define API_NAME_NATIVE "native"
-#define API_NAME_EGL "egl"
-#define API_NAME_OSMESA "osmesa"
-
-#define PROFILE_NAME_CORE "core"
-#define PROFILE_NAME_COMPAT "compat"
-
-#define STRATEGY_NAME_NONE "none"
-#define STRATEGY_NAME_LOSE "lose"
-
-#define BEHAVIOR_NAME_NONE "none"
-#define BEHAVIOR_NAME_FLUSH "flush"
-
-#define ANGLE_TYPE_OPENGL "gl"
-#define ANGLE_TYPE_OPENGLES "es"
-#define ANGLE_TYPE_D3D9 "d3d9"
-#define ANGLE_TYPE_D3D11 "d3d11"
-#define ANGLE_TYPE_VULKAN "vk"
-#define ANGLE_TYPE_METAL "mtl"
-
-#define PLATFORM_NAME_ANY "any"
-#define PLATFORM_NAME_WIN32 "win32"
-#define PLATFORM_NAME_COCOA "cooca"
-#define PLATFORM_NAME_WL "wayland"
-#define PLATFORM_NAME_X11 "x11"
-#define PLATFORM_NAME_NULL "null"
-
-static void usage(void)
-{
- printf("Usage: glfwinfo [OPTION]...\n");
- printf("Options:\n");
- printf(" --platform=PLATFORM the platform to use ("
- PLATFORM_NAME_ANY " or "
- PLATFORM_NAME_WIN32 " or "
- PLATFORM_NAME_COCOA " or "
- PLATFORM_NAME_X11 " or "
- PLATFORM_NAME_WL " or "
- PLATFORM_NAME_NULL ")\n");
- printf(" -a, --client-api=API the client API to use ("
- API_NAME_OPENGL " or "
- API_NAME_OPENGL_ES ")\n");
- printf(" -b, --behavior=BEHAVIOR the release behavior to use ("
- BEHAVIOR_NAME_NONE " or "
- BEHAVIOR_NAME_FLUSH ")\n");
- printf(" -c, --context-api=API the context creation API to use ("
- API_NAME_NATIVE " or "
- API_NAME_EGL " or "
- API_NAME_OSMESA ")\n");
- printf(" -d, --debug request a debug context\n");
- printf(" -f, --forward require a forward-compatible context\n");
- printf(" -h, --help show this help\n");
- printf(" -l, --list-extensions list all Vulkan and client API extensions\n");
- printf(" --list-layers list all Vulkan layers\n");
- printf(" -m, --major=MAJOR the major number of the required "
- "client API version\n");
- printf(" -n, --minor=MINOR the minor number of the required "
- "client API version\n");
- printf(" -p, --profile=PROFILE the OpenGL profile to use ("
- PROFILE_NAME_CORE " or "
- PROFILE_NAME_COMPAT ")\n");
- printf(" -s, --robustness=STRATEGY the robustness strategy to use ("
- STRATEGY_NAME_NONE " or "
- STRATEGY_NAME_LOSE ")\n");
- printf(" -v, --version print version information\n");
- printf(" --red-bits=N the number of red bits to request\n");
- printf(" --green-bits=N the number of green bits to request\n");
- printf(" --blue-bits=N the number of blue bits to request\n");
- printf(" --alpha-bits=N the number of alpha bits to request\n");
- printf(" --depth-bits=N the number of depth bits to request\n");
- printf(" --stencil-bits=N the number of stencil bits to request\n");
- printf(" --accum-red-bits=N the number of red bits to request\n");
- printf(" --accum-green-bits=N the number of green bits to request\n");
- printf(" --accum-blue-bits=N the number of blue bits to request\n");
- printf(" --accum-alpha-bits=N the number of alpha bits to request\n");
- printf(" --aux-buffers=N the number of aux buffers to request\n");
- printf(" --samples=N the number of MSAA samples to request\n");
- printf(" --stereo request stereo rendering\n");
- printf(" --srgb request an sRGB capable framebuffer\n");
- printf(" --singlebuffer request single-buffering\n");
- printf(" --no-error request a context that does not emit errors\n");
- printf(" --angle-type=TYPE the ANGLE platform type to use ("
- ANGLE_TYPE_OPENGL ", "
- ANGLE_TYPE_OPENGLES ", "
- ANGLE_TYPE_D3D9 ", "
- ANGLE_TYPE_D3D11 ", "
- ANGLE_TYPE_VULKAN " or "
- ANGLE_TYPE_METAL ")\n");
- printf(" --graphics-switching request macOS graphics switching\n");
- printf(" --disable-xcb-surface disable VK_KHR_xcb_surface extension\n");
-}
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static const char* get_platform_name(int platform)
-{
- if (platform == GLFW_PLATFORM_WIN32)
- return "Win32";
- else if (platform == GLFW_PLATFORM_COCOA)
- return "Cocoa";
- else if (platform == GLFW_PLATFORM_WAYLAND)
- return "Wayland";
- else if (platform == GLFW_PLATFORM_X11)
- return "X11";
- else if (platform == GLFW_PLATFORM_NULL)
- return "Null";
-
- return "unknown";
-}
-
-static const char* get_device_type_name(VkPhysicalDeviceType type)
-{
- if (type == VK_PHYSICAL_DEVICE_TYPE_OTHER)
- return "other";
- else if (type == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU)
- return "integrated GPU";
- else if (type == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU)
- return "discrete GPU";
- else if (type == VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU)
- return "virtual GPU";
- else if (type == VK_PHYSICAL_DEVICE_TYPE_CPU)
- return "CPU";
-
- return "unknown";
-}
-
-static const char* get_api_name(int api)
-{
- if (api == GLFW_OPENGL_API)
- return "OpenGL";
- else if (api == GLFW_OPENGL_ES_API)
- return "OpenGL ES";
-
- return "Unknown API";
-}
-
-static const char* get_profile_name_gl(GLint mask)
-{
- if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)
- return PROFILE_NAME_COMPAT;
- if (mask & GL_CONTEXT_CORE_PROFILE_BIT)
- return PROFILE_NAME_CORE;
-
- return "unknown";
-}
-
-static const char* get_profile_name_glfw(int profile)
-{
- if (profile == GLFW_OPENGL_COMPAT_PROFILE)
- return PROFILE_NAME_COMPAT;
- if (profile == GLFW_OPENGL_CORE_PROFILE)
- return PROFILE_NAME_CORE;
-
- return "unknown";
-}
-
-static const char* get_strategy_name_gl(GLint strategy)
-{
- if (strategy == GL_LOSE_CONTEXT_ON_RESET_ARB)
- return STRATEGY_NAME_LOSE;
- if (strategy == GL_NO_RESET_NOTIFICATION_ARB)
- return STRATEGY_NAME_NONE;
-
- return "unknown";
-}
-
-static const char* get_strategy_name_glfw(int strategy)
-{
- if (strategy == GLFW_LOSE_CONTEXT_ON_RESET)
- return STRATEGY_NAME_LOSE;
- if (strategy == GLFW_NO_RESET_NOTIFICATION)
- return STRATEGY_NAME_NONE;
-
- return "unknown";
-}
-
-static void list_context_extensions(int client, int major, int minor)
-{
- printf("%s context extensions:\n", get_api_name(client));
-
- if (client == GLFW_OPENGL_API && major > 2)
- {
- GLint count;
- glGetIntegerv(GL_NUM_EXTENSIONS, &count);
-
- for (int i = 0; i < count; i++)
- printf(" %s\n", (const char*) glGetStringi(GL_EXTENSIONS, i));
- }
- else
- {
- const GLubyte* extensions = glGetString(GL_EXTENSIONS);
- while (*extensions != '\0')
- {
- putchar(' ');
-
- while (*extensions != '\0' && *extensions != ' ')
- {
- putchar(*extensions);
- extensions++;
- }
-
- while (*extensions == ' ')
- extensions++;
-
- putchar('\n');
- }
- }
-}
-
-static void list_vulkan_instance_extensions(void)
-{
- printf("Vulkan instance extensions:\n");
-
- uint32_t ep_count;
- vkEnumerateInstanceExtensionProperties(NULL, &ep_count, NULL);
- VkExtensionProperties* ep = calloc(ep_count, sizeof(VkExtensionProperties));
- vkEnumerateInstanceExtensionProperties(NULL, &ep_count, ep);
-
- for (uint32_t i = 0; i < ep_count; i++)
- printf(" %s (spec version %u)\n", ep[i].extensionName, ep[i].specVersion);
-
- free(ep);
-}
-
-static void list_vulkan_instance_layers(void)
-{
- printf("Vulkan instance layers:\n");
-
- uint32_t lp_count;
- vkEnumerateInstanceLayerProperties(&lp_count, NULL);
- VkLayerProperties* lp = calloc(lp_count, sizeof(VkLayerProperties));
- vkEnumerateInstanceLayerProperties(&lp_count, lp);
-
- for (uint32_t i = 0; i < lp_count; i++)
- {
- printf(" %s (spec version %u) \"%s\"\n",
- lp[i].layerName,
- lp[i].specVersion >> 22,
- lp[i].description);
- }
-
- free(lp);
-}
-
-static void list_vulkan_device_extensions(VkInstance instance, VkPhysicalDevice device)
-{
- printf("Vulkan device extensions:\n");
-
- uint32_t ep_count;
- vkEnumerateDeviceExtensionProperties(device, NULL, &ep_count, NULL);
- VkExtensionProperties* ep = calloc(ep_count, sizeof(VkExtensionProperties));
- vkEnumerateDeviceExtensionProperties(device, NULL, &ep_count, ep);
-
- for (uint32_t i = 0; i < ep_count; i++)
- printf(" %s (spec version %u)\n", ep[i].extensionName, ep[i].specVersion);
-
- free(ep);
-}
-
-static void list_vulkan_device_layers(VkInstance instance, VkPhysicalDevice device)
-{
- printf("Vulkan device layers:\n");
-
- uint32_t lp_count;
- vkEnumerateDeviceLayerProperties(device, &lp_count, NULL);
- VkLayerProperties* lp = calloc(lp_count, sizeof(VkLayerProperties));
- vkEnumerateDeviceLayerProperties(device, &lp_count, lp);
-
- for (uint32_t i = 0; i < lp_count; i++)
- {
- printf(" %s (spec version %u) \"%s\"\n",
- lp[i].layerName,
- lp[i].specVersion >> 22,
- lp[i].description);
- }
-
- free(lp);
-}
-
-static bool valid_version(void)
-{
- int major, minor, revision;
- glfwGetVersion(&major, &minor, &revision);
-
- if (major != GLFW_VERSION_MAJOR)
- {
- printf("*** ERROR: GLFW major version mismatch! ***\n");
- return false;
- }
-
- if (minor != GLFW_VERSION_MINOR || revision != GLFW_VERSION_REVISION)
- printf("*** WARNING: GLFW version mismatch! ***\n");
-
- return true;
-}
-
-static void print_version(void)
-{
- int major, minor, revision;
- glfwGetVersion(&major, &minor, &revision);
-
- printf("GLFW header version: %u.%u.%u\n",
- GLFW_VERSION_MAJOR,
- GLFW_VERSION_MINOR,
- GLFW_VERSION_REVISION);
- printf("GLFW library version: %u.%u.%u\n", major, minor, revision);
- printf("GLFW library version string: \"%s\"\n", glfwGetVersionString());
-}
-
-static void print_platform(void)
-{
- const int platforms[] =
- {
- GLFW_PLATFORM_WIN32,
- GLFW_PLATFORM_COCOA,
- GLFW_PLATFORM_WAYLAND,
- GLFW_PLATFORM_X11,
- GLFW_PLATFORM_NULL
- };
-
- printf("GLFW platform: %s\n", get_platform_name(glfwGetPlatform()));
- printf("GLFW supported platforms:\n");
-
- for (size_t i = 0; i < sizeof(platforms) / sizeof(platforms[0]); i++)
- {
- if (glfwPlatformSupported(platforms[i]))
- printf(" %s\n", get_platform_name(platforms[i]));
- }
-}
-
-int main(int argc, char** argv)
-{
- int ch;
- bool list_extensions = false, list_layers = false;
-
- // These duplicate the defaults for each hint
- int platform = GLFW_ANY_PLATFORM;
- int client_api = GLFW_OPENGL_API;
- int context_major = 1;
- int context_minor = 0;
- int context_release = GLFW_ANY_RELEASE_BEHAVIOR;
- int context_creation_api = GLFW_NATIVE_CONTEXT_API;
- int context_robustness = GLFW_NO_ROBUSTNESS;
- bool context_debug = false;
- bool context_no_error = false;
- bool opengl_forward = false;
- int opengl_profile = GLFW_OPENGL_ANY_PROFILE;
- int fb_red_bits = 8;
- int fb_green_bits = 8;
- int fb_blue_bits = 8;
- int fb_alpha_bits = 8;
- int fb_depth_bits = 24;
- int fb_stencil_bits = 8;
- int fb_accum_red_bits = 0;
- int fb_accum_green_bits = 0;
- int fb_accum_blue_bits = 0;
- int fb_accum_alpha_bits = 0;
- int fb_aux_buffers = 0;
- int fb_samples = 0;
- bool fb_stereo = false;
- bool fb_srgb = false;
- bool fb_doublebuffer = true;
- int angle_type = GLFW_ANGLE_PLATFORM_TYPE_NONE;
- bool cocoa_graphics_switching = false;
- bool disable_xcb_surface = false;
-
- enum { PLATFORM, CLIENT, CONTEXT, BEHAVIOR, DEBUG_CONTEXT, FORWARD, HELP,
- EXTENSIONS, LAYERS,
- MAJOR, MINOR, PROFILE, ROBUSTNESS, VERSION,
- REDBITS, GREENBITS, BLUEBITS, ALPHABITS, DEPTHBITS, STENCILBITS,
- ACCUMREDBITS, ACCUMGREENBITS, ACCUMBLUEBITS, ACCUMALPHABITS,
- AUXBUFFERS, SAMPLES, STEREO, SRGB, SINGLEBUFFER, NOERROR_SRSLY,
- ANGLE_TYPE, GRAPHICS_SWITCHING, XCB_SURFACE };
- const struct option options[] =
- {
- { "platform", 1, NULL, PLATFORM },
- { "behavior", 1, NULL, BEHAVIOR },
- { "client-api", 1, NULL, CLIENT },
- { "context-api", 1, NULL, CONTEXT },
- { "debug", 0, NULL, DEBUG_CONTEXT },
- { "forward", 0, NULL, FORWARD },
- { "help", 0, NULL, HELP },
- { "list-extensions", 0, NULL, EXTENSIONS },
- { "list-layers", 0, NULL, LAYERS },
- { "major", 1, NULL, MAJOR },
- { "minor", 1, NULL, MINOR },
- { "profile", 1, NULL, PROFILE },
- { "robustness", 1, NULL, ROBUSTNESS },
- { "version", 0, NULL, VERSION },
- { "red-bits", 1, NULL, REDBITS },
- { "green-bits", 1, NULL, GREENBITS },
- { "blue-bits", 1, NULL, BLUEBITS },
- { "alpha-bits", 1, NULL, ALPHABITS },
- { "depth-bits", 1, NULL, DEPTHBITS },
- { "stencil-bits", 1, NULL, STENCILBITS },
- { "accum-red-bits", 1, NULL, ACCUMREDBITS },
- { "accum-green-bits", 1, NULL, ACCUMGREENBITS },
- { "accum-blue-bits", 1, NULL, ACCUMBLUEBITS },
- { "accum-alpha-bits", 1, NULL, ACCUMALPHABITS },
- { "aux-buffers", 1, NULL, AUXBUFFERS },
- { "samples", 1, NULL, SAMPLES },
- { "stereo", 0, NULL, STEREO },
- { "srgb", 0, NULL, SRGB },
- { "singlebuffer", 0, NULL, SINGLEBUFFER },
- { "no-error", 0, NULL, NOERROR_SRSLY },
- { "angle-type", 1, NULL, ANGLE_TYPE },
- { "graphics-switching", 0, NULL, GRAPHICS_SWITCHING },
- { "vk-xcb-surface", 0, NULL, XCB_SURFACE },
- { NULL, 0, NULL, 0 }
- };
-
- while ((ch = getopt_long(argc, argv, "a:b:c:dfhlm:n:p:s:v", options, NULL)) != -1)
- {
- switch (ch)
- {
- case PLATFORM:
- if (strcasecmp(optarg, PLATFORM_NAME_ANY) == 0)
- platform = GLFW_ANY_PLATFORM;
- else if (strcasecmp(optarg, PLATFORM_NAME_WIN32) == 0)
- platform = GLFW_PLATFORM_WIN32;
- else if (strcasecmp(optarg, PLATFORM_NAME_COCOA) == 0)
- platform = GLFW_PLATFORM_COCOA;
- else if (strcasecmp(optarg, PLATFORM_NAME_WL) == 0)
- platform = GLFW_PLATFORM_WAYLAND;
- else if (strcasecmp(optarg, PLATFORM_NAME_X11) == 0)
- platform = GLFW_PLATFORM_X11;
- else if (strcasecmp(optarg, PLATFORM_NAME_NULL) == 0)
- platform = GLFW_PLATFORM_NULL;
- else
- {
- usage();
- exit(EXIT_FAILURE);
- }
- break;
- case 'a':
- case CLIENT:
- if (strcasecmp(optarg, API_NAME_OPENGL) == 0)
- client_api = GLFW_OPENGL_API;
- else if (strcasecmp(optarg, API_NAME_OPENGL_ES) == 0)
- client_api = GLFW_OPENGL_ES_API;
- else
- {
- usage();
- exit(EXIT_FAILURE);
- }
- break;
- case 'b':
- case BEHAVIOR:
- if (strcasecmp(optarg, BEHAVIOR_NAME_NONE) == 0)
- context_release = GLFW_RELEASE_BEHAVIOR_NONE;
- else if (strcasecmp(optarg, BEHAVIOR_NAME_FLUSH) == 0)
- context_release = GLFW_RELEASE_BEHAVIOR_FLUSH;
- else
- {
- usage();
- exit(EXIT_FAILURE);
- }
- break;
- case 'c':
- case CONTEXT:
- if (strcasecmp(optarg, API_NAME_NATIVE) == 0)
- context_creation_api = GLFW_NATIVE_CONTEXT_API;
- else if (strcasecmp(optarg, API_NAME_EGL) == 0)
- context_creation_api = GLFW_EGL_CONTEXT_API;
- else if (strcasecmp(optarg, API_NAME_OSMESA) == 0)
- context_creation_api = GLFW_OSMESA_CONTEXT_API;
- else
- {
- usage();
- exit(EXIT_FAILURE);
- }
- break;
- case 'd':
- case DEBUG_CONTEXT:
- context_debug = true;
- break;
- case 'f':
- case FORWARD:
- opengl_forward = true;
- break;
- case 'h':
- case HELP:
- usage();
- exit(EXIT_SUCCESS);
- case 'l':
- case EXTENSIONS:
- list_extensions = true;
- break;
- case LAYERS:
- list_layers = true;
- break;
- case 'm':
- case MAJOR:
- context_major = atoi(optarg);
- break;
- case 'n':
- case MINOR:
- context_minor = atoi(optarg);
- break;
- case 'p':
- case PROFILE:
- if (strcasecmp(optarg, PROFILE_NAME_CORE) == 0)
- opengl_profile = GLFW_OPENGL_CORE_PROFILE;
- else if (strcasecmp(optarg, PROFILE_NAME_COMPAT) == 0)
- opengl_profile = GLFW_OPENGL_COMPAT_PROFILE;
- else
- {
- usage();
- exit(EXIT_FAILURE);
- }
- break;
- case 's':
- case ROBUSTNESS:
- if (strcasecmp(optarg, STRATEGY_NAME_NONE) == 0)
- context_robustness = GLFW_NO_RESET_NOTIFICATION;
- else if (strcasecmp(optarg, STRATEGY_NAME_LOSE) == 0)
- context_robustness = GLFW_LOSE_CONTEXT_ON_RESET;
- else
- {
- usage();
- exit(EXIT_FAILURE);
- }
- break;
- case 'v':
- case VERSION:
- print_version();
- exit(EXIT_SUCCESS);
- case REDBITS:
- if (strcmp(optarg, "-") == 0)
- fb_red_bits = GLFW_DONT_CARE;
- else
- fb_red_bits = atoi(optarg);
- break;
- case GREENBITS:
- if (strcmp(optarg, "-") == 0)
- fb_green_bits = GLFW_DONT_CARE;
- else
- fb_green_bits = atoi(optarg);
- break;
- case BLUEBITS:
- if (strcmp(optarg, "-") == 0)
- fb_blue_bits = GLFW_DONT_CARE;
- else
- fb_blue_bits = atoi(optarg);
- break;
- case ALPHABITS:
- if (strcmp(optarg, "-") == 0)
- fb_alpha_bits = GLFW_DONT_CARE;
- else
- fb_alpha_bits = atoi(optarg);
- break;
- case DEPTHBITS:
- if (strcmp(optarg, "-") == 0)
- fb_depth_bits = GLFW_DONT_CARE;
- else
- fb_depth_bits = atoi(optarg);
- break;
- case STENCILBITS:
- if (strcmp(optarg, "-") == 0)
- fb_stencil_bits = GLFW_DONT_CARE;
- else
- fb_stencil_bits = atoi(optarg);
- break;
- case ACCUMREDBITS:
- if (strcmp(optarg, "-") == 0)
- fb_accum_red_bits = GLFW_DONT_CARE;
- else
- fb_accum_red_bits = atoi(optarg);
- break;
- case ACCUMGREENBITS:
- if (strcmp(optarg, "-") == 0)
- fb_accum_green_bits = GLFW_DONT_CARE;
- else
- fb_accum_green_bits = atoi(optarg);
- break;
- case ACCUMBLUEBITS:
- if (strcmp(optarg, "-") == 0)
- fb_accum_blue_bits = GLFW_DONT_CARE;
- else
- fb_accum_blue_bits = atoi(optarg);
- break;
- case ACCUMALPHABITS:
- if (strcmp(optarg, "-") == 0)
- fb_accum_alpha_bits = GLFW_DONT_CARE;
- else
- fb_accum_alpha_bits = atoi(optarg);
- break;
- case AUXBUFFERS:
- if (strcmp(optarg, "-") == 0)
- fb_aux_buffers = GLFW_DONT_CARE;
- else
- fb_aux_buffers = atoi(optarg);
- break;
- case SAMPLES:
- if (strcmp(optarg, "-") == 0)
- fb_samples = GLFW_DONT_CARE;
- else
- fb_samples = atoi(optarg);
- break;
- case STEREO:
- fb_stereo = true;
- break;
- case SRGB:
- fb_srgb = true;
- break;
- case SINGLEBUFFER:
- fb_doublebuffer = false;
- break;
- case NOERROR_SRSLY:
- context_no_error = true;
- break;
- case ANGLE_TYPE:
- if (strcmp(optarg, ANGLE_TYPE_OPENGL) == 0)
- angle_type = GLFW_ANGLE_PLATFORM_TYPE_OPENGL;
- else if (strcmp(optarg, ANGLE_TYPE_OPENGLES) == 0)
- angle_type = GLFW_ANGLE_PLATFORM_TYPE_OPENGLES;
- else if (strcmp(optarg, ANGLE_TYPE_D3D9) == 0)
- angle_type = GLFW_ANGLE_PLATFORM_TYPE_D3D9;
- else if (strcmp(optarg, ANGLE_TYPE_D3D11) == 0)
- angle_type = GLFW_ANGLE_PLATFORM_TYPE_D3D11;
- else if (strcmp(optarg, ANGLE_TYPE_VULKAN) == 0)
- angle_type = GLFW_ANGLE_PLATFORM_TYPE_VULKAN;
- else if (strcmp(optarg, ANGLE_TYPE_METAL) == 0)
- angle_type = GLFW_ANGLE_PLATFORM_TYPE_METAL;
- else
- {
- usage();
- exit(EXIT_FAILURE);
- }
- break;
- case GRAPHICS_SWITCHING:
- cocoa_graphics_switching = true;
- break;
- case XCB_SURFACE:
- disable_xcb_surface = true;
- break;
- default:
- usage();
- exit(EXIT_FAILURE);
- }
- }
-
- // Initialize GLFW and create window
-
- if (!valid_version())
- exit(EXIT_FAILURE);
-
- glfwSetErrorCallback(error_callback);
-
- glfwInitHint(GLFW_PLATFORM, platform);
-
- glfwInitHint(GLFW_COCOA_MENUBAR, false);
-
- glfwInitHint(GLFW_ANGLE_PLATFORM_TYPE, angle_type);
- glfwInitHint(GLFW_X11_XCB_VULKAN_SURFACE, !disable_xcb_surface);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- print_version();
- print_platform();
-
- glfwWindowHint(GLFW_VISIBLE, false);
-
- glfwWindowHint(GLFW_CLIENT_API, client_api);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, context_major);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, context_minor);
- glfwWindowHint(GLFW_CONTEXT_RELEASE_BEHAVIOR, context_release);
- glfwWindowHint(GLFW_CONTEXT_CREATION_API, context_creation_api);
- glfwWindowHint(GLFW_CONTEXT_ROBUSTNESS, context_robustness);
- glfwWindowHint(GLFW_CONTEXT_DEBUG, context_debug);
- glfwWindowHint(GLFW_CONTEXT_NO_ERROR, context_no_error);
- glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, opengl_forward);
- glfwWindowHint(GLFW_OPENGL_PROFILE, opengl_profile);
-
- glfwWindowHint(GLFW_RED_BITS, fb_red_bits);
- glfwWindowHint(GLFW_BLUE_BITS, fb_blue_bits);
- glfwWindowHint(GLFW_GREEN_BITS, fb_green_bits);
- glfwWindowHint(GLFW_ALPHA_BITS, fb_alpha_bits);
- glfwWindowHint(GLFW_DEPTH_BITS, fb_depth_bits);
- glfwWindowHint(GLFW_STENCIL_BITS, fb_stencil_bits);
- glfwWindowHint(GLFW_ACCUM_RED_BITS, fb_accum_red_bits);
- glfwWindowHint(GLFW_ACCUM_GREEN_BITS, fb_accum_green_bits);
- glfwWindowHint(GLFW_ACCUM_BLUE_BITS, fb_accum_blue_bits);
- glfwWindowHint(GLFW_ACCUM_ALPHA_BITS, fb_accum_alpha_bits);
- glfwWindowHint(GLFW_AUX_BUFFERS, fb_aux_buffers);
- glfwWindowHint(GLFW_SAMPLES, fb_samples);
- glfwWindowHint(GLFW_STEREO, fb_stereo);
- glfwWindowHint(GLFW_SRGB_CAPABLE, fb_srgb);
- glfwWindowHint(GLFW_DOUBLEBUFFER, fb_doublebuffer);
-
- glfwWindowHint(GLFW_COCOA_GRAPHICS_SWITCHING, cocoa_graphics_switching);
-
- GLFWwindow* window = glfwCreateWindow(200, 200, "Version", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
-
- const GLenum error = glGetError();
- if (error != GL_NO_ERROR)
- printf("*** OpenGL error after make current: 0x%08x ***\n", error);
-
- // Report client API version
-
- const int client = glfwGetWindowAttrib(window, GLFW_CLIENT_API);
- const int major = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR);
- const int minor = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR);
- const int revision = glfwGetWindowAttrib(window, GLFW_CONTEXT_REVISION);
- const int profile = glfwGetWindowAttrib(window, GLFW_OPENGL_PROFILE);
-
- printf("%s context version string: \"%s\"\n",
- get_api_name(client),
- glGetString(GL_VERSION));
-
- printf("%s context version parsed by GLFW: %u.%u.%u\n",
- get_api_name(client),
- major, minor, revision);
-
- // Report client API context properties
-
- if (client == GLFW_OPENGL_API)
- {
- if (major >= 3)
- {
- GLint flags;
-
- glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
- printf("%s context flags (0x%08x):", get_api_name(client), flags);
-
- if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT)
- printf(" forward-compatible");
- if (flags & 2/*GL_CONTEXT_FLAG_DEBUG_BIT*/)
- printf(" debug");
- if (flags & GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB)
- printf(" robustness");
- if (flags & 8/*GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR*/)
- printf(" no-error");
- putchar('\n');
-
- printf("%s context flags parsed by GLFW:", get_api_name(client));
-
- if (glfwGetWindowAttrib(window, GLFW_OPENGL_FORWARD_COMPAT))
- printf(" forward-compatible");
- if (glfwGetWindowAttrib(window, GLFW_CONTEXT_DEBUG))
- printf(" debug");
- if (glfwGetWindowAttrib(window, GLFW_CONTEXT_ROBUSTNESS) == GLFW_LOSE_CONTEXT_ON_RESET)
- printf(" robustness");
- if (glfwGetWindowAttrib(window, GLFW_CONTEXT_NO_ERROR))
- printf(" no-error");
- putchar('\n');
- }
-
- if (major >= 4 || (major == 3 && minor >= 2))
- {
- GLint mask;
- glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);
-
- printf("%s profile mask (0x%08x): %s\n",
- get_api_name(client),
- mask,
- get_profile_name_gl(mask));
-
- printf("%s profile mask parsed by GLFW: %s\n",
- get_api_name(client),
- get_profile_name_glfw(profile));
- }
-
- if (GLAD_GL_ARB_robustness)
- {
- const int robustness = glfwGetWindowAttrib(window, GLFW_CONTEXT_ROBUSTNESS);
- GLint strategy;
- glGetIntegerv(GL_RESET_NOTIFICATION_STRATEGY_ARB, &strategy);
-
- printf("%s robustness strategy (0x%08x): %s\n",
- get_api_name(client),
- strategy,
- get_strategy_name_gl(strategy));
-
- printf("%s robustness strategy parsed by GLFW: %s\n",
- get_api_name(client),
- get_strategy_name_glfw(robustness));
- }
- }
-
- printf("%s context renderer string: \"%s\"\n",
- get_api_name(client),
- glGetString(GL_RENDERER));
- printf("%s context vendor string: \"%s\"\n",
- get_api_name(client),
- glGetString(GL_VENDOR));
-
- if (major >= 2)
- {
- printf("%s context shading language version: \"%s\"\n",
- get_api_name(client),
- glGetString(GL_SHADING_LANGUAGE_VERSION));
- }
-
- printf("%s framebuffer:\n", get_api_name(client));
-
- GLint redbits, greenbits, bluebits, alphabits, depthbits, stencilbits;
-
- if (client == GLFW_OPENGL_API && profile == GLFW_OPENGL_CORE_PROFILE)
- {
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,
- GL_BACK_LEFT,
- GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE,
- &redbits);
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,
- GL_BACK_LEFT,
- GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,
- &greenbits);
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,
- GL_BACK_LEFT,
- GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE,
- &bluebits);
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,
- GL_BACK_LEFT,
- GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
- &alphabits);
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,
- GL_DEPTH,
- GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE,
- &depthbits);
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,
- GL_STENCIL,
- GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE,
- &stencilbits);
- }
- else
- {
- glGetIntegerv(GL_RED_BITS, &redbits);
- glGetIntegerv(GL_GREEN_BITS, &greenbits);
- glGetIntegerv(GL_BLUE_BITS, &bluebits);
- glGetIntegerv(GL_ALPHA_BITS, &alphabits);
- glGetIntegerv(GL_DEPTH_BITS, &depthbits);
- glGetIntegerv(GL_STENCIL_BITS, &stencilbits);
- }
-
- printf(" red: %u green: %u blue: %u alpha: %u depth: %u stencil: %u\n",
- redbits, greenbits, bluebits, alphabits, depthbits, stencilbits);
-
- if (client == GLFW_OPENGL_ES_API ||
- GLAD_GL_ARB_multisample ||
- major > 1 || minor >= 3)
- {
- GLint samples, samplebuffers;
- glGetIntegerv(GL_SAMPLES, &samples);
- glGetIntegerv(GL_SAMPLE_BUFFERS, &samplebuffers);
-
- printf(" samples: %u sample buffers: %u\n", samples, samplebuffers);
- }
-
- if (client == GLFW_OPENGL_API && profile != GLFW_OPENGL_CORE_PROFILE)
- {
- GLint accumredbits, accumgreenbits, accumbluebits, accumalphabits;
- GLint auxbuffers;
-
- glGetIntegerv(GL_ACCUM_RED_BITS, &accumredbits);
- glGetIntegerv(GL_ACCUM_GREEN_BITS, &accumgreenbits);
- glGetIntegerv(GL_ACCUM_BLUE_BITS, &accumbluebits);
- glGetIntegerv(GL_ACCUM_ALPHA_BITS, &accumalphabits);
- glGetIntegerv(GL_AUX_BUFFERS, &auxbuffers);
-
- printf(" accum red: %u accum green: %u accum blue: %u accum alpha: %u aux buffers: %u\n",
- accumredbits, accumgreenbits, accumbluebits, accumalphabits, auxbuffers);
- }
-
- if (list_extensions)
- list_context_extensions(client, major, minor);
-
- glfwDestroyWindow(window);
-
- glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
-
- window = glfwCreateWindow(200, 200, "Version", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- printf("Vulkan loader: %s\n",
- glfwVulkanSupported() ? "available" : "missing");
-
- if (glfwVulkanSupported())
- {
- gladLoadVulkanUserPtr(NULL, (GLADuserptrloadfunc) glfwGetInstanceProcAddress, NULL);
-
- uint32_t loader_version = VK_API_VERSION_1_0;
-
- if (vkEnumerateInstanceVersion)
- {
- uint32_t version;
- if (vkEnumerateInstanceVersion(&version) == VK_SUCCESS)
- loader_version = version;
- }
-
- printf("Vulkan loader API version: %i.%i\n",
- VK_VERSION_MAJOR(loader_version),
- VK_VERSION_MINOR(loader_version));
-
- uint32_t re_count;
- const char** re = glfwGetRequiredInstanceExtensions(&re_count);
-
- if (re)
- {
- printf("Vulkan window surface required instance extensions:\n");
- for (uint32_t i = 0; i < re_count; i++)
- printf(" %s\n", re[i]);
- }
- else
- printf("Vulkan window surface extensions missing\n");
-
- if (list_extensions)
- list_vulkan_instance_extensions();
-
- if (list_layers)
- list_vulkan_instance_layers();
-
- VkApplicationInfo ai = { VK_STRUCTURE_TYPE_APPLICATION_INFO };
- ai.pApplicationName = "glfwinfo";
- ai.applicationVersion = VK_MAKE_VERSION(GLFW_VERSION_MAJOR,
- GLFW_VERSION_MINOR,
- GLFW_VERSION_REVISION);
-
- if (loader_version >= VK_API_VERSION_1_1)
- ai.apiVersion = VK_API_VERSION_1_1;
- else
- ai.apiVersion = VK_API_VERSION_1_0;
-
- VkInstanceCreateInfo ici = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
- ici.pApplicationInfo = &ai;
- ici.enabledExtensionCount = re_count;
- ici.ppEnabledExtensionNames = re;
-
- VkInstance instance = VK_NULL_HANDLE;
-
- if (vkCreateInstance(&ici, NULL, &instance) != VK_SUCCESS)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- gladLoadVulkanUserPtr(NULL, (GLADuserptrloadfunc) glfwGetInstanceProcAddress, instance);
-
- if (re)
- {
- VkSurfaceKHR surface = VK_NULL_HANDLE;
-
- if (glfwCreateWindowSurface(instance, window, NULL, &surface) == VK_SUCCESS)
- {
- printf("Vulkan window surface created successfully\n");
- vkDestroySurfaceKHR(instance, surface, NULL);
- }
- else
- printf("Failed to create Vulkan window surface\n");
- }
-
- uint32_t pd_count;
- vkEnumeratePhysicalDevices(instance, &pd_count, NULL);
- VkPhysicalDevice* pd = calloc(pd_count, sizeof(VkPhysicalDevice));
- vkEnumeratePhysicalDevices(instance, &pd_count, pd);
-
- for (uint32_t i = 0; i < pd_count; i++)
- {
- VkPhysicalDeviceProperties pdp;
- vkGetPhysicalDeviceProperties(pd[i], &pdp);
-
- printf("Vulkan %s device: \"%s\" (API version %i.%i)\n",
- get_device_type_name(pdp.deviceType),
- pdp.deviceName,
- VK_VERSION_MAJOR(pdp.apiVersion),
- VK_VERSION_MINOR(pdp.apiVersion));
-
- uint32_t qfp_count;
- vkGetPhysicalDeviceQueueFamilyProperties(pd[i], &qfp_count, NULL);
-
- if (re)
- {
- printf("Vulkan device queue family presentation support:\n");
- for (uint32_t j = 0; j < qfp_count; j++)
- {
- printf(" %u: ", j);
- if (glfwGetPhysicalDevicePresentationSupport(instance, pd[i], j))
- printf("supported\n");
- else
- printf("no\n");
- }
- }
-
- if (list_extensions)
- list_vulkan_device_extensions(instance, pd[i]);
-
- if (list_layers)
- list_vulkan_device_layers(instance, pd[i]);
- }
-
- free(pd);
- vkDestroyInstance(instance, NULL);
- }
-
- glfwDestroyWindow(window);
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/icon.c b/3rdparty/glfw/source/tests/icon.c
deleted file mode 100644
index d5baf0a..0000000
--- a/3rdparty/glfw/source/tests/icon.c
+++ /dev/null
@@ -1,150 +0,0 @@
-//========================================================================
-// Window icon test program
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This program is used to test the icon feature.
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-// a simple glfw logo
-const char* const logo[] =
-{
- "................",
- "................",
- "...0000..0......",
- "...0.....0......",
- "...0.00..0......",
- "...0..0..0......",
- "...0000..0000...",
- "................",
- "................",
- "...000..0...0...",
- "...0....0...0...",
- "...000..0.0.0...",
- "...0....0.0.0...",
- "...0....00000...",
- "................",
- "................"
-};
-
-const unsigned char icon_colors[5][4] =
-{
- { 0, 0, 0, 255 }, // black
- { 255, 0, 0, 255 }, // red
- { 0, 255, 0, 255 }, // green
- { 0, 0, 255, 255 }, // blue
- { 255, 255, 255, 255 } // white
-};
-
-static int cur_icon_color = 0;
-
-static void set_icon(GLFWwindow* window, int icon_color)
-{
- int x, y;
- unsigned char pixels[16 * 16 * 4];
- unsigned char* target = pixels;
- GLFWimage img = { 16, 16, pixels };
-
- for (y = 0; y < img.width; y++)
- {
- for (x = 0; x < img.height; x++)
- {
- if (logo[y][x] == '0')
- memcpy(target, icon_colors[icon_color], 4);
- else
- memset(target, 0, 4);
-
- target += 4;
- }
- }
-
- glfwSetWindowIcon(window, 1, &img);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (action != GLFW_PRESS)
- return;
-
- switch (key)
- {
- case GLFW_KEY_ESCAPE:
- glfwSetWindowShouldClose(window, GLFW_TRUE);
- break;
- case GLFW_KEY_SPACE:
- cur_icon_color = (cur_icon_color + 1) % 5;
- set_icon(window, cur_icon_color);
- break;
- case GLFW_KEY_X:
- glfwSetWindowIcon(window, 0, NULL);
- break;
- }
-}
-
-int main(int argc, char** argv)
-{
- GLFWwindow* window;
-
- if (!glfwInit())
- {
- fprintf(stderr, "Failed to initialize GLFW\n");
- exit(EXIT_FAILURE);
- }
-
- window = glfwCreateWindow(200, 200, "Window Icon", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
-
- fprintf(stderr, "Failed to open GLFW window\n");
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
-
- glfwSetKeyCallback(window, key_callback);
- set_icon(window, cur_icon_color);
-
- while (!glfwWindowShouldClose(window))
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glfwSwapBuffers(window);
- glfwWaitEvents();
- }
-
- glfwDestroyWindow(window);
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/iconify.c b/3rdparty/glfw/source/tests/iconify.c
deleted file mode 100644
index 32fd44f..0000000
--- a/3rdparty/glfw/source/tests/iconify.c
+++ /dev/null
@@ -1,298 +0,0 @@
-//========================================================================
-// Iconify/restore test program
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This program is used to test the iconify/restore functionality for
-// both full screen and windowed mode windows
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "getopt.h"
-
-static int windowed_xpos, windowed_ypos, windowed_width = 640, windowed_height = 480;
-
-static void usage(void)
-{
- printf("Usage: iconify [-h] [-f [-a] [-n]]\n");
- printf("Options:\n");
- printf(" -a create windows for all monitors\n");
- printf(" -f create full screen window(s)\n");
- printf(" -h show this help\n");
-}
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- printf("%0.2f Key %s\n",
- glfwGetTime(),
- action == GLFW_PRESS ? "pressed" : "released");
-
- if (action != GLFW_PRESS)
- return;
-
- switch (key)
- {
- case GLFW_KEY_I:
- glfwIconifyWindow(window);
- break;
- case GLFW_KEY_M:
- glfwMaximizeWindow(window);
- break;
- case GLFW_KEY_R:
- glfwRestoreWindow(window);
- break;
- case GLFW_KEY_ESCAPE:
- glfwSetWindowShouldClose(window, GLFW_TRUE);
- break;
- case GLFW_KEY_A:
- glfwSetWindowAttrib(window, GLFW_AUTO_ICONIFY, !glfwGetWindowAttrib(window, GLFW_AUTO_ICONIFY));
- break;
- case GLFW_KEY_B:
- glfwSetWindowAttrib(window, GLFW_RESIZABLE, !glfwGetWindowAttrib(window, GLFW_RESIZABLE));
- break;
- case GLFW_KEY_D:
- glfwSetWindowAttrib(window, GLFW_DECORATED, !glfwGetWindowAttrib(window, GLFW_DECORATED));
- break;
- case GLFW_KEY_F:
- glfwSetWindowAttrib(window, GLFW_FLOATING, !glfwGetWindowAttrib(window, GLFW_FLOATING));
- break;
- case GLFW_KEY_F11:
- case GLFW_KEY_ENTER:
- {
- if (mods != GLFW_MOD_ALT)
- return;
-
- if (glfwGetWindowMonitor(window))
- {
- glfwSetWindowMonitor(window, NULL,
- windowed_xpos, windowed_ypos,
- windowed_width, windowed_height,
- 0);
- }
- else
- {
- GLFWmonitor* monitor = glfwGetPrimaryMonitor();
- if (monitor)
- {
- const GLFWvidmode* mode = glfwGetVideoMode(monitor);
- glfwGetWindowPos(window, &windowed_xpos, &windowed_ypos);
- glfwGetWindowSize(window, &windowed_width, &windowed_height);
- glfwSetWindowMonitor(window, monitor,
- 0, 0, mode->width, mode->height,
- mode->refreshRate);
- }
- }
-
- break;
- }
- }
-}
-
-static void window_size_callback(GLFWwindow* window, int width, int height)
-{
- printf("%0.2f Window resized to %ix%i\n", glfwGetTime(), width, height);
-}
-
-static void framebuffer_size_callback(GLFWwindow* window, int width, int height)
-{
- printf("%0.2f Framebuffer resized to %ix%i\n", glfwGetTime(), width, height);
-}
-
-static void window_focus_callback(GLFWwindow* window, int focused)
-{
- printf("%0.2f Window %s\n",
- glfwGetTime(),
- focused ? "focused" : "defocused");
-}
-
-static void window_iconify_callback(GLFWwindow* window, int iconified)
-{
- printf("%0.2f Window %s\n",
- glfwGetTime(),
- iconified ? "iconified" : "uniconified");
-}
-
-static void window_maximize_callback(GLFWwindow* window, int maximized)
-{
- printf("%0.2f Window %s\n",
- glfwGetTime(),
- maximized ? "maximized" : "unmaximized");
-}
-
-static void window_refresh_callback(GLFWwindow* window)
-{
- printf("%0.2f Window refresh\n", glfwGetTime());
-
- glfwMakeContextCurrent(window);
-
- glClear(GL_COLOR_BUFFER_BIT);
- glfwSwapBuffers(window);
-}
-
-static GLFWwindow* create_window(GLFWmonitor* monitor)
-{
- int width, height;
- GLFWwindow* window;
-
- if (monitor)
- {
- const GLFWvidmode* mode = glfwGetVideoMode(monitor);
-
- glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);
- glfwWindowHint(GLFW_RED_BITS, mode->redBits);
- glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
- glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);
-
- width = mode->width;
- height = mode->height;
- }
- else
- {
- width = windowed_width;
- height = windowed_height;
- }
-
- window = glfwCreateWindow(width, height, "Iconify", monitor, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
-
- return window;
-}
-
-int main(int argc, char** argv)
-{
- int ch, i, window_count;
- int fullscreen = GLFW_FALSE, all_monitors = GLFW_FALSE;
- GLFWwindow** windows;
-
- while ((ch = getopt(argc, argv, "afhn")) != -1)
- {
- switch (ch)
- {
- case 'a':
- all_monitors = GLFW_TRUE;
- break;
-
- case 'h':
- usage();
- exit(EXIT_SUCCESS);
-
- case 'f':
- fullscreen = GLFW_TRUE;
- break;
-
- default:
- usage();
- exit(EXIT_FAILURE);
- }
- }
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- if (fullscreen && all_monitors)
- {
- int monitor_count;
- GLFWmonitor** monitors = glfwGetMonitors(&monitor_count);
-
- window_count = monitor_count;
- windows = calloc(window_count, sizeof(GLFWwindow*));
-
- for (i = 0; i < monitor_count; i++)
- {
- windows[i] = create_window(monitors[i]);
- if (!windows[i])
- break;
- }
- }
- else
- {
- GLFWmonitor* monitor = NULL;
-
- if (fullscreen)
- monitor = glfwGetPrimaryMonitor();
-
- window_count = 1;
- windows = calloc(window_count, sizeof(GLFWwindow*));
- windows[0] = create_window(monitor);
- }
-
- for (i = 0; i < window_count; i++)
- {
- glfwSetKeyCallback(windows[i], key_callback);
- glfwSetFramebufferSizeCallback(windows[i], framebuffer_size_callback);
- glfwSetWindowSizeCallback(windows[i], window_size_callback);
- glfwSetWindowFocusCallback(windows[i], window_focus_callback);
- glfwSetWindowIconifyCallback(windows[i], window_iconify_callback);
- glfwSetWindowMaximizeCallback(windows[i], window_maximize_callback);
- glfwSetWindowRefreshCallback(windows[i], window_refresh_callback);
-
- window_refresh_callback(windows[i]);
-
- printf("Window is %s and %s\n",
- glfwGetWindowAttrib(windows[i], GLFW_ICONIFIED) ? "iconified" : "restored",
- glfwGetWindowAttrib(windows[i], GLFW_FOCUSED) ? "focused" : "defocused");
- }
-
- for (;;)
- {
- glfwWaitEvents();
-
- for (i = 0; i < window_count; i++)
- {
- if (glfwWindowShouldClose(windows[i]))
- break;
- }
-
- if (i < window_count)
- break;
-
- // Workaround for an issue with msvcrt and mintty
- fflush(stdout);
- }
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/inputlag.c b/3rdparty/glfw/source/tests/inputlag.c
deleted file mode 100644
index 12e693f..0000000
--- a/3rdparty/glfw/source/tests/inputlag.c
+++ /dev/null
@@ -1,310 +0,0 @@
-//========================================================================
-// Input lag test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test renders a marker at the cursor position reported by GLFW to
-// check how much it lags behind the hardware mouse cursor
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#define NK_IMPLEMENTATION
-#define NK_INCLUDE_FIXED_TYPES
-#define NK_INCLUDE_FONT_BAKING
-#define NK_INCLUDE_DEFAULT_FONT
-#define NK_INCLUDE_DEFAULT_ALLOCATOR
-#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
-#define NK_INCLUDE_STANDARD_VARARGS
-#include <nuklear.h>
-
-#define NK_GLFW_GL2_IMPLEMENTATION
-#include <nuklear_glfw_gl2.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "getopt.h"
-
-void usage(void)
-{
- printf("Usage: inputlag [-h] [-f]\n");
- printf("Options:\n");
- printf(" -f create full screen window\n");
- printf(" -h show this help\n");
-}
-
-struct nk_vec2 cursor_new, cursor_pos, cursor_vel;
-enum { cursor_sync_query, cursor_input_message } cursor_method = cursor_sync_query;
-
-void sample_input(GLFWwindow* window)
-{
- float a = .25; // exponential smoothing factor
-
- if (cursor_method == cursor_sync_query) {
- double x, y;
- glfwGetCursorPos(window, &x, &y);
- cursor_new.x = (float) x;
- cursor_new.y = (float) y;
- }
-
- cursor_vel.x = (cursor_new.x - cursor_pos.x) * a + cursor_vel.x * (1 - a);
- cursor_vel.y = (cursor_new.y - cursor_pos.y) * a + cursor_vel.y * (1 - a);
- cursor_pos = cursor_new;
-}
-
-void cursor_pos_callback(GLFWwindow* window, double xpos, double ypos)
-{
- cursor_new.x = (float) xpos;
- cursor_new.y = (float) ypos;
-}
-
-int enable_vsync = nk_true;
-
-void update_vsync()
-{
- glfwSwapInterval(enable_vsync == nk_true ? 1 : 0);
-}
-
-int swap_clear = nk_false;
-int swap_finish = nk_true;
-int swap_occlusion_query = nk_false;
-int swap_read_pixels = nk_false;
-GLuint occlusion_query;
-
-void swap_buffers(GLFWwindow* window)
-{
- glfwSwapBuffers(window);
-
- if (swap_clear)
- glClear(GL_COLOR_BUFFER_BIT);
-
- if (swap_finish)
- glFinish();
-
- if (swap_occlusion_query) {
- GLint occlusion_result;
- if (!occlusion_query)
- glGenQueries(1, &occlusion_query);
- glBeginQuery(GL_SAMPLES_PASSED, occlusion_query);
- glBegin(GL_POINTS);
- glVertex2f(0, 0);
- glEnd();
- glEndQuery(GL_SAMPLES_PASSED);
- glGetQueryObjectiv(occlusion_query, GL_QUERY_RESULT, &occlusion_result);
- }
-
- if (swap_read_pixels) {
- unsigned char rgba[4];
- glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, rgba);
- }
-}
-
-void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (action != GLFW_PRESS)
- return;
-
- switch (key)
- {
- case GLFW_KEY_ESCAPE:
- glfwSetWindowShouldClose(window, 1);
- break;
- }
-}
-
-void draw_marker(struct nk_command_buffer* canvas, int lead, struct nk_vec2 pos)
-{
- struct nk_color colors[4] = { nk_rgb(255,0,0), nk_rgb(255,255,0), nk_rgb(0,255,0), nk_rgb(0,96,255) };
- struct nk_rect rect = { -5 + pos.x, -5 + pos.y, 10, 10 };
- nk_fill_circle(canvas, rect, colors[lead]);
-}
-
-int main(int argc, char** argv)
-{
- int ch, width, height;
- unsigned long frame_count = 0;
- double last_time, current_time;
- double frame_rate = 0;
- int fullscreen = GLFW_FALSE;
- GLFWmonitor* monitor = NULL;
- GLFWwindow* window;
- struct nk_context* nk;
- struct nk_font_atlas* atlas;
-
- int show_forecasts = nk_true;
-
- while ((ch = getopt(argc, argv, "fh")) != -1)
- {
- switch (ch)
- {
- case 'h':
- usage();
- exit(EXIT_SUCCESS);
-
- case 'f':
- fullscreen = GLFW_TRUE;
- break;
- }
- }
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- if (fullscreen)
- {
- const GLFWvidmode* mode;
-
- monitor = glfwGetPrimaryMonitor();
- mode = glfwGetVideoMode(monitor);
-
- width = mode->width;
- height = mode->height;
- }
- else
- {
- width = 640;
- height = 480;
- }
-
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
-
- glfwWindowHint(GLFW_SCALE_TO_MONITOR, GLFW_TRUE);
- glfwWindowHint(GLFW_WIN32_KEYBOARD_MENU, GLFW_TRUE);
-
- window = glfwCreateWindow(width, height, "Input lag test", monitor, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- update_vsync();
-
- last_time = glfwGetTime();
-
- nk = nk_glfw3_init(window, NK_GLFW3_INSTALL_CALLBACKS);
- nk_glfw3_font_stash_begin(&atlas);
- nk_glfw3_font_stash_end();
-
- glfwSetKeyCallback(window, key_callback);
- glfwSetCursorPosCallback(window, cursor_pos_callback);
-
- while (!glfwWindowShouldClose(window))
- {
- int width, height;
- struct nk_rect area;
-
- glfwPollEvents();
- sample_input(window);
-
- glfwGetWindowSize(window, &width, &height);
- area = nk_rect(0.f, 0.f, (float) width, (float) height);
-
- glClear(GL_COLOR_BUFFER_BIT);
- nk_glfw3_new_frame();
- if (nk_begin(nk, "", area, 0))
- {
- nk_flags align_left = NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE;
- struct nk_command_buffer *canvas = nk_window_get_canvas(nk);
- int lead;
-
- for (lead = show_forecasts ? 3 : 0; lead >= 0; lead--)
- draw_marker(canvas, lead, nk_vec2(cursor_pos.x + cursor_vel.x * lead,
- cursor_pos.y + cursor_vel.y * lead));
-
- // print instructions
- nk_layout_row_dynamic(nk, 20, 1);
- nk_label(nk, "Move mouse uniformly and check marker under cursor:", align_left);
- for (lead = 0; lead <= 3; lead++) {
- nk_layout_row_begin(nk, NK_STATIC, 12, 2);
- nk_layout_row_push(nk, 25);
- draw_marker(canvas, lead, nk_layout_space_to_screen(nk, nk_vec2(20, 5)));
- nk_label(nk, "", 0);
- nk_layout_row_push(nk, 500);
- if (lead == 0)
- nk_label(nk, "- current cursor position (no input lag)", align_left);
- else
- nk_labelf(nk, align_left, "- %d-frame forecast (input lag is %d frame)", lead, lead);
- nk_layout_row_end(nk);
- }
-
- nk_layout_row_dynamic(nk, 20, 1);
-
- nk_checkbox_label(nk, "Show forecasts", &show_forecasts);
- nk_label(nk, "Input method:", align_left);
- if (nk_option_label(nk, "glfwGetCursorPos (sync query)", cursor_method == cursor_sync_query))
- cursor_method = cursor_sync_query;
- if (nk_option_label(nk, "glfwSetCursorPosCallback (latest input message)", cursor_method == cursor_input_message))
- cursor_method = cursor_input_message;
-
- nk_label(nk, "", 0); // separator
-
- nk_value_float(nk, "FPS", (float) frame_rate);
- if (nk_checkbox_label(nk, "Enable vsync", &enable_vsync))
- update_vsync();
-
- nk_label(nk, "", 0); // separator
-
- nk_label(nk, "After swap:", align_left);
- nk_checkbox_label(nk, "glClear", &swap_clear);
- nk_checkbox_label(nk, "glFinish", &swap_finish);
- nk_checkbox_label(nk, "draw with occlusion query", &swap_occlusion_query);
- nk_checkbox_label(nk, "glReadPixels", &swap_read_pixels);
- }
-
- nk_end(nk);
- nk_glfw3_render(NK_ANTI_ALIASING_ON);
-
- swap_buffers(window);
-
- frame_count++;
-
- current_time = glfwGetTime();
- if (current_time - last_time > 1.0)
- {
- frame_rate = frame_count / (current_time - last_time);
- frame_count = 0;
- last_time = current_time;
- }
- }
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/joysticks.c b/3rdparty/glfw/source/tests/joysticks.c
deleted file mode 100644
index df00021..0000000
--- a/3rdparty/glfw/source/tests/joysticks.c
+++ /dev/null
@@ -1,346 +0,0 @@
-//========================================================================
-// Joystick input test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test displays the state of every button and axis of every connected
-// joystick and/or gamepad
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#define NK_IMPLEMENTATION
-#define NK_INCLUDE_FIXED_TYPES
-#define NK_INCLUDE_FONT_BAKING
-#define NK_INCLUDE_DEFAULT_FONT
-#define NK_INCLUDE_DEFAULT_ALLOCATOR
-#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
-#define NK_INCLUDE_STANDARD_VARARGS
-#define NK_BUTTON_TRIGGER_ON_RELEASE
-#include <nuklear.h>
-
-#define NK_GLFW_GL2_IMPLEMENTATION
-#include <nuklear_glfw_gl2.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#ifdef _MSC_VER
-#define strdup(x) _strdup(x)
-#endif
-
-static GLFWwindow* window;
-static int joysticks[GLFW_JOYSTICK_LAST + 1];
-static int joystick_count = 0;
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void joystick_callback(int jid, int event)
-{
- if (event == GLFW_CONNECTED)
- joysticks[joystick_count++] = jid;
- else if (event == GLFW_DISCONNECTED)
- {
- int i;
-
- for (i = 0; i < joystick_count; i++)
- {
- if (joysticks[i] == jid)
- break;
- }
-
- for (i = i + 1; i < joystick_count; i++)
- joysticks[i - 1] = joysticks[i];
-
- joystick_count--;
- }
-
- if (!glfwGetWindowAttrib(window, GLFW_FOCUSED))
- glfwRequestWindowAttention(window);
-}
-
-static void drop_callback(GLFWwindow* window, int count, const char* paths[])
-{
- int i;
-
- for (i = 0; i < count; i++)
- {
- long size;
- char* text;
- FILE* stream = fopen(paths[i], "rb");
- if (!stream)
- continue;
-
- fseek(stream, 0, SEEK_END);
- size = ftell(stream);
- fseek(stream, 0, SEEK_SET);
-
- text = malloc(size + 1);
- text[size] = '\0';
- if (fread(text, 1, size, stream) == size)
- glfwUpdateGamepadMappings(text);
-
- free(text);
- fclose(stream);
- }
-}
-
-static const char* joystick_label(int jid)
-{
- static char label[1024];
- snprintf(label, sizeof(label), "%i: %s", jid + 1, glfwGetJoystickName(jid));
- return label;
-}
-
-static void hat_widget(struct nk_context* nk, unsigned char state)
-{
- float radius;
- struct nk_rect area;
- struct nk_vec2 center;
-
- if (nk_widget(&area, nk) == NK_WIDGET_INVALID)
- return;
-
- center = nk_vec2(area.x + area.w / 2.f, area.y + area.h / 2.f);
- radius = NK_MIN(area.w, area.h) / 2.f;
-
- nk_stroke_circle(nk_window_get_canvas(nk),
- nk_rect(center.x - radius,
- center.y - radius,
- radius * 2.f,
- radius * 2.f),
- 1.f,
- nk_rgb(175, 175, 175));
-
- if (state)
- {
- const float angles[] =
- {
- 0.f, 0.f,
- NK_PI * 1.5f, NK_PI * 1.75f,
- NK_PI, 0.f,
- NK_PI * 1.25f, 0.f,
- NK_PI * 0.5f, NK_PI * 0.25f,
- 0.f, 0.f,
- NK_PI * 0.75f, 0.f,
- };
- const float cosa = nk_cos(angles[state]);
- const float sina = nk_sin(angles[state]);
- const struct nk_vec2 p0 = nk_vec2(0.f, -radius);
- const struct nk_vec2 p1 = nk_vec2( radius / 2.f, -radius / 3.f);
- const struct nk_vec2 p2 = nk_vec2(-radius / 2.f, -radius / 3.f);
-
- nk_fill_triangle(nk_window_get_canvas(nk),
- center.x + cosa * p0.x + sina * p0.y,
- center.y + cosa * p0.y - sina * p0.x,
- center.x + cosa * p1.x + sina * p1.y,
- center.y + cosa * p1.y - sina * p1.x,
- center.x + cosa * p2.x + sina * p2.y,
- center.y + cosa * p2.y - sina * p2.x,
- nk_rgb(175, 175, 175));
- }
-}
-
-int main(void)
-{
- int jid, hat_buttons = GLFW_FALSE;
- struct nk_context* nk;
- struct nk_font_atlas* atlas;
-
- memset(joysticks, 0, sizeof(joysticks));
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- glfwWindowHint(GLFW_SCALE_TO_MONITOR, GLFW_TRUE);
- glfwWindowHint(GLFW_WIN32_KEYBOARD_MENU, GLFW_TRUE);
-
- window = glfwCreateWindow(800, 600, "Joystick Test", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSwapInterval(1);
-
- nk = nk_glfw3_init(window, NK_GLFW3_INSTALL_CALLBACKS);
- nk_glfw3_font_stash_begin(&atlas);
- nk_glfw3_font_stash_end();
-
- for (jid = GLFW_JOYSTICK_1; jid <= GLFW_JOYSTICK_LAST; jid++)
- {
- if (glfwJoystickPresent(jid))
- joysticks[joystick_count++] = jid;
- }
-
- glfwSetJoystickCallback(joystick_callback);
- glfwSetDropCallback(window, drop_callback);
-
- while (!glfwWindowShouldClose(window))
- {
- int i, width, height;
-
- glfwGetWindowSize(window, &width, &height);
-
- glClear(GL_COLOR_BUFFER_BIT);
- nk_glfw3_new_frame();
-
- if (nk_begin(nk,
- "Joysticks",
- nk_rect(width - 200.f, 0.f, 200.f, (float) height),
- NK_WINDOW_MINIMIZABLE |
- NK_WINDOW_TITLE))
- {
- nk_layout_row_dynamic(nk, 30, 1);
-
- nk_checkbox_label(nk, "Hat buttons", &hat_buttons);
-
- if (joystick_count)
- {
- for (i = 0; i < joystick_count; i++)
- {
- if (nk_button_label(nk, joystick_label(joysticks[i])))
- nk_window_set_focus(nk, joystick_label(joysticks[i]));
- }
- }
- else
- nk_label(nk, "No joysticks connected", NK_TEXT_LEFT);
- }
-
- nk_end(nk);
-
- for (i = 0; i < joystick_count; i++)
- {
- if (nk_begin(nk,
- joystick_label(joysticks[i]),
- nk_rect(i * 20.f, i * 20.f, 550.f, 570.f),
- NK_WINDOW_BORDER |
- NK_WINDOW_MOVABLE |
- NK_WINDOW_SCALABLE |
- NK_WINDOW_MINIMIZABLE |
- NK_WINDOW_TITLE))
- {
- int j, axis_count, button_count, hat_count;
- const float* axes;
- const unsigned char* buttons;
- const unsigned char* hats;
- GLFWgamepadstate state;
-
- nk_layout_row_dynamic(nk, 30, 1);
- nk_labelf(nk, NK_TEXT_LEFT, "Hardware GUID %s",
- glfwGetJoystickGUID(joysticks[i]));
- nk_label(nk, "Joystick state", NK_TEXT_LEFT);
-
- axes = glfwGetJoystickAxes(joysticks[i], &axis_count);
- buttons = glfwGetJoystickButtons(joysticks[i], &button_count);
- hats = glfwGetJoystickHats(joysticks[i], &hat_count);
-
- if (!hat_buttons)
- button_count -= hat_count * 4;
-
- for (j = 0; j < axis_count; j++)
- nk_slide_float(nk, -1.f, axes[j], 1.f, 0.1f);
-
- nk_layout_row_dynamic(nk, 30, 12);
-
- for (j = 0; j < button_count; j++)
- {
- char name[16];
- snprintf(name, sizeof(name), "%i", j + 1);
- nk_select_label(nk, name, NK_TEXT_CENTERED, buttons[j]);
- }
-
- nk_layout_row_dynamic(nk, 30, 8);
-
- for (j = 0; j < hat_count; j++)
- hat_widget(nk, hats[j]);
-
- nk_layout_row_dynamic(nk, 30, 1);
-
- if (glfwGetGamepadState(joysticks[i], &state))
- {
- int hat = 0;
- const char* names[GLFW_GAMEPAD_BUTTON_LAST + 1 - 4] =
- {
- "A", "B", "X", "Y",
- "LB", "RB",
- "Back", "Start", "Guide",
- "LT", "RT",
- };
-
- nk_labelf(nk, NK_TEXT_LEFT,
- "Gamepad state: %s",
- glfwGetGamepadName(joysticks[i]));
-
- nk_layout_row_dynamic(nk, 30, 2);
-
- for (j = 0; j <= GLFW_GAMEPAD_AXIS_LAST; j++)
- nk_slide_float(nk, -1.f, state.axes[j], 1.f, 0.1f);
-
- nk_layout_row_dynamic(nk, 30, GLFW_GAMEPAD_BUTTON_LAST + 1 - 4);
-
- for (j = 0; j <= GLFW_GAMEPAD_BUTTON_LAST - 4; j++)
- nk_select_label(nk, names[j], NK_TEXT_CENTERED, state.buttons[j]);
-
- if (state.buttons[GLFW_GAMEPAD_BUTTON_DPAD_UP])
- hat |= GLFW_HAT_UP;
- if (state.buttons[GLFW_GAMEPAD_BUTTON_DPAD_RIGHT])
- hat |= GLFW_HAT_RIGHT;
- if (state.buttons[GLFW_GAMEPAD_BUTTON_DPAD_DOWN])
- hat |= GLFW_HAT_DOWN;
- if (state.buttons[GLFW_GAMEPAD_BUTTON_DPAD_LEFT])
- hat |= GLFW_HAT_LEFT;
-
- nk_layout_row_dynamic(nk, 30, 8);
- hat_widget(nk, hat);
- }
- else
- nk_label(nk, "Joystick has no gamepad mapping", NK_TEXT_LEFT);
- }
-
- nk_end(nk);
- }
-
- nk_glfw3_render(NK_ANTI_ALIASING_ON);
-
- glfwSwapBuffers(window);
- glfwPollEvents();
- }
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/monitors.c b/3rdparty/glfw/source/tests/monitors.c
deleted file mode 100644
index 1043e66..0000000
--- a/3rdparty/glfw/source/tests/monitors.c
+++ /dev/null
@@ -1,263 +0,0 @@
-//========================================================================
-// Monitor information tool
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test prints monitor and video mode information or verifies video
-// modes
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "getopt.h"
-
-enum Mode
-{
- LIST_MODE,
- TEST_MODE
-};
-
-static void usage(void)
-{
- printf("Usage: monitors [-t]\n");
- printf(" monitors -h\n");
-}
-
-static int euclid(int a, int b)
-{
- return b ? euclid(b, a % b) : a;
-}
-
-static const char* format_mode(const GLFWvidmode* mode)
-{
- static char buffer[512];
- const int gcd = euclid(mode->width, mode->height);
-
- snprintf(buffer,
- sizeof(buffer),
- "%i x %i x %i (%i:%i) (%i %i %i) %i Hz",
- mode->width, mode->height,
- mode->redBits + mode->greenBits + mode->blueBits,
- mode->width / gcd, mode->height / gcd,
- mode->redBits, mode->greenBits, mode->blueBits,
- mode->refreshRate);
-
- buffer[sizeof(buffer) - 1] = '\0';
- return buffer;
-}
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void framebuffer_size_callback(GLFWwindow* window, int width, int height)
-{
- printf("Framebuffer resized to %ix%i\n", width, height);
-
- glViewport(0, 0, width, height);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (key == GLFW_KEY_ESCAPE)
- glfwSetWindowShouldClose(window, GLFW_TRUE);
-}
-
-static void list_modes(GLFWmonitor* monitor)
-{
- int count, x, y, width_mm, height_mm, i;
- int workarea_x, workarea_y, workarea_width, workarea_height;
- float xscale, yscale;
-
- const GLFWvidmode* mode = glfwGetVideoMode(monitor);
- const GLFWvidmode* modes = glfwGetVideoModes(monitor, &count);
-
- glfwGetMonitorPos(monitor, &x, &y);
- glfwGetMonitorPhysicalSize(monitor, &width_mm, &height_mm);
- glfwGetMonitorContentScale(monitor, &xscale, &yscale);
- glfwGetMonitorWorkarea(monitor, &workarea_x, &workarea_y, &workarea_width, &workarea_height);
-
- printf("Name: %s (%s)\n",
- glfwGetMonitorName(monitor),
- glfwGetPrimaryMonitor() == monitor ? "primary" : "secondary");
- printf("Current mode: %s\n", format_mode(mode));
- printf("Virtual position: %i, %i\n", x, y);
- printf("Content scale: %f x %f\n", xscale, yscale);
-
- printf("Physical size: %i x %i mm (%0.2f dpi at %i x %i)\n",
- width_mm, height_mm, mode->width * 25.4f / width_mm, mode->width, mode->height);
- printf("Monitor work area: %i x %i starting at %i, %i\n",
- workarea_width, workarea_height, workarea_x, workarea_y);
-
- printf("Modes:\n");
-
- for (i = 0; i < count; i++)
- {
- printf("%3u: %s", (unsigned int) i, format_mode(modes + i));
-
- if (memcmp(mode, modes + i, sizeof(GLFWvidmode)) == 0)
- printf(" (current mode)");
-
- putchar('\n');
- }
-}
-
-static void test_modes(GLFWmonitor* monitor)
-{
- int i, count;
- GLFWwindow* window;
- const GLFWvidmode* modes = glfwGetVideoModes(monitor, &count);
-
- for (i = 0; i < count; i++)
- {
- const GLFWvidmode* mode = modes + i;
- GLFWvidmode current;
-
- glfwWindowHint(GLFW_RED_BITS, mode->redBits);
- glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
- glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);
- glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);
-
- printf("Testing mode %u on monitor %s: %s\n",
- (unsigned int) i,
- glfwGetMonitorName(monitor),
- format_mode(mode));
-
- window = glfwCreateWindow(mode->width, mode->height,
- "Video Mode Test",
- glfwGetPrimaryMonitor(),
- NULL);
- if (!window)
- {
- printf("Failed to enter mode %u: %s\n",
- (unsigned int) i,
- format_mode(mode));
- continue;
- }
-
- glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
- glfwSetKeyCallback(window, key_callback);
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSwapInterval(1);
-
- glfwSetTime(0.0);
-
- while (glfwGetTime() < 5.0)
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glfwSwapBuffers(window);
- glfwPollEvents();
-
- if (glfwWindowShouldClose(window))
- {
- printf("User terminated program\n");
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
- }
- }
-
- glGetIntegerv(GL_RED_BITS, &current.redBits);
- glGetIntegerv(GL_GREEN_BITS, &current.greenBits);
- glGetIntegerv(GL_BLUE_BITS, &current.blueBits);
-
- glfwGetWindowSize(window, &current.width, &current.height);
-
- if (current.redBits != mode->redBits ||
- current.greenBits != mode->greenBits ||
- current.blueBits != mode->blueBits)
- {
- printf("*** Color bit mismatch: (%i %i %i) instead of (%i %i %i)\n",
- current.redBits, current.greenBits, current.blueBits,
- mode->redBits, mode->greenBits, mode->blueBits);
- }
-
- if (current.width != mode->width || current.height != mode->height)
- {
- printf("*** Size mismatch: %ix%i instead of %ix%i\n",
- current.width, current.height,
- mode->width, mode->height);
- }
-
- printf("Closing window\n");
-
- glfwDestroyWindow(window);
- window = NULL;
-
- glfwPollEvents();
- }
-}
-
-int main(int argc, char** argv)
-{
- int ch, i, count, mode = LIST_MODE;
- GLFWmonitor** monitors;
-
- while ((ch = getopt(argc, argv, "th")) != -1)
- {
- switch (ch)
- {
- case 'h':
- usage();
- exit(EXIT_SUCCESS);
- case 't':
- mode = TEST_MODE;
- break;
- default:
- usage();
- exit(EXIT_FAILURE);
- }
- }
-
- glfwSetErrorCallback(error_callback);
-
- glfwInitHint(GLFW_COCOA_MENUBAR, GLFW_FALSE);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- monitors = glfwGetMonitors(&count);
-
- for (i = 0; i < count; i++)
- {
- if (mode == LIST_MODE)
- list_modes(monitors[i]);
- else if (mode == TEST_MODE)
- test_modes(monitors[i]);
- }
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/msaa.c b/3rdparty/glfw/source/tests/msaa.c
deleted file mode 100644
index 10bfa3c..0000000
--- a/3rdparty/glfw/source/tests/msaa.c
+++ /dev/null
@@ -1,221 +0,0 @@
-//========================================================================
-// Multisample anti-aliasing test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test renders two high contrast, slowly rotating quads, one aliased
-// and one (hopefully) anti-aliased, thus allowing for visual verification
-// of whether MSAA is indeed enabled
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#if defined(_MSC_VER)
- // Make MS math.h define M_PI
- #define _USE_MATH_DEFINES
-#endif
-
-#include "linmath.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "getopt.h"
-
-static const vec2 vertices[4] =
-{
- { -0.6f, -0.6f },
- { 0.6f, -0.6f },
- { 0.6f, 0.6f },
- { -0.6f, 0.6f }
-};
-
-static const char* vertex_shader_text =
-"#version 110\n"
-"uniform mat4 MVP;\n"
-"attribute vec2 vPos;\n"
-"void main()\n"
-"{\n"
-" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
-"}\n";
-
-static const char* fragment_shader_text =
-"#version 110\n"
-"void main()\n"
-"{\n"
-" gl_FragColor = vec4(1.0);\n"
-"}\n";
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (action != GLFW_PRESS)
- return;
-
- switch (key)
- {
- case GLFW_KEY_SPACE:
- glfwSetTime(0.0);
- break;
- case GLFW_KEY_ESCAPE:
- glfwSetWindowShouldClose(window, GLFW_TRUE);
- break;
- }
-}
-
-static void usage(void)
-{
- printf("Usage: msaa [-h] [-s SAMPLES]\n");
-}
-
-int main(int argc, char** argv)
-{
- int ch, samples = 4;
- GLFWwindow* window;
- GLuint vertex_buffer, vertex_shader, fragment_shader, program;
- GLint mvp_location, vpos_location;
-
- while ((ch = getopt(argc, argv, "hs:")) != -1)
- {
- switch (ch)
- {
- case 'h':
- usage();
- exit(EXIT_SUCCESS);
- case 's':
- samples = atoi(optarg);
- break;
- default:
- usage();
- exit(EXIT_FAILURE);
- }
- }
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- if (samples)
- printf("Requesting MSAA with %i samples\n", samples);
- else
- printf("Requesting that MSAA not be available\n");
-
- glfwWindowHint(GLFW_SAMPLES, samples);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
-
- window = glfwCreateWindow(800, 400, "Aliasing Detector", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwSetKeyCallback(window, key_callback);
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSwapInterval(1);
-
- glGetIntegerv(GL_SAMPLES, &samples);
- if (samples)
- printf("Context reports MSAA is available with %i samples\n", samples);
- else
- printf("Context reports MSAA is unavailable\n");
-
- glGenBuffers(1, &vertex_buffer);
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- vertex_shader = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
- glCompileShader(vertex_shader);
-
- fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
- glCompileShader(fragment_shader);
-
- program = glCreateProgram();
- glAttachShader(program, vertex_shader);
- glAttachShader(program, fragment_shader);
- glLinkProgram(program);
-
- mvp_location = glGetUniformLocation(program, "MVP");
- vpos_location = glGetAttribLocation(program, "vPos");
-
- glEnableVertexAttribArray(vpos_location);
- glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
- sizeof(vertices[0]), (void*) 0);
-
- while (!glfwWindowShouldClose(window))
- {
- float ratio;
- int width, height;
- mat4x4 m, p, mvp;
- const double angle = glfwGetTime() * M_PI / 180.0;
-
- glfwGetFramebufferSize(window, &width, &height);
- ratio = width / (float) height;
-
- glViewport(0, 0, width, height);
- glClear(GL_COLOR_BUFFER_BIT);
-
- glUseProgram(program);
-
- mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 0.f, 1.f);
-
- mat4x4_translate(m, -1.f, 0.f, 0.f);
- mat4x4_rotate_Z(m, m, (float) angle);
- mat4x4_mul(mvp, p, m);
-
- glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
- glDisable(GL_MULTISAMPLE);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- mat4x4_translate(m, 1.f, 0.f, 0.f);
- mat4x4_rotate_Z(m, m, (float) angle);
- mat4x4_mul(mvp, p, m);
-
- glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
- glEnable(GL_MULTISAMPLE);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- glfwSwapBuffers(window);
- glfwPollEvents();
- }
-
- glfwDestroyWindow(window);
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/reopen.c b/3rdparty/glfw/source/tests/reopen.c
deleted file mode 100644
index b458755..0000000
--- a/3rdparty/glfw/source/tests/reopen.c
+++ /dev/null
@@ -1,241 +0,0 @@
-//========================================================================
-// Window re-opener (open/close stress test)
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test came about as the result of bug #1262773
-//
-// It closes and re-opens the GLFW window every five seconds, alternating
-// between windowed and full screen mode
-//
-// It also times and logs opening and closing actions and attempts to separate
-// user initiated window closing from its own
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <time.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "linmath.h"
-
-static const char* vertex_shader_text =
-"#version 110\n"
-"uniform mat4 MVP;\n"
-"attribute vec2 vPos;\n"
-"void main()\n"
-"{\n"
-" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
-"}\n";
-
-static const char* fragment_shader_text =
-"#version 110\n"
-"void main()\n"
-"{\n"
-" gl_FragColor = vec4(1.0);\n"
-"}\n";
-
-static const vec2 vertices[4] =
-{
- { -0.5f, -0.5f },
- { 0.5f, -0.5f },
- { 0.5f, 0.5f },
- { -0.5f, 0.5f }
-};
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void window_close_callback(GLFWwindow* window)
-{
- printf("Close callback triggered\n");
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (action != GLFW_PRESS)
- return;
-
- switch (key)
- {
- case GLFW_KEY_Q:
- case GLFW_KEY_ESCAPE:
- glfwSetWindowShouldClose(window, GLFW_TRUE);
- break;
- }
-}
-
-static void close_window(GLFWwindow* window)
-{
- double base = glfwGetTime();
- glfwDestroyWindow(window);
- printf("Closing window took %0.3f seconds\n", glfwGetTime() - base);
-}
-
-int main(int argc, char** argv)
-{
- int count = 0;
- double base;
- GLFWwindow* window;
-
- srand((unsigned int) time(NULL));
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
-
- for (;;)
- {
- int width, height;
- GLFWmonitor* monitor = NULL;
- GLuint vertex_shader, fragment_shader, program, vertex_buffer;
- GLint mvp_location, vpos_location;
-
- if (count & 1)
- {
- int monitorCount;
- GLFWmonitor** monitors = glfwGetMonitors(&monitorCount);
- monitor = monitors[rand() % monitorCount];
- }
-
- if (monitor)
- {
- const GLFWvidmode* mode = glfwGetVideoMode(monitor);
- width = mode->width;
- height = mode->height;
- }
- else
- {
- width = 640;
- height = 480;
- }
-
- base = glfwGetTime();
-
- window = glfwCreateWindow(width, height, "Window Re-opener", monitor, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- if (monitor)
- {
- printf("Opening full screen window on monitor %s took %0.3f seconds\n",
- glfwGetMonitorName(monitor),
- glfwGetTime() - base);
- }
- else
- {
- printf("Opening regular window took %0.3f seconds\n",
- glfwGetTime() - base);
- }
-
- glfwSetWindowCloseCallback(window, window_close_callback);
- glfwSetKeyCallback(window, key_callback);
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSwapInterval(1);
-
- vertex_shader = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
- glCompileShader(vertex_shader);
-
- fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
- glCompileShader(fragment_shader);
-
- program = glCreateProgram();
- glAttachShader(program, vertex_shader);
- glAttachShader(program, fragment_shader);
- glLinkProgram(program);
-
- mvp_location = glGetUniformLocation(program, "MVP");
- vpos_location = glGetAttribLocation(program, "vPos");
-
- glGenBuffers(1, &vertex_buffer);
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- glEnableVertexAttribArray(vpos_location);
- glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
- sizeof(vertices[0]), (void*) 0);
-
- glfwSetTime(0.0);
-
- while (glfwGetTime() < 5.0)
- {
- float ratio;
- int width, height;
- mat4x4 m, p, mvp;
-
- glfwGetFramebufferSize(window, &width, &height);
- ratio = width / (float) height;
-
- glViewport(0, 0, width, height);
- glClear(GL_COLOR_BUFFER_BIT);
-
- mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 0.f, 1.f);
-
- mat4x4_identity(m);
- mat4x4_rotate_Z(m, m, (float) glfwGetTime());
- mat4x4_mul(mvp, p, m);
-
- glUseProgram(program);
- glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- glfwSwapBuffers(window);
- glfwPollEvents();
-
- if (glfwWindowShouldClose(window))
- {
- close_window(window);
- printf("User closed window\n");
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
- }
- }
-
- printf("Closing window\n");
- close_window(window);
-
- count++;
- }
-
- glfwTerminate();
-}
-
diff --git a/3rdparty/glfw/source/tests/tearing.c b/3rdparty/glfw/source/tests/tearing.c
deleted file mode 100644
index 5c7893c..0000000
--- a/3rdparty/glfw/source/tests/tearing.c
+++ /dev/null
@@ -1,251 +0,0 @@
-//========================================================================
-// Vsync enabling test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test renders a high contrast, horizontally moving bar, allowing for
-// visual verification of whether the set swap interval is indeed obeyed
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-#include "linmath.h"
-
-static const struct
-{
- float x, y;
-} vertices[4] =
-{
- { -0.25f, -1.f },
- { 0.25f, -1.f },
- { 0.25f, 1.f },
- { -0.25f, 1.f }
-};
-
-static const char* vertex_shader_text =
-"#version 110\n"
-"uniform mat4 MVP;\n"
-"attribute vec2 vPos;\n"
-"void main()\n"
-"{\n"
-" gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
-"}\n";
-
-static const char* fragment_shader_text =
-"#version 110\n"
-"void main()\n"
-"{\n"
-" gl_FragColor = vec4(1.0);\n"
-"}\n";
-
-static int swap_tear;
-static int swap_interval;
-static double frame_rate;
-
-static void update_window_title(GLFWwindow* window)
-{
- char title[256];
-
- snprintf(title, sizeof(title), "Tearing detector (interval %i%s, %0.1f Hz)",
- swap_interval,
- (swap_tear && swap_interval < 0) ? " (swap tear)" : "",
- frame_rate);
-
- glfwSetWindowTitle(window, title);
-}
-
-static void set_swap_interval(GLFWwindow* window, int interval)
-{
- swap_interval = interval;
- glfwSwapInterval(swap_interval);
- update_window_title(window);
-}
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (action != GLFW_PRESS)
- return;
-
- switch (key)
- {
- case GLFW_KEY_UP:
- {
- if (swap_interval + 1 > swap_interval)
- set_swap_interval(window, swap_interval + 1);
- break;
- }
-
- case GLFW_KEY_DOWN:
- {
- if (swap_tear)
- {
- if (swap_interval - 1 < swap_interval)
- set_swap_interval(window, swap_interval - 1);
- }
- else
- {
- if (swap_interval - 1 >= 0)
- set_swap_interval(window, swap_interval - 1);
- }
- break;
- }
-
- case GLFW_KEY_ESCAPE:
- glfwSetWindowShouldClose(window, 1);
- break;
-
- case GLFW_KEY_F11:
- case GLFW_KEY_ENTER:
- {
- static int x, y, width, height;
-
- if (mods != GLFW_MOD_ALT)
- return;
-
- if (glfwGetWindowMonitor(window))
- glfwSetWindowMonitor(window, NULL, x, y, width, height, 0);
- else
- {
- GLFWmonitor* monitor = glfwGetPrimaryMonitor();
- const GLFWvidmode* mode = glfwGetVideoMode(monitor);
- glfwGetWindowPos(window, &x, &y);
- glfwGetWindowSize(window, &width, &height);
- glfwSetWindowMonitor(window, monitor,
- 0, 0, mode->width, mode->height,
- mode->refreshRate);
- }
-
- break;
- }
- }
-}
-
-int main(int argc, char** argv)
-{
- unsigned long frame_count = 0;
- double last_time, current_time;
- GLFWwindow* window;
- GLuint vertex_buffer, vertex_shader, fragment_shader, program;
- GLint mvp_location, vpos_location;
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
-
- window = glfwCreateWindow(640, 480, "Tearing detector", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- set_swap_interval(window, 0);
-
- last_time = glfwGetTime();
- frame_rate = 0.0;
- swap_tear = (glfwExtensionSupported("WGL_EXT_swap_control_tear") ||
- glfwExtensionSupported("GLX_EXT_swap_control_tear"));
-
- glfwSetKeyCallback(window, key_callback);
-
- glGenBuffers(1, &vertex_buffer);
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- vertex_shader = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
- glCompileShader(vertex_shader);
-
- fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
- glCompileShader(fragment_shader);
-
- program = glCreateProgram();
- glAttachShader(program, vertex_shader);
- glAttachShader(program, fragment_shader);
- glLinkProgram(program);
-
- mvp_location = glGetUniformLocation(program, "MVP");
- vpos_location = glGetAttribLocation(program, "vPos");
-
- glEnableVertexAttribArray(vpos_location);
- glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,
- sizeof(vertices[0]), (void*) 0);
-
- while (!glfwWindowShouldClose(window))
- {
- int width, height;
- mat4x4 m, p, mvp;
- float position = cosf((float) glfwGetTime() * 4.f) * 0.75f;
-
- glfwGetFramebufferSize(window, &width, &height);
-
- glViewport(0, 0, width, height);
- glClear(GL_COLOR_BUFFER_BIT);
-
- mat4x4_ortho(p, -1.f, 1.f, -1.f, 1.f, 0.f, 1.f);
- mat4x4_translate(m, position, 0.f, 0.f);
- mat4x4_mul(mvp, p, m);
-
- glUseProgram(program);
- glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- glfwSwapBuffers(window);
- glfwPollEvents();
-
- frame_count++;
-
- current_time = glfwGetTime();
- if (current_time - last_time > 1.0)
- {
- frame_rate = frame_count / (current_time - last_time);
- frame_count = 0;
- last_time = current_time;
- update_window_title(window);
- }
- }
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/threads.c b/3rdparty/glfw/source/tests/threads.c
deleted file mode 100644
index ec13b00..0000000
--- a/3rdparty/glfw/source/tests/threads.c
+++ /dev/null
@@ -1,153 +0,0 @@
-//========================================================================
-// Multi-threading test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test is intended to verify whether the OpenGL context part of
-// the GLFW API is able to be used from multiple threads
-//
-//========================================================================
-
-#include "tinycthread.h"
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-typedef struct
-{
- GLFWwindow* window;
- const char* title;
- float r, g, b;
- thrd_t id;
-} Thread;
-
-static volatile int running = GLFW_TRUE;
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
- glfwSetWindowShouldClose(window, GLFW_TRUE);
-}
-
-static int thread_main(void* data)
-{
- const Thread* thread = data;
-
- glfwMakeContextCurrent(thread->window);
- glfwSwapInterval(1);
-
- while (running)
- {
- const float v = (float) fabs(sin(glfwGetTime() * 2.f));
- glClearColor(thread->r * v, thread->g * v, thread->b * v, 0.f);
-
- glClear(GL_COLOR_BUFFER_BIT);
- glfwSwapBuffers(thread->window);
- }
-
- glfwMakeContextCurrent(NULL);
- return 0;
-}
-
-int main(void)
-{
- int i, result;
- Thread threads[] =
- {
- { NULL, "Red", 1.f, 0.f, 0.f, 0 },
- { NULL, "Green", 0.f, 1.f, 0.f, 0 },
- { NULL, "Blue", 0.f, 0.f, 1.f, 0 }
- };
- const int count = sizeof(threads) / sizeof(Thread);
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
-
- for (i = 0; i < count; i++)
- {
- threads[i].window = glfwCreateWindow(200, 200,
- threads[i].title,
- NULL, NULL);
- if (!threads[i].window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwSetKeyCallback(threads[i].window, key_callback);
-
- glfwSetWindowPos(threads[i].window, 200 + 250 * i, 200);
- glfwShowWindow(threads[i].window);
- }
-
- glfwMakeContextCurrent(threads[0].window);
- gladLoadGL(glfwGetProcAddress);
- glfwMakeContextCurrent(NULL);
-
- for (i = 0; i < count; i++)
- {
- if (thrd_create(&threads[i].id, thread_main, threads + i) !=
- thrd_success)
- {
- fprintf(stderr, "Failed to create secondary thread\n");
-
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
- }
-
- while (running)
- {
- glfwWaitEvents();
-
- for (i = 0; i < count; i++)
- {
- if (glfwWindowShouldClose(threads[i].window))
- running = GLFW_FALSE;
- }
- }
-
- for (i = 0; i < count; i++)
- glfwHideWindow(threads[i].window);
-
- for (i = 0; i < count; i++)
- thrd_join(threads[i].id, &result);
-
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/timeout.c b/3rdparty/glfw/source/tests/timeout.c
deleted file mode 100644
index c273746..0000000
--- a/3rdparty/glfw/source/tests/timeout.c
+++ /dev/null
@@ -1,99 +0,0 @@
-//========================================================================
-// Event wait timeout test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test is intended to verify that waiting for events with timeout works
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <time.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
- glfwSetWindowShouldClose(window, GLFW_TRUE);
-}
-
-static float nrand(void)
-{
- return (float) rand() / (float) RAND_MAX;
-}
-
-int main(void)
-{
- GLFWwindow* window;
-
- srand((unsigned int) time(NULL));
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- window = glfwCreateWindow(640, 480, "Event Wait Timeout Test", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSetKeyCallback(window, key_callback);
-
- while (!glfwWindowShouldClose(window))
- {
- int width, height;
- float r = nrand(), g = nrand(), b = nrand();
- float l = (float) sqrt(r * r + g * g + b * b);
-
- glfwGetFramebufferSize(window, &width, &height);
-
- glViewport(0, 0, width, height);
- glClearColor(r / l, g / l, b / l, 1.f);
- glClear(GL_COLOR_BUFFER_BIT);
- glfwSwapBuffers(window);
-
- glfwWaitEventsTimeout(1.0);
- }
-
- glfwDestroyWindow(window);
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/title.c b/3rdparty/glfw/source/tests/title.c
deleted file mode 100644
index 08a24e7..0000000
--- a/3rdparty/glfw/source/tests/title.c
+++ /dev/null
@@ -1,73 +0,0 @@
-//========================================================================
-// UTF-8 window title test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-//
-// This test sets a UTF-8 window title
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-
-static void error_callback(int error, const char* description)
-{
- fprintf(stderr, "Error: %s\n", description);
-}
-
-int main(void)
-{
- GLFWwindow* window;
-
- glfwSetErrorCallback(error_callback);
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- window = glfwCreateWindow(400, 400, "English 日本語 русский язык 官話", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSwapInterval(1);
-
- while (!glfwWindowShouldClose(window))
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glfwSwapBuffers(window);
- glfwWaitEvents();
- }
-
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-
diff --git a/3rdparty/glfw/source/tests/triangle-vulkan.c b/3rdparty/glfw/source/tests/triangle-vulkan.c
deleted file mode 100644
index fb5db3e..0000000
--- a/3rdparty/glfw/source/tests/triangle-vulkan.c
+++ /dev/null
@@ -1,2129 +0,0 @@
-/*
- * Copyright (c) 2015-2016 The Khronos Group Inc.
- * Copyright (c) 2015-2016 Valve Corporation
- * Copyright (c) 2015-2016 LunarG, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Author: Chia-I Wu <[email protected]>
- * Author: Cody Northrop <[email protected]>
- * Author: Courtney Goeltzenleuchter <[email protected]>
- * Author: Ian Elliott <[email protected]>
- * Author: Jon Ashburn <[email protected]>
- * Author: Piers Daniell <[email protected]>
- * Author: Gwan-gyeong Mun <[email protected]>
- * Porter: Camilla Löwy <[email protected]>
- */
-/*
- * Draw a textured triangle with depth testing. This is written against Intel
- * ICD. It does not do state transition nor object memory binding like it
- * should. It also does no error checking.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-#include <assert.h>
-#include <signal.h>
-
-#ifdef _WIN32
-#include <windows.h>
-#endif
-
-#define GLAD_VULKAN_IMPLEMENTATION
-#include <glad/vulkan.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#define DEMO_TEXTURE_COUNT 1
-#define VERTEX_BUFFER_BIND_ID 0
-#define APP_SHORT_NAME "tri"
-#define APP_LONG_NAME "The Vulkan Triangle Demo Program"
-
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
-
-#if defined(NDEBUG) && defined(__GNUC__)
-#define U_ASSERT_ONLY __attribute__((unused))
-#else
-#define U_ASSERT_ONLY
-#endif
-
-#define ERR_EXIT(err_msg, err_class) \
- do { \
- printf(err_msg); \
- fflush(stdout); \
- exit(1); \
- } while (0)
-
-static const uint32_t fragShaderCode[] = {
- 0x07230203,0x00010000,0x00080007,0x00000014,0x00000000,0x00020011,0x00000001,0x0006000b,
- 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
- 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00000011,0x00030010,
- 0x00000004,0x00000007,0x00030003,0x00000002,0x00000190,0x00090004,0x415f4c47,0x735f4252,
- 0x72617065,0x5f657461,0x64616873,0x6f5f7265,0x63656a62,0x00007374,0x00090004,0x415f4c47,
- 0x735f4252,0x69646168,0x6c5f676e,0x75676e61,0x5f656761,0x70303234,0x006b6361,0x00040005,
- 0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000009,0x61724675,0x6c6f4367,0x0000726f,
- 0x00030005,0x0000000d,0x00786574,0x00050005,0x00000011,0x63786574,0x64726f6f,0x00000000,
- 0x00040047,0x00000009,0x0000001e,0x00000000,0x00040047,0x0000000d,0x00000022,0x00000000,
- 0x00040047,0x0000000d,0x00000021,0x00000000,0x00040047,0x00000011,0x0000001e,0x00000000,
- 0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,
- 0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,0x00000007,
- 0x0004003b,0x00000008,0x00000009,0x00000003,0x00090019,0x0000000a,0x00000006,0x00000001,
- 0x00000000,0x00000000,0x00000000,0x00000001,0x00000000,0x0003001b,0x0000000b,0x0000000a,
- 0x00040020,0x0000000c,0x00000000,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000000,
- 0x00040017,0x0000000f,0x00000006,0x00000002,0x00040020,0x00000010,0x00000001,0x0000000f,
- 0x0004003b,0x00000010,0x00000011,0x00000001,0x00050036,0x00000002,0x00000004,0x00000000,
- 0x00000003,0x000200f8,0x00000005,0x0004003d,0x0000000b,0x0000000e,0x0000000d,0x0004003d,
- 0x0000000f,0x00000012,0x00000011,0x00050057,0x00000007,0x00000013,0x0000000e,0x00000012,
- 0x0003003e,0x00000009,0x00000013,0x000100fd,0x00010038
-};
-
-static const uint32_t vertShaderCode[] = {
- 0x07230203,0x00010000,0x00080007,0x00000018,0x00000000,0x00020011,0x00000001,0x0006000b,
- 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
- 0x0009000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x00000009,0x0000000b,0x00000010,
- 0x00000014,0x00030003,0x00000002,0x00000190,0x00090004,0x415f4c47,0x735f4252,0x72617065,
- 0x5f657461,0x64616873,0x6f5f7265,0x63656a62,0x00007374,0x00090004,0x415f4c47,0x735f4252,
- 0x69646168,0x6c5f676e,0x75676e61,0x5f656761,0x70303234,0x006b6361,0x00040005,0x00000004,
- 0x6e69616d,0x00000000,0x00050005,0x00000009,0x63786574,0x64726f6f,0x00000000,0x00040005,
- 0x0000000b,0x72747461,0x00000000,0x00060005,0x0000000e,0x505f6c67,0x65567265,0x78657472,
- 0x00000000,0x00060006,0x0000000e,0x00000000,0x505f6c67,0x7469736f,0x006e6f69,0x00030005,
- 0x00000010,0x00000000,0x00030005,0x00000014,0x00736f70,0x00040047,0x00000009,0x0000001e,
- 0x00000000,0x00040047,0x0000000b,0x0000001e,0x00000001,0x00050048,0x0000000e,0x00000000,
- 0x0000000b,0x00000000,0x00030047,0x0000000e,0x00000002,0x00040047,0x00000014,0x0000001e,
- 0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
- 0x00000020,0x00040017,0x00000007,0x00000006,0x00000002,0x00040020,0x00000008,0x00000003,
- 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x00040020,0x0000000a,0x00000001,
- 0x00000007,0x0004003b,0x0000000a,0x0000000b,0x00000001,0x00040017,0x0000000d,0x00000006,
- 0x00000004,0x0003001e,0x0000000e,0x0000000d,0x00040020,0x0000000f,0x00000003,0x0000000e,
- 0x0004003b,0x0000000f,0x00000010,0x00000003,0x00040015,0x00000011,0x00000020,0x00000001,
- 0x0004002b,0x00000011,0x00000012,0x00000000,0x00040020,0x00000013,0x00000001,0x0000000d,
- 0x0004003b,0x00000013,0x00000014,0x00000001,0x00040020,0x00000016,0x00000003,0x0000000d,
- 0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,
- 0x00000007,0x0000000c,0x0000000b,0x0003003e,0x00000009,0x0000000c,0x0004003d,0x0000000d,
- 0x00000015,0x00000014,0x00050041,0x00000016,0x00000017,0x00000010,0x00000012,0x0003003e,
- 0x00000017,0x00000015,0x000100fd,0x00010038
-};
-
-struct texture_object {
- VkSampler sampler;
-
- VkImage image;
- VkImageLayout imageLayout;
-
- VkDeviceMemory mem;
- VkImageView view;
- int32_t tex_width, tex_height;
-};
-
-static int validation_error = 0;
-
-VKAPI_ATTR VkBool32 VKAPI_CALL
-BreakCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
- uint64_t srcObject, size_t location, int32_t msgCode,
- const char *pLayerPrefix, const char *pMsg,
- void *pUserData) {
-#ifdef _WIN32
- DebugBreak();
-#else
- raise(SIGTRAP);
-#endif
-
- return false;
-}
-
-typedef struct {
- VkImage image;
- VkCommandBuffer cmd;
- VkImageView view;
-} SwapchainBuffers;
-
-struct demo {
- GLFWwindow* window;
- VkSurfaceKHR surface;
- bool use_staging_buffer;
-
- VkInstance inst;
- VkPhysicalDevice gpu;
- VkDevice device;
- VkQueue queue;
- VkPhysicalDeviceProperties gpu_props;
- VkPhysicalDeviceFeatures gpu_features;
- VkQueueFamilyProperties *queue_props;
- uint32_t graphics_queue_node_index;
-
- uint32_t enabled_extension_count;
- uint32_t enabled_layer_count;
- const char *extension_names[64];
- const char *enabled_layers[64];
-
- int width, height;
- VkFormat format;
- VkColorSpaceKHR color_space;
-
- uint32_t swapchainImageCount;
- VkSwapchainKHR swapchain;
- SwapchainBuffers *buffers;
-
- VkCommandPool cmd_pool;
-
- struct {
- VkFormat format;
-
- VkImage image;
- VkDeviceMemory mem;
- VkImageView view;
- } depth;
-
- struct texture_object textures[DEMO_TEXTURE_COUNT];
-
- struct {
- VkBuffer buf;
- VkDeviceMemory mem;
-
- VkPipelineVertexInputStateCreateInfo vi;
- VkVertexInputBindingDescription vi_bindings[1];
- VkVertexInputAttributeDescription vi_attrs[2];
- } vertices;
-
- VkCommandBuffer setup_cmd; // Command Buffer for initialization commands
- VkCommandBuffer draw_cmd; // Command Buffer for drawing commands
- VkPipelineLayout pipeline_layout;
- VkDescriptorSetLayout desc_layout;
- VkPipelineCache pipelineCache;
- VkRenderPass render_pass;
- VkPipeline pipeline;
-
- VkShaderModule vert_shader_module;
- VkShaderModule frag_shader_module;
-
- VkDescriptorPool desc_pool;
- VkDescriptorSet desc_set;
-
- VkFramebuffer *framebuffers;
-
- VkPhysicalDeviceMemoryProperties memory_properties;
-
- int32_t curFrame;
- int32_t frameCount;
- bool validate;
- bool use_break;
- VkDebugReportCallbackEXT msg_callback;
-
- float depthStencil;
- float depthIncrement;
-
- uint32_t current_buffer;
- uint32_t queue_count;
-};
-
-VKAPI_ATTR VkBool32 VKAPI_CALL
-dbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
- uint64_t srcObject, size_t location, int32_t msgCode,
- const char *pLayerPrefix, const char *pMsg, void *pUserData) {
- char *message = (char *)malloc(strlen(pMsg) + 100);
-
- assert(message);
-
- validation_error = 1;
-
- if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) {
- sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode,
- pMsg);
- } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) {
- sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode,
- pMsg);
- } else {
- return false;
- }
-
- printf("%s\n", message);
- fflush(stdout);
- free(message);
-
- /*
- * false indicates that layer should not bail-out of an
- * API call that had validation failures. This may mean that the
- * app dies inside the driver due to invalid parameter(s).
- * That's what would happen without validation layers, so we'll
- * keep that behavior here.
- */
- return false;
-}
-
-// Forward declaration:
-static void demo_resize(struct demo *demo);
-
-static bool memory_type_from_properties(struct demo *demo, uint32_t typeBits,
- VkFlags requirements_mask,
- uint32_t *typeIndex) {
- uint32_t i;
- // Search memtypes to find first index with those properties
- for (i = 0; i < VK_MAX_MEMORY_TYPES; i++) {
- if ((typeBits & 1) == 1) {
- // Type is available, does it match user properties?
- if ((demo->memory_properties.memoryTypes[i].propertyFlags &
- requirements_mask) == requirements_mask) {
- *typeIndex = i;
- return true;
- }
- }
- typeBits >>= 1;
- }
- // No memory types matched, return failure
- return false;
-}
-
-static void demo_flush_init_cmd(struct demo *demo) {
- VkResult U_ASSERT_ONLY err;
-
- if (demo->setup_cmd == VK_NULL_HANDLE)
- return;
-
- err = vkEndCommandBuffer(demo->setup_cmd);
- assert(!err);
-
- const VkCommandBuffer cmd_bufs[] = {demo->setup_cmd};
- VkFence nullFence = {VK_NULL_HANDLE};
- VkSubmitInfo submit_info = {.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
- .pNext = NULL,
- .waitSemaphoreCount = 0,
- .pWaitSemaphores = NULL,
- .pWaitDstStageMask = NULL,
- .commandBufferCount = 1,
- .pCommandBuffers = cmd_bufs,
- .signalSemaphoreCount = 0,
- .pSignalSemaphores = NULL};
-
- err = vkQueueSubmit(demo->queue, 1, &submit_info, nullFence);
- assert(!err);
-
- err = vkQueueWaitIdle(demo->queue);
- assert(!err);
-
- vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, cmd_bufs);
- demo->setup_cmd = VK_NULL_HANDLE;
-}
-
-static void demo_set_image_layout(struct demo *demo, VkImage image,
- VkImageAspectFlags aspectMask,
- VkImageLayout old_image_layout,
- VkImageLayout new_image_layout,
- VkAccessFlagBits srcAccessMask) {
-
- VkResult U_ASSERT_ONLY err;
-
- if (demo->setup_cmd == VK_NULL_HANDLE) {
- const VkCommandBufferAllocateInfo cmd = {
- .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
- .pNext = NULL,
- .commandPool = demo->cmd_pool,
- .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
- .commandBufferCount = 1,
- };
-
- err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->setup_cmd);
- assert(!err);
-
- VkCommandBufferBeginInfo cmd_buf_info = {
- .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
- .pNext = NULL,
- .flags = 0,
- .pInheritanceInfo = NULL,
- };
- err = vkBeginCommandBuffer(demo->setup_cmd, &cmd_buf_info);
- assert(!err);
- }
-
- VkImageMemoryBarrier image_memory_barrier = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
- .pNext = NULL,
- .srcAccessMask = srcAccessMask,
- .dstAccessMask = 0,
- .oldLayout = old_image_layout,
- .newLayout = new_image_layout,
- .image = image,
- .subresourceRange = {aspectMask, 0, 1, 0, 1}};
-
- if (new_image_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
- /* Make sure anything that was copying from this image has completed */
- image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
- }
-
- if (new_image_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
- image_memory_barrier.dstAccessMask =
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- }
-
- if (new_image_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
- image_memory_barrier.dstAccessMask =
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
- }
-
- if (new_image_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
- /* Make sure any Copy or CPU writes to image are flushed */
- image_memory_barrier.dstAccessMask =
- VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
- }
-
- VkImageMemoryBarrier *pmemory_barrier = &image_memory_barrier;
-
- VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
- VkPipelineStageFlags dest_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
-
- vkCmdPipelineBarrier(demo->setup_cmd, src_stages, dest_stages, 0, 0, NULL,
- 0, NULL, 1, pmemory_barrier);
-}
-
-static void demo_draw_build_cmd(struct demo *demo) {
- const VkCommandBufferBeginInfo cmd_buf_info = {
- .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
- .pNext = NULL,
- .flags = 0,
- .pInheritanceInfo = NULL,
- };
- const VkClearValue clear_values[2] = {
- [0] = {.color.float32 = {0.2f, 0.2f, 0.2f, 0.2f}},
- [1] = {.depthStencil = {demo->depthStencil, 0}},
- };
- const VkRenderPassBeginInfo rp_begin = {
- .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
- .pNext = NULL,
- .renderPass = demo->render_pass,
- .framebuffer = demo->framebuffers[demo->current_buffer],
- .renderArea.offset.x = 0,
- .renderArea.offset.y = 0,
- .renderArea.extent.width = demo->width,
- .renderArea.extent.height = demo->height,
- .clearValueCount = 2,
- .pClearValues = clear_values,
- };
- VkResult U_ASSERT_ONLY err;
-
- err = vkBeginCommandBuffer(demo->draw_cmd, &cmd_buf_info);
- assert(!err);
-
- // We can use LAYOUT_UNDEFINED as a wildcard here because we don't care what
- // happens to the previous contents of the image
- VkImageMemoryBarrier image_memory_barrier = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
- .pNext = NULL,
- .srcAccessMask = 0,
- .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
- .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED,
- .newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
- .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .image = demo->buffers[demo->current_buffer].image,
- .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
-
- vkCmdPipelineBarrier(demo->draw_cmd, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
- VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, NULL, 0,
- NULL, 1, &image_memory_barrier);
- vkCmdBeginRenderPass(demo->draw_cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
- vkCmdBindPipeline(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
- demo->pipeline);
- vkCmdBindDescriptorSets(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
- demo->pipeline_layout, 0, 1, &demo->desc_set, 0,
- NULL);
-
- VkViewport viewport;
- memset(&viewport, 0, sizeof(viewport));
- viewport.height = (float)demo->height;
- viewport.width = (float)demo->width;
- viewport.minDepth = (float)0.0f;
- viewport.maxDepth = (float)1.0f;
- vkCmdSetViewport(demo->draw_cmd, 0, 1, &viewport);
-
- VkRect2D scissor;
- memset(&scissor, 0, sizeof(scissor));
- scissor.extent.width = demo->width;
- scissor.extent.height = demo->height;
- scissor.offset.x = 0;
- scissor.offset.y = 0;
- vkCmdSetScissor(demo->draw_cmd, 0, 1, &scissor);
-
- VkDeviceSize offsets[1] = {0};
- vkCmdBindVertexBuffers(demo->draw_cmd, VERTEX_BUFFER_BIND_ID, 1,
- &demo->vertices.buf, offsets);
-
- vkCmdDraw(demo->draw_cmd, 3, 1, 0, 0);
- vkCmdEndRenderPass(demo->draw_cmd);
-
- VkImageMemoryBarrier prePresentBarrier = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
- .pNext = NULL,
- .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
- .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT,
- .oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
- .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
- .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
-
- prePresentBarrier.image = demo->buffers[demo->current_buffer].image;
- VkImageMemoryBarrier *pmemory_barrier = &prePresentBarrier;
- vkCmdPipelineBarrier(demo->draw_cmd, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
- VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, NULL, 0,
- NULL, 1, pmemory_barrier);
-
- err = vkEndCommandBuffer(demo->draw_cmd);
- assert(!err);
-}
-
-static void demo_draw(struct demo *demo) {
- VkResult U_ASSERT_ONLY err;
- VkSemaphore imageAcquiredSemaphore, drawCompleteSemaphore;
- VkSemaphoreCreateInfo semaphoreCreateInfo = {
- .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
- .pNext = NULL,
- .flags = 0,
- };
-
- err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,
- NULL, &imageAcquiredSemaphore);
- assert(!err);
-
- err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,
- NULL, &drawCompleteSemaphore);
- assert(!err);
-
- // Get the index of the next available swapchain image:
- err = vkAcquireNextImageKHR(demo->device, demo->swapchain, UINT64_MAX,
- imageAcquiredSemaphore,
- (VkFence)0, // TODO: Show use of fence
- &demo->current_buffer);
- if (err == VK_ERROR_OUT_OF_DATE_KHR) {
- // demo->swapchain is out of date (e.g. the window was resized) and
- // must be recreated:
- demo_resize(demo);
- demo_draw(demo);
- vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);
- vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);
- return;
- } else if (err == VK_SUBOPTIMAL_KHR) {
- // demo->swapchain is not as optimal as it could be, but the platform's
- // presentation engine will still present the image correctly.
- } else {
- assert(!err);
- }
-
- demo_flush_init_cmd(demo);
-
- // Wait for the present complete semaphore to be signaled to ensure
- // that the image won't be rendered to until the presentation
- // engine has fully released ownership to the application, and it is
- // okay to render to the image.
-
- demo_draw_build_cmd(demo);
- VkFence nullFence = VK_NULL_HANDLE;
- VkPipelineStageFlags pipe_stage_flags =
- VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
- VkSubmitInfo submit_info = {.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
- .pNext = NULL,
- .waitSemaphoreCount = 1,
- .pWaitSemaphores = &imageAcquiredSemaphore,
- .pWaitDstStageMask = &pipe_stage_flags,
- .commandBufferCount = 1,
- .pCommandBuffers = &demo->draw_cmd,
- .signalSemaphoreCount = 1,
- .pSignalSemaphores = &drawCompleteSemaphore};
-
- err = vkQueueSubmit(demo->queue, 1, &submit_info, nullFence);
- assert(!err);
-
- VkPresentInfoKHR present = {
- .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
- .pNext = NULL,
- .waitSemaphoreCount = 1,
- .pWaitSemaphores = &drawCompleteSemaphore,
- .swapchainCount = 1,
- .pSwapchains = &demo->swapchain,
- .pImageIndices = &demo->current_buffer,
- };
-
- err = vkQueuePresentKHR(demo->queue, &present);
- if (err == VK_ERROR_OUT_OF_DATE_KHR) {
- // demo->swapchain is out of date (e.g. the window was resized) and
- // must be recreated:
- demo_resize(demo);
- } else if (err == VK_SUBOPTIMAL_KHR) {
- // demo->swapchain is not as optimal as it could be, but the platform's
- // presentation engine will still present the image correctly.
- } else {
- assert(!err);
- }
-
- err = vkQueueWaitIdle(demo->queue);
- assert(err == VK_SUCCESS);
-
- vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);
- vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);
-}
-
-static void demo_prepare_buffers(struct demo *demo) {
- VkResult U_ASSERT_ONLY err;
- VkSwapchainKHR oldSwapchain = demo->swapchain;
-
- // Check the surface capabilities and formats
- VkSurfaceCapabilitiesKHR surfCapabilities;
- err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
- demo->gpu, demo->surface, &surfCapabilities);
- assert(!err);
-
- uint32_t presentModeCount;
- err = vkGetPhysicalDeviceSurfacePresentModesKHR(
- demo->gpu, demo->surface, &presentModeCount, NULL);
- assert(!err);
- VkPresentModeKHR *presentModes =
- (VkPresentModeKHR *)malloc(presentModeCount * sizeof(VkPresentModeKHR));
- assert(presentModes);
- err = vkGetPhysicalDeviceSurfacePresentModesKHR(
- demo->gpu, demo->surface, &presentModeCount, presentModes);
- assert(!err);
-
- VkExtent2D swapchainExtent;
- // width and height are either both 0xFFFFFFFF, or both not 0xFFFFFFFF.
- if (surfCapabilities.currentExtent.width == 0xFFFFFFFF) {
- // If the surface size is undefined, the size is set to the size
- // of the images requested, which must fit within the minimum and
- // maximum values.
- swapchainExtent.width = demo->width;
- swapchainExtent.height = demo->height;
-
- if (swapchainExtent.width < surfCapabilities.minImageExtent.width) {
- swapchainExtent.width = surfCapabilities.minImageExtent.width;
- } else if (swapchainExtent.width > surfCapabilities.maxImageExtent.width) {
- swapchainExtent.width = surfCapabilities.maxImageExtent.width;
- }
-
- if (swapchainExtent.height < surfCapabilities.minImageExtent.height) {
- swapchainExtent.height = surfCapabilities.minImageExtent.height;
- } else if (swapchainExtent.height > surfCapabilities.maxImageExtent.height) {
- swapchainExtent.height = surfCapabilities.maxImageExtent.height;
- }
- } else {
- // If the surface size is defined, the swap chain size must match
- swapchainExtent = surfCapabilities.currentExtent;
- demo->width = surfCapabilities.currentExtent.width;
- demo->height = surfCapabilities.currentExtent.height;
- }
-
- VkPresentModeKHR swapchainPresentMode = VK_PRESENT_MODE_FIFO_KHR;
-
- // Determine the number of VkImage's to use in the swap chain.
- // Application desires to only acquire 1 image at a time (which is
- // "surfCapabilities.minImageCount").
- uint32_t desiredNumOfSwapchainImages = surfCapabilities.minImageCount;
- // If maxImageCount is 0, we can ask for as many images as we want;
- // otherwise we're limited to maxImageCount
- if ((surfCapabilities.maxImageCount > 0) &&
- (desiredNumOfSwapchainImages > surfCapabilities.maxImageCount)) {
- // Application must settle for fewer images than desired:
- desiredNumOfSwapchainImages = surfCapabilities.maxImageCount;
- }
-
- VkSurfaceTransformFlagsKHR preTransform;
- if (surfCapabilities.supportedTransforms &
- VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) {
- preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
- } else {
- preTransform = surfCapabilities.currentTransform;
- }
-
- const VkSwapchainCreateInfoKHR swapchain = {
- .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
- .pNext = NULL,
- .surface = demo->surface,
- .minImageCount = desiredNumOfSwapchainImages,
- .imageFormat = demo->format,
- .imageColorSpace = demo->color_space,
- .imageExtent =
- {
- .width = swapchainExtent.width, .height = swapchainExtent.height,
- },
- .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
- .preTransform = preTransform,
- .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
- .imageArrayLayers = 1,
- .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
- .queueFamilyIndexCount = 0,
- .pQueueFamilyIndices = NULL,
- .presentMode = swapchainPresentMode,
- .oldSwapchain = oldSwapchain,
- .clipped = true,
- };
- uint32_t i;
-
- err = vkCreateSwapchainKHR(demo->device, &swapchain, NULL, &demo->swapchain);
- assert(!err);
-
- // If we just re-created an existing swapchain, we should destroy the old
- // swapchain at this point.
- // Note: destroying the swapchain also cleans up all its associated
- // presentable images once the platform is done with them.
- if (oldSwapchain != VK_NULL_HANDLE) {
- vkDestroySwapchainKHR(demo->device, oldSwapchain, NULL);
- }
-
- err = vkGetSwapchainImagesKHR(demo->device, demo->swapchain,
- &demo->swapchainImageCount, NULL);
- assert(!err);
-
- VkImage *swapchainImages =
- (VkImage *)malloc(demo->swapchainImageCount * sizeof(VkImage));
- assert(swapchainImages);
- err = vkGetSwapchainImagesKHR(demo->device, demo->swapchain,
- &demo->swapchainImageCount,
- swapchainImages);
- assert(!err);
-
- demo->buffers = (SwapchainBuffers *)malloc(sizeof(SwapchainBuffers) *
- demo->swapchainImageCount);
- assert(demo->buffers);
-
- for (i = 0; i < demo->swapchainImageCount; i++) {
- VkImageViewCreateInfo color_attachment_view = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
- .pNext = NULL,
- .format = demo->format,
- .components =
- {
- .r = VK_COMPONENT_SWIZZLE_R,
- .g = VK_COMPONENT_SWIZZLE_G,
- .b = VK_COMPONENT_SWIZZLE_B,
- .a = VK_COMPONENT_SWIZZLE_A,
- },
- .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .baseMipLevel = 0,
- .levelCount = 1,
- .baseArrayLayer = 0,
- .layerCount = 1},
- .viewType = VK_IMAGE_VIEW_TYPE_2D,
- .flags = 0,
- };
-
- demo->buffers[i].image = swapchainImages[i];
-
- color_attachment_view.image = demo->buffers[i].image;
-
- err = vkCreateImageView(demo->device, &color_attachment_view, NULL,
- &demo->buffers[i].view);
- assert(!err);
- }
-
- demo->current_buffer = 0;
-
- if (NULL != presentModes) {
- free(presentModes);
- }
-}
-
-static void demo_prepare_depth(struct demo *demo) {
- const VkFormat depth_format = VK_FORMAT_D16_UNORM;
- const VkImageCreateInfo image = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
- .pNext = NULL,
- .imageType = VK_IMAGE_TYPE_2D,
- .format = depth_format,
- .extent = {demo->width, demo->height, 1},
- .mipLevels = 1,
- .arrayLayers = 1,
- .samples = VK_SAMPLE_COUNT_1_BIT,
- .tiling = VK_IMAGE_TILING_OPTIMAL,
- .usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
- .flags = 0,
- };
- VkMemoryAllocateInfo mem_alloc = {
- .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
- .pNext = NULL,
- .allocationSize = 0,
- .memoryTypeIndex = 0,
- };
- VkImageViewCreateInfo view = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
- .pNext = NULL,
- .image = VK_NULL_HANDLE,
- .format = depth_format,
- .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT,
- .baseMipLevel = 0,
- .levelCount = 1,
- .baseArrayLayer = 0,
- .layerCount = 1},
- .flags = 0,
- .viewType = VK_IMAGE_VIEW_TYPE_2D,
- };
-
- VkMemoryRequirements mem_reqs;
- VkResult U_ASSERT_ONLY err;
- bool U_ASSERT_ONLY pass;
-
- demo->depth.format = depth_format;
-
- /* create image */
- err = vkCreateImage(demo->device, &image, NULL, &demo->depth.image);
- assert(!err);
-
- /* get memory requirements for this object */
- vkGetImageMemoryRequirements(demo->device, demo->depth.image, &mem_reqs);
-
- /* select memory size and type */
- mem_alloc.allocationSize = mem_reqs.size;
- pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits,
- 0, /* No requirements */
- &mem_alloc.memoryTypeIndex);
- assert(pass);
-
- /* allocate memory */
- err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &demo->depth.mem);
- assert(!err);
-
- /* bind memory */
- err =
- vkBindImageMemory(demo->device, demo->depth.image, demo->depth.mem, 0);
- assert(!err);
-
- demo_set_image_layout(demo, demo->depth.image, VK_IMAGE_ASPECT_DEPTH_BIT,
- VK_IMAGE_LAYOUT_UNDEFINED,
- VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- 0);
-
- /* create image view */
- view.image = demo->depth.image;
- err = vkCreateImageView(demo->device, &view, NULL, &demo->depth.view);
- assert(!err);
-}
-
-static void
-demo_prepare_texture_image(struct demo *demo, const uint32_t *tex_colors,
- struct texture_object *tex_obj, VkImageTiling tiling,
- VkImageUsageFlags usage, VkFlags required_props) {
- const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
- const int32_t tex_width = 2;
- const int32_t tex_height = 2;
- VkResult U_ASSERT_ONLY err;
- bool U_ASSERT_ONLY pass;
-
- tex_obj->tex_width = tex_width;
- tex_obj->tex_height = tex_height;
-
- const VkImageCreateInfo image_create_info = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
- .pNext = NULL,
- .imageType = VK_IMAGE_TYPE_2D,
- .format = tex_format,
- .extent = {tex_width, tex_height, 1},
- .mipLevels = 1,
- .arrayLayers = 1,
- .samples = VK_SAMPLE_COUNT_1_BIT,
- .tiling = tiling,
- .usage = usage,
- .flags = 0,
- .initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED
- };
- VkMemoryAllocateInfo mem_alloc = {
- .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
- .pNext = NULL,
- .allocationSize = 0,
- .memoryTypeIndex = 0,
- };
-
- VkMemoryRequirements mem_reqs;
-
- err =
- vkCreateImage(demo->device, &image_create_info, NULL, &tex_obj->image);
- assert(!err);
-
- vkGetImageMemoryRequirements(demo->device, tex_obj->image, &mem_reqs);
-
- mem_alloc.allocationSize = mem_reqs.size;
- pass =
- memory_type_from_properties(demo, mem_reqs.memoryTypeBits,
- required_props, &mem_alloc.memoryTypeIndex);
- assert(pass);
-
- /* allocate memory */
- err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &tex_obj->mem);
- assert(!err);
-
- /* bind memory */
- err = vkBindImageMemory(demo->device, tex_obj->image, tex_obj->mem, 0);
- assert(!err);
-
- if (required_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
- const VkImageSubresource subres = {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .mipLevel = 0,
- .arrayLayer = 0,
- };
- VkSubresourceLayout layout;
- void *data;
- int32_t x, y;
-
- vkGetImageSubresourceLayout(demo->device, tex_obj->image, &subres,
- &layout);
-
- err = vkMapMemory(demo->device, tex_obj->mem, 0,
- mem_alloc.allocationSize, 0, &data);
- assert(!err);
-
- for (y = 0; y < tex_height; y++) {
- uint32_t *row = (uint32_t *)((char *)data + layout.rowPitch * y);
- for (x = 0; x < tex_width; x++)
- row[x] = tex_colors[(x & 1) ^ (y & 1)];
- }
-
- vkUnmapMemory(demo->device, tex_obj->mem);
- }
-
- tex_obj->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
- demo_set_image_layout(demo, tex_obj->image, VK_IMAGE_ASPECT_COLOR_BIT,
- VK_IMAGE_LAYOUT_PREINITIALIZED, tex_obj->imageLayout,
- VK_ACCESS_HOST_WRITE_BIT);
- /* setting the image layout does not reference the actual memory so no need
- * to add a mem ref */
-}
-
-static void demo_destroy_texture_image(struct demo *demo,
- struct texture_object *tex_obj) {
- /* clean up staging resources */
- vkDestroyImage(demo->device, tex_obj->image, NULL);
- vkFreeMemory(demo->device, tex_obj->mem, NULL);
-}
-
-static void demo_prepare_textures(struct demo *demo) {
- const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
- VkFormatProperties props;
- const uint32_t tex_colors[DEMO_TEXTURE_COUNT][2] = {
- {0xffff0000, 0xff00ff00},
- };
- uint32_t i;
- VkResult U_ASSERT_ONLY err;
-
- vkGetPhysicalDeviceFormatProperties(demo->gpu, tex_format, &props);
-
- for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
- if ((props.linearTilingFeatures &
- VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) &&
- !demo->use_staging_buffer) {
- /* Device can texture using linear textures */
- demo_prepare_texture_image(
- demo, tex_colors[i], &demo->textures[i], VK_IMAGE_TILING_LINEAR,
- VK_IMAGE_USAGE_SAMPLED_BIT,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
- VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
- } else if (props.optimalTilingFeatures &
- VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
- /* Must use staging buffer to copy linear texture to optimized */
- struct texture_object staging_texture;
-
- memset(&staging_texture, 0, sizeof(staging_texture));
- demo_prepare_texture_image(
- demo, tex_colors[i], &staging_texture, VK_IMAGE_TILING_LINEAR,
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
- VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
-
- demo_prepare_texture_image(
- demo, tex_colors[i], &demo->textures[i],
- VK_IMAGE_TILING_OPTIMAL,
- (VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),
- VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
-
- demo_set_image_layout(demo, staging_texture.image,
- VK_IMAGE_ASPECT_COLOR_BIT,
- staging_texture.imageLayout,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- 0);
-
- demo_set_image_layout(demo, demo->textures[i].image,
- VK_IMAGE_ASPECT_COLOR_BIT,
- demo->textures[i].imageLayout,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- 0);
-
- VkImageCopy copy_region = {
- .srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1},
- .srcOffset = {0, 0, 0},
- .dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1},
- .dstOffset = {0, 0, 0},
- .extent = {staging_texture.tex_width,
- staging_texture.tex_height, 1},
- };
- vkCmdCopyImage(
- demo->setup_cmd, staging_texture.image,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, demo->textures[i].image,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
-
- demo_set_image_layout(demo, demo->textures[i].image,
- VK_IMAGE_ASPECT_COLOR_BIT,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- demo->textures[i].imageLayout,
- 0);
-
- demo_flush_init_cmd(demo);
-
- demo_destroy_texture_image(demo, &staging_texture);
- } else {
- /* Can't support VK_FORMAT_B8G8R8A8_UNORM !? */
- assert(!"No support for B8G8R8A8_UNORM as texture image format");
- }
-
- const VkSamplerCreateInfo sampler = {
- .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
- .pNext = NULL,
- .magFilter = VK_FILTER_NEAREST,
- .minFilter = VK_FILTER_NEAREST,
- .mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST,
- .addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT,
- .addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT,
- .addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT,
- .mipLodBias = 0.0f,
- .anisotropyEnable = VK_FALSE,
- .maxAnisotropy = 1,
- .compareOp = VK_COMPARE_OP_NEVER,
- .minLod = 0.0f,
- .maxLod = 0.0f,
- .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
- .unnormalizedCoordinates = VK_FALSE,
- };
- VkImageViewCreateInfo view = {
- .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
- .pNext = NULL,
- .image = VK_NULL_HANDLE,
- .viewType = VK_IMAGE_VIEW_TYPE_2D,
- .format = tex_format,
- .components =
- {
- VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G,
- VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A,
- },
- .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
- .flags = 0,
- };
-
- /* create sampler */
- err = vkCreateSampler(demo->device, &sampler, NULL,
- &demo->textures[i].sampler);
- assert(!err);
-
- /* create image view */
- view.image = demo->textures[i].image;
- err = vkCreateImageView(demo->device, &view, NULL,
- &demo->textures[i].view);
- assert(!err);
- }
-}
-
-static void demo_prepare_vertices(struct demo *demo) {
- // clang-format off
- const float vb[3][5] = {
- /* position texcoord */
- { -1.0f, -1.0f, 0.25f, 0.0f, 0.0f },
- { 1.0f, -1.0f, 0.25f, 1.0f, 0.0f },
- { 0.0f, 1.0f, 1.0f, 0.5f, 1.0f },
- };
- // clang-format on
- const VkBufferCreateInfo buf_info = {
- .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
- .pNext = NULL,
- .size = sizeof(vb),
- .usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
- .flags = 0,
- };
- VkMemoryAllocateInfo mem_alloc = {
- .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
- .pNext = NULL,
- .allocationSize = 0,
- .memoryTypeIndex = 0,
- };
- VkMemoryRequirements mem_reqs;
- VkResult U_ASSERT_ONLY err;
- bool U_ASSERT_ONLY pass;
- void *data;
-
- memset(&demo->vertices, 0, sizeof(demo->vertices));
-
- err = vkCreateBuffer(demo->device, &buf_info, NULL, &demo->vertices.buf);
- assert(!err);
-
- vkGetBufferMemoryRequirements(demo->device, demo->vertices.buf, &mem_reqs);
- assert(!err);
-
- mem_alloc.allocationSize = mem_reqs.size;
- pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
- VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- &mem_alloc.memoryTypeIndex);
- assert(pass);
-
- err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &demo->vertices.mem);
- assert(!err);
-
- err = vkMapMemory(demo->device, demo->vertices.mem, 0,
- mem_alloc.allocationSize, 0, &data);
- assert(!err);
-
- memcpy(data, vb, sizeof(vb));
-
- vkUnmapMemory(demo->device, demo->vertices.mem);
-
- err = vkBindBufferMemory(demo->device, demo->vertices.buf,
- demo->vertices.mem, 0);
- assert(!err);
-
- demo->vertices.vi.sType =
- VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
- demo->vertices.vi.pNext = NULL;
- demo->vertices.vi.vertexBindingDescriptionCount = 1;
- demo->vertices.vi.pVertexBindingDescriptions = demo->vertices.vi_bindings;
- demo->vertices.vi.vertexAttributeDescriptionCount = 2;
- demo->vertices.vi.pVertexAttributeDescriptions = demo->vertices.vi_attrs;
-
- demo->vertices.vi_bindings[0].binding = VERTEX_BUFFER_BIND_ID;
- demo->vertices.vi_bindings[0].stride = sizeof(vb[0]);
- demo->vertices.vi_bindings[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
-
- demo->vertices.vi_attrs[0].binding = VERTEX_BUFFER_BIND_ID;
- demo->vertices.vi_attrs[0].location = 0;
- demo->vertices.vi_attrs[0].format = VK_FORMAT_R32G32B32_SFLOAT;
- demo->vertices.vi_attrs[0].offset = 0;
-
- demo->vertices.vi_attrs[1].binding = VERTEX_BUFFER_BIND_ID;
- demo->vertices.vi_attrs[1].location = 1;
- demo->vertices.vi_attrs[1].format = VK_FORMAT_R32G32_SFLOAT;
- demo->vertices.vi_attrs[1].offset = sizeof(float) * 3;
-}
-
-static void demo_prepare_descriptor_layout(struct demo *demo) {
- const VkDescriptorSetLayoutBinding layout_binding = {
- .binding = 0,
- .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- .descriptorCount = DEMO_TEXTURE_COUNT,
- .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
- .pImmutableSamplers = NULL,
- };
- const VkDescriptorSetLayoutCreateInfo descriptor_layout = {
- .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
- .pNext = NULL,
- .bindingCount = 1,
- .pBindings = &layout_binding,
- };
- VkResult U_ASSERT_ONLY err;
-
- err = vkCreateDescriptorSetLayout(demo->device, &descriptor_layout, NULL,
- &demo->desc_layout);
- assert(!err);
-
- const VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
- .pNext = NULL,
- .setLayoutCount = 1,
- .pSetLayouts = &demo->desc_layout,
- };
-
- err = vkCreatePipelineLayout(demo->device, &pPipelineLayoutCreateInfo, NULL,
- &demo->pipeline_layout);
- assert(!err);
-}
-
-static void demo_prepare_render_pass(struct demo *demo) {
- const VkAttachmentDescription attachments[2] = {
- [0] =
- {
- .format = demo->format,
- .samples = VK_SAMPLE_COUNT_1_BIT,
- .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
- .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
- .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
- .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
- .initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
- .finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
- },
- [1] =
- {
- .format = demo->depth.format,
- .samples = VK_SAMPLE_COUNT_1_BIT,
- .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
- .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
- .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
- .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
- .initialLayout =
- VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- .finalLayout =
- VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- },
- };
- const VkAttachmentReference color_reference = {
- .attachment = 0, .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
- };
- const VkAttachmentReference depth_reference = {
- .attachment = 1,
- .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- };
- const VkSubpassDescription subpass = {
- .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
- .flags = 0,
- .inputAttachmentCount = 0,
- .pInputAttachments = NULL,
- .colorAttachmentCount = 1,
- .pColorAttachments = &color_reference,
- .pResolveAttachments = NULL,
- .pDepthStencilAttachment = &depth_reference,
- .preserveAttachmentCount = 0,
- .pPreserveAttachments = NULL,
- };
- const VkRenderPassCreateInfo rp_info = {
- .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
- .pNext = NULL,
- .attachmentCount = 2,
- .pAttachments = attachments,
- .subpassCount = 1,
- .pSubpasses = &subpass,
- .dependencyCount = 0,
- .pDependencies = NULL,
- };
- VkResult U_ASSERT_ONLY err;
-
- err = vkCreateRenderPass(demo->device, &rp_info, NULL, &demo->render_pass);
- assert(!err);
-}
-
-static VkShaderModule
-demo_prepare_shader_module(struct demo *demo, const void *code, size_t size) {
- VkShaderModuleCreateInfo moduleCreateInfo;
- VkShaderModule module;
- VkResult U_ASSERT_ONLY err;
-
- moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
- moduleCreateInfo.pNext = NULL;
-
- moduleCreateInfo.codeSize = size;
- moduleCreateInfo.pCode = code;
- moduleCreateInfo.flags = 0;
- err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module);
- assert(!err);
-
- return module;
-}
-
-static VkShaderModule demo_prepare_vs(struct demo *demo) {
- size_t size = sizeof(vertShaderCode);
-
- demo->vert_shader_module =
- demo_prepare_shader_module(demo, vertShaderCode, size);
-
- return demo->vert_shader_module;
-}
-
-static VkShaderModule demo_prepare_fs(struct demo *demo) {
- size_t size = sizeof(fragShaderCode);
-
- demo->frag_shader_module =
- demo_prepare_shader_module(demo, fragShaderCode, size);
-
- return demo->frag_shader_module;
-}
-
-static void demo_prepare_pipeline(struct demo *demo) {
- VkGraphicsPipelineCreateInfo pipeline;
- VkPipelineCacheCreateInfo pipelineCache;
-
- VkPipelineVertexInputStateCreateInfo vi;
- VkPipelineInputAssemblyStateCreateInfo ia;
- VkPipelineRasterizationStateCreateInfo rs;
- VkPipelineColorBlendStateCreateInfo cb;
- VkPipelineDepthStencilStateCreateInfo ds;
- VkPipelineViewportStateCreateInfo vp;
- VkPipelineMultisampleStateCreateInfo ms;
- VkDynamicState dynamicStateEnables[(VK_DYNAMIC_STATE_STENCIL_REFERENCE - VK_DYNAMIC_STATE_VIEWPORT + 1)];
- VkPipelineDynamicStateCreateInfo dynamicState;
-
- VkResult U_ASSERT_ONLY err;
-
- memset(dynamicStateEnables, 0, sizeof dynamicStateEnables);
- memset(&dynamicState, 0, sizeof dynamicState);
- dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
- dynamicState.pDynamicStates = dynamicStateEnables;
-
- memset(&pipeline, 0, sizeof(pipeline));
- pipeline.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
- pipeline.layout = demo->pipeline_layout;
-
- vi = demo->vertices.vi;
-
- memset(&ia, 0, sizeof(ia));
- ia.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
- ia.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
-
- memset(&rs, 0, sizeof(rs));
- rs.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
- rs.polygonMode = VK_POLYGON_MODE_FILL;
- rs.cullMode = VK_CULL_MODE_BACK_BIT;
- rs.frontFace = VK_FRONT_FACE_CLOCKWISE;
- rs.depthClampEnable = VK_FALSE;
- rs.rasterizerDiscardEnable = VK_FALSE;
- rs.depthBiasEnable = VK_FALSE;
- rs.lineWidth = 1.0f;
-
- memset(&cb, 0, sizeof(cb));
- cb.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
- VkPipelineColorBlendAttachmentState att_state[1];
- memset(att_state, 0, sizeof(att_state));
- att_state[0].colorWriteMask = 0xf;
- att_state[0].blendEnable = VK_FALSE;
- cb.attachmentCount = 1;
- cb.pAttachments = att_state;
-
- memset(&vp, 0, sizeof(vp));
- vp.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
- vp.viewportCount = 1;
- dynamicStateEnables[dynamicState.dynamicStateCount++] =
- VK_DYNAMIC_STATE_VIEWPORT;
- vp.scissorCount = 1;
- dynamicStateEnables[dynamicState.dynamicStateCount++] =
- VK_DYNAMIC_STATE_SCISSOR;
-
- memset(&ds, 0, sizeof(ds));
- ds.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
- ds.depthTestEnable = VK_TRUE;
- ds.depthWriteEnable = VK_TRUE;
- ds.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL;
- ds.depthBoundsTestEnable = VK_FALSE;
- ds.back.failOp = VK_STENCIL_OP_KEEP;
- ds.back.passOp = VK_STENCIL_OP_KEEP;
- ds.back.compareOp = VK_COMPARE_OP_ALWAYS;
- ds.stencilTestEnable = VK_FALSE;
- ds.front = ds.back;
-
- memset(&ms, 0, sizeof(ms));
- ms.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
- ms.pSampleMask = NULL;
- ms.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
-
- // Two stages: vs and fs
- pipeline.stageCount = 2;
- VkPipelineShaderStageCreateInfo shaderStages[2];
- memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
-
- shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
- shaderStages[0].module = demo_prepare_vs(demo);
- shaderStages[0].pName = "main";
-
- shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
- shaderStages[1].module = demo_prepare_fs(demo);
- shaderStages[1].pName = "main";
-
- pipeline.pVertexInputState = &vi;
- pipeline.pInputAssemblyState = &ia;
- pipeline.pRasterizationState = &rs;
- pipeline.pColorBlendState = &cb;
- pipeline.pMultisampleState = &ms;
- pipeline.pViewportState = &vp;
- pipeline.pDepthStencilState = &ds;
- pipeline.pStages = shaderStages;
- pipeline.renderPass = demo->render_pass;
- pipeline.pDynamicState = &dynamicState;
-
- memset(&pipelineCache, 0, sizeof(pipelineCache));
- pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
-
- err = vkCreatePipelineCache(demo->device, &pipelineCache, NULL,
- &demo->pipelineCache);
- assert(!err);
- err = vkCreateGraphicsPipelines(demo->device, demo->pipelineCache, 1,
- &pipeline, NULL, &demo->pipeline);
- assert(!err);
-
- vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL);
-
- vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL);
- vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL);
-}
-
-static void demo_prepare_descriptor_pool(struct demo *demo) {
- const VkDescriptorPoolSize type_count = {
- .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- .descriptorCount = DEMO_TEXTURE_COUNT,
- };
- const VkDescriptorPoolCreateInfo descriptor_pool = {
- .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
- .pNext = NULL,
- .maxSets = 1,
- .poolSizeCount = 1,
- .pPoolSizes = &type_count,
- };
- VkResult U_ASSERT_ONLY err;
-
- err = vkCreateDescriptorPool(demo->device, &descriptor_pool, NULL,
- &demo->desc_pool);
- assert(!err);
-}
-
-static void demo_prepare_descriptor_set(struct demo *demo) {
- VkDescriptorImageInfo tex_descs[DEMO_TEXTURE_COUNT];
- VkWriteDescriptorSet write;
- VkResult U_ASSERT_ONLY err;
- uint32_t i;
-
- VkDescriptorSetAllocateInfo alloc_info = {
- .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
- .pNext = NULL,
- .descriptorPool = demo->desc_pool,
- .descriptorSetCount = 1,
- .pSetLayouts = &demo->desc_layout};
- err = vkAllocateDescriptorSets(demo->device, &alloc_info, &demo->desc_set);
- assert(!err);
-
- memset(&tex_descs, 0, sizeof(tex_descs));
- for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
- tex_descs[i].sampler = demo->textures[i].sampler;
- tex_descs[i].imageView = demo->textures[i].view;
- tex_descs[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
- }
-
- memset(&write, 0, sizeof(write));
- write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- write.dstSet = demo->desc_set;
- write.descriptorCount = DEMO_TEXTURE_COUNT;
- write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- write.pImageInfo = tex_descs;
-
- vkUpdateDescriptorSets(demo->device, 1, &write, 0, NULL);
-}
-
-static void demo_prepare_framebuffers(struct demo *demo) {
- VkImageView attachments[2];
- attachments[1] = demo->depth.view;
-
- const VkFramebufferCreateInfo fb_info = {
- .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
- .pNext = NULL,
- .renderPass = demo->render_pass,
- .attachmentCount = 2,
- .pAttachments = attachments,
- .width = demo->width,
- .height = demo->height,
- .layers = 1,
- };
- VkResult U_ASSERT_ONLY err;
- uint32_t i;
-
- demo->framebuffers = (VkFramebuffer *)malloc(demo->swapchainImageCount *
- sizeof(VkFramebuffer));
- assert(demo->framebuffers);
-
- for (i = 0; i < demo->swapchainImageCount; i++) {
- attachments[0] = demo->buffers[i].view;
- err = vkCreateFramebuffer(demo->device, &fb_info, NULL,
- &demo->framebuffers[i]);
- assert(!err);
- }
-}
-
-static void demo_prepare(struct demo *demo) {
- VkResult U_ASSERT_ONLY err;
-
- const VkCommandPoolCreateInfo cmd_pool_info = {
- .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
- .pNext = NULL,
- .queueFamilyIndex = demo->graphics_queue_node_index,
- .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
- };
- err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL,
- &demo->cmd_pool);
- assert(!err);
-
- const VkCommandBufferAllocateInfo cmd = {
- .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
- .pNext = NULL,
- .commandPool = demo->cmd_pool,
- .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
- .commandBufferCount = 1,
- };
- err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->draw_cmd);
- assert(!err);
-
- demo_prepare_buffers(demo);
- demo_prepare_depth(demo);
- demo_prepare_textures(demo);
- demo_prepare_vertices(demo);
- demo_prepare_descriptor_layout(demo);
- demo_prepare_render_pass(demo);
- demo_prepare_pipeline(demo);
-
- demo_prepare_descriptor_pool(demo);
- demo_prepare_descriptor_set(demo);
-
- demo_prepare_framebuffers(demo);
-}
-
-static void demo_error_callback(int error, const char* description) {
- printf("GLFW error: %s\n", description);
- fflush(stdout);
-}
-
-static void demo_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
- if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE)
- glfwSetWindowShouldClose(window, GLFW_TRUE);
-}
-
-static void demo_refresh_callback(GLFWwindow* window) {
- struct demo* demo = glfwGetWindowUserPointer(window);
- demo_draw(demo);
-}
-
-static void demo_resize_callback(GLFWwindow* window, int width, int height) {
- struct demo* demo = glfwGetWindowUserPointer(window);
- demo->width = width;
- demo->height = height;
- demo_resize(demo);
-}
-
-static void demo_run(struct demo *demo) {
- while (!glfwWindowShouldClose(demo->window)) {
- glfwPollEvents();
-
- demo_draw(demo);
-
- if (demo->depthStencil > 0.99f)
- demo->depthIncrement = -0.001f;
- if (demo->depthStencil < 0.8f)
- demo->depthIncrement = 0.001f;
-
- demo->depthStencil += demo->depthIncrement;
-
- // Wait for work to finish before updating MVP.
- vkDeviceWaitIdle(demo->device);
- demo->curFrame++;
- if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount)
- glfwSetWindowShouldClose(demo->window, GLFW_TRUE);
- }
-}
-
-static void demo_create_window(struct demo *demo) {
- glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
-
- demo->window = glfwCreateWindow(demo->width,
- demo->height,
- APP_LONG_NAME,
- NULL,
- NULL);
- if (!demo->window) {
- // It didn't work, so try to give a useful error:
- printf("Cannot create a window in which to draw!\n");
- fflush(stdout);
- exit(1);
- }
-
- glfwSetWindowUserPointer(demo->window, demo);
- glfwSetWindowRefreshCallback(demo->window, demo_refresh_callback);
- glfwSetFramebufferSizeCallback(demo->window, demo_resize_callback);
- glfwSetKeyCallback(demo->window, demo_key_callback);
-}
-
-/*
- * Return 1 (true) if all layer names specified in check_names
- * can be found in given layer properties.
- */
-static VkBool32 demo_check_layers(uint32_t check_count, const char **check_names,
- uint32_t layer_count,
- VkLayerProperties *layers) {
- uint32_t i, j;
- for (i = 0; i < check_count; i++) {
- VkBool32 found = 0;
- for (j = 0; j < layer_count; j++) {
- if (!strcmp(check_names[i], layers[j].layerName)) {
- found = 1;
- break;
- }
- }
- if (!found) {
- fprintf(stderr, "Cannot find layer: %s\n", check_names[i]);
- return 0;
- }
- }
- return 1;
-}
-
-static void demo_init_vk(struct demo *demo) {
- VkResult err;
- uint32_t i = 0;
- uint32_t required_extension_count = 0;
- uint32_t instance_extension_count = 0;
- uint32_t instance_layer_count = 0;
- uint32_t validation_layer_count = 0;
- const char **required_extensions = NULL;
- const char **instance_validation_layers = NULL;
- demo->enabled_extension_count = 0;
- demo->enabled_layer_count = 0;
-
- char *instance_validation_layers_alt1[] = {
- "VK_LAYER_LUNARG_standard_validation"
- };
-
- char *instance_validation_layers_alt2[] = {
- "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation",
- "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_image",
- "VK_LAYER_LUNARG_core_validation", "VK_LAYER_LUNARG_swapchain",
- "VK_LAYER_GOOGLE_unique_objects"
- };
-
- /* Look for validation layers */
- VkBool32 validation_found = 0;
- if (demo->validate) {
-
- err = vkEnumerateInstanceLayerProperties(&instance_layer_count, NULL);
- assert(!err);
-
- instance_validation_layers = (const char**) instance_validation_layers_alt1;
- if (instance_layer_count > 0) {
- VkLayerProperties *instance_layers =
- malloc(sizeof (VkLayerProperties) * instance_layer_count);
- err = vkEnumerateInstanceLayerProperties(&instance_layer_count,
- instance_layers);
- assert(!err);
-
-
- validation_found = demo_check_layers(
- ARRAY_SIZE(instance_validation_layers_alt1),
- instance_validation_layers, instance_layer_count,
- instance_layers);
- if (validation_found) {
- demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt1);
- demo->enabled_layers[0] = "VK_LAYER_LUNARG_standard_validation";
- validation_layer_count = 1;
- } else {
- // use alternative set of validation layers
- instance_validation_layers =
- (const char**) instance_validation_layers_alt2;
- demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt2);
- validation_found = demo_check_layers(
- ARRAY_SIZE(instance_validation_layers_alt2),
- instance_validation_layers, instance_layer_count,
- instance_layers);
- validation_layer_count =
- ARRAY_SIZE(instance_validation_layers_alt2);
- for (i = 0; i < validation_layer_count; i++) {
- demo->enabled_layers[i] = instance_validation_layers[i];
- }
- }
- free(instance_layers);
- }
-
- if (!validation_found) {
- ERR_EXIT("vkEnumerateInstanceLayerProperties failed to find "
- "required validation layer.\n\n"
- "Please look at the Getting Started guide for additional "
- "information.\n",
- "vkCreateInstance Failure");
- }
- }
-
- /* Look for instance extensions */
- required_extensions = glfwGetRequiredInstanceExtensions(&required_extension_count);
- if (!required_extensions) {
- ERR_EXIT("glfwGetRequiredInstanceExtensions failed to find the "
- "platform surface extensions.\n\nDo you have a compatible "
- "Vulkan installable client driver (ICD) installed?\nPlease "
- "look at the Getting Started guide for additional "
- "information.\n",
- "vkCreateInstance Failure");
- }
-
- for (i = 0; i < required_extension_count; i++) {
- demo->extension_names[demo->enabled_extension_count++] = required_extensions[i];
- assert(demo->enabled_extension_count < 64);
- }
-
- err = vkEnumerateInstanceExtensionProperties(
- NULL, &instance_extension_count, NULL);
- assert(!err);
-
- if (instance_extension_count > 0) {
- VkExtensionProperties *instance_extensions =
- malloc(sizeof(VkExtensionProperties) * instance_extension_count);
- err = vkEnumerateInstanceExtensionProperties(
- NULL, &instance_extension_count, instance_extensions);
- assert(!err);
- for (i = 0; i < instance_extension_count; i++) {
- if (!strcmp(VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
- instance_extensions[i].extensionName)) {
- if (demo->validate) {
- demo->extension_names[demo->enabled_extension_count++] =
- VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
- }
- }
- assert(demo->enabled_extension_count < 64);
- }
-
- free(instance_extensions);
- }
-
- const VkApplicationInfo app = {
- .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
- .pNext = NULL,
- .pApplicationName = APP_SHORT_NAME,
- .applicationVersion = 0,
- .pEngineName = APP_SHORT_NAME,
- .engineVersion = 0,
- .apiVersion = VK_API_VERSION_1_0,
- };
- VkInstanceCreateInfo inst_info = {
- .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
- .pNext = NULL,
- .pApplicationInfo = &app,
- .enabledLayerCount = demo->enabled_layer_count,
- .ppEnabledLayerNames = (const char *const *)instance_validation_layers,
- .enabledExtensionCount = demo->enabled_extension_count,
- .ppEnabledExtensionNames = (const char *const *)demo->extension_names,
- };
-
- uint32_t gpu_count;
-
- err = vkCreateInstance(&inst_info, NULL, &demo->inst);
- if (err == VK_ERROR_INCOMPATIBLE_DRIVER) {
- ERR_EXIT("Cannot find a compatible Vulkan installable client driver "
- "(ICD).\n\nPlease look at the Getting Started guide for "
- "additional information.\n",
- "vkCreateInstance Failure");
- } else if (err == VK_ERROR_EXTENSION_NOT_PRESENT) {
- ERR_EXIT("Cannot find a specified extension library"
- ".\nMake sure your layers path is set appropriately\n",
- "vkCreateInstance Failure");
- } else if (err) {
- ERR_EXIT("vkCreateInstance failed.\n\nDo you have a compatible Vulkan "
- "installable client driver (ICD) installed?\nPlease look at "
- "the Getting Started guide for additional information.\n",
- "vkCreateInstance Failure");
- }
-
- gladLoadVulkanUserPtr(NULL, (GLADuserptrloadfunc) glfwGetInstanceProcAddress, demo->inst);
-
- /* Make initial call to query gpu_count, then second call for gpu info*/
- err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, NULL);
- assert(!err && gpu_count > 0);
-
- if (gpu_count > 0) {
- VkPhysicalDevice *physical_devices =
- malloc(sizeof(VkPhysicalDevice) * gpu_count);
- err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count,
- physical_devices);
- assert(!err);
- /* For tri demo we just grab the first physical device */
- demo->gpu = physical_devices[0];
- free(physical_devices);
- } else {
- ERR_EXIT("vkEnumeratePhysicalDevices reported zero accessible devices."
- "\n\nDo you have a compatible Vulkan installable client"
- " driver (ICD) installed?\nPlease look at the Getting Started"
- " guide for additional information.\n",
- "vkEnumeratePhysicalDevices Failure");
- }
-
- gladLoadVulkanUserPtr(demo->gpu, (GLADuserptrloadfunc) glfwGetInstanceProcAddress, demo->inst);
-
- /* Look for device extensions */
- uint32_t device_extension_count = 0;
- VkBool32 swapchainExtFound = 0;
- demo->enabled_extension_count = 0;
-
- err = vkEnumerateDeviceExtensionProperties(demo->gpu, NULL,
- &device_extension_count, NULL);
- assert(!err);
-
- if (device_extension_count > 0) {
- VkExtensionProperties *device_extensions =
- malloc(sizeof(VkExtensionProperties) * device_extension_count);
- err = vkEnumerateDeviceExtensionProperties(
- demo->gpu, NULL, &device_extension_count, device_extensions);
- assert(!err);
-
- for (i = 0; i < device_extension_count; i++) {
- if (!strcmp(VK_KHR_SWAPCHAIN_EXTENSION_NAME,
- device_extensions[i].extensionName)) {
- swapchainExtFound = 1;
- demo->extension_names[demo->enabled_extension_count++] =
- VK_KHR_SWAPCHAIN_EXTENSION_NAME;
- }
- assert(demo->enabled_extension_count < 64);
- }
-
- free(device_extensions);
- }
-
- if (!swapchainExtFound) {
- ERR_EXIT("vkEnumerateDeviceExtensionProperties failed to find "
- "the " VK_KHR_SWAPCHAIN_EXTENSION_NAME
- " extension.\n\nDo you have a compatible "
- "Vulkan installable client driver (ICD) installed?\nPlease "
- "look at the Getting Started guide for additional "
- "information.\n",
- "vkCreateInstance Failure");
- }
-
- if (demo->validate) {
- VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
- dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
- dbgCreateInfo.flags =
- VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
- dbgCreateInfo.pfnCallback = demo->use_break ? BreakCallback : dbgFunc;
- dbgCreateInfo.pUserData = demo;
- dbgCreateInfo.pNext = NULL;
- err = vkCreateDebugReportCallbackEXT(demo->inst, &dbgCreateInfo, NULL,
- &demo->msg_callback);
- switch (err) {
- case VK_SUCCESS:
- break;
- case VK_ERROR_OUT_OF_HOST_MEMORY:
- ERR_EXIT("CreateDebugReportCallback: out of host memory\n",
- "CreateDebugReportCallback Failure");
- break;
- default:
- ERR_EXIT("CreateDebugReportCallback: unknown failure\n",
- "CreateDebugReportCallback Failure");
- break;
- }
- }
-
- vkGetPhysicalDeviceProperties(demo->gpu, &demo->gpu_props);
-
- // Query with NULL data to get count
- vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, &demo->queue_count,
- NULL);
-
- demo->queue_props = (VkQueueFamilyProperties *)malloc(
- demo->queue_count * sizeof(VkQueueFamilyProperties));
- vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, &demo->queue_count,
- demo->queue_props);
- assert(demo->queue_count >= 1);
-
- vkGetPhysicalDeviceFeatures(demo->gpu, &demo->gpu_features);
-
- // Graphics queue and MemMgr queue can be separate.
- // TODO: Add support for separate queues, including synchronization,
- // and appropriate tracking for QueueSubmit
-}
-
-static void demo_init_device(struct demo *demo) {
- VkResult U_ASSERT_ONLY err;
-
- float queue_priorities[1] = {0.0};
- const VkDeviceQueueCreateInfo queue = {
- .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
- .pNext = NULL,
- .queueFamilyIndex = demo->graphics_queue_node_index,
- .queueCount = 1,
- .pQueuePriorities = queue_priorities};
-
-
- VkPhysicalDeviceFeatures features;
- memset(&features, 0, sizeof(features));
- if (demo->gpu_features.shaderClipDistance) {
- features.shaderClipDistance = VK_TRUE;
- }
-
- VkDeviceCreateInfo device = {
- .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
- .pNext = NULL,
- .queueCreateInfoCount = 1,
- .pQueueCreateInfos = &queue,
- .enabledLayerCount = 0,
- .ppEnabledLayerNames = NULL,
- .enabledExtensionCount = demo->enabled_extension_count,
- .ppEnabledExtensionNames = (const char *const *)demo->extension_names,
- .pEnabledFeatures = &features,
- };
-
- err = vkCreateDevice(demo->gpu, &device, NULL, &demo->device);
- assert(!err);
-}
-
-static void demo_init_vk_swapchain(struct demo *demo) {
- VkResult U_ASSERT_ONLY err;
- uint32_t i;
-
- // Create a WSI surface for the window:
- glfwCreateWindowSurface(demo->inst, demo->window, NULL, &demo->surface);
-
- // Iterate over each queue to learn whether it supports presenting:
- VkBool32 *supportsPresent =
- (VkBool32 *)malloc(demo->queue_count * sizeof(VkBool32));
- for (i = 0; i < demo->queue_count; i++) {
- vkGetPhysicalDeviceSurfaceSupportKHR(demo->gpu, i, demo->surface,
- &supportsPresent[i]);
- }
-
- // Search for a graphics and a present queue in the array of queue
- // families, try to find one that supports both
- uint32_t graphicsQueueNodeIndex = UINT32_MAX;
- uint32_t presentQueueNodeIndex = UINT32_MAX;
- for (i = 0; i < demo->queue_count; i++) {
- if ((demo->queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) {
- if (graphicsQueueNodeIndex == UINT32_MAX) {
- graphicsQueueNodeIndex = i;
- }
-
- if (supportsPresent[i] == VK_TRUE) {
- graphicsQueueNodeIndex = i;
- presentQueueNodeIndex = i;
- break;
- }
- }
- }
- if (presentQueueNodeIndex == UINT32_MAX) {
- // If didn't find a queue that supports both graphics and present, then
- // find a separate present queue.
- for (i = 0; i < demo->queue_count; ++i) {
- if (supportsPresent[i] == VK_TRUE) {
- presentQueueNodeIndex = i;
- break;
- }
- }
- }
- free(supportsPresent);
-
- // Generate error if could not find both a graphics and a present queue
- if (graphicsQueueNodeIndex == UINT32_MAX ||
- presentQueueNodeIndex == UINT32_MAX) {
- ERR_EXIT("Could not find a graphics and a present queue\n",
- "Swapchain Initialization Failure");
- }
-
- // TODO: Add support for separate queues, including presentation,
- // synchronization, and appropriate tracking for QueueSubmit.
- // NOTE: While it is possible for an application to use a separate graphics
- // and a present queues, this demo program assumes it is only using
- // one:
- if (graphicsQueueNodeIndex != presentQueueNodeIndex) {
- ERR_EXIT("Could not find a common graphics and a present queue\n",
- "Swapchain Initialization Failure");
- }
-
- demo->graphics_queue_node_index = graphicsQueueNodeIndex;
-
- demo_init_device(demo);
-
- vkGetDeviceQueue(demo->device, demo->graphics_queue_node_index, 0,
- &demo->queue);
-
- // Get the list of VkFormat's that are supported:
- uint32_t formatCount;
- err = vkGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface,
- &formatCount, NULL);
- assert(!err);
- VkSurfaceFormatKHR *surfFormats =
- (VkSurfaceFormatKHR *)malloc(formatCount * sizeof(VkSurfaceFormatKHR));
- err = vkGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface,
- &formatCount, surfFormats);
- assert(!err);
- // If the format list includes just one entry of VK_FORMAT_UNDEFINED,
- // the surface has no preferred format. Otherwise, at least one
- // supported format will be returned.
- if (formatCount == 1 && surfFormats[0].format == VK_FORMAT_UNDEFINED) {
- demo->format = VK_FORMAT_B8G8R8A8_UNORM;
- } else {
- assert(formatCount >= 1);
- demo->format = surfFormats[0].format;
- }
- demo->color_space = surfFormats[0].colorSpace;
-
- demo->curFrame = 0;
-
- // Get Memory information and properties
- vkGetPhysicalDeviceMemoryProperties(demo->gpu, &demo->memory_properties);
-}
-
-static void demo_init_connection(struct demo *demo) {
- glfwSetErrorCallback(demo_error_callback);
-
- if (!glfwInit()) {
- printf("Cannot initialize GLFW.\nExiting ...\n");
- fflush(stdout);
- exit(1);
- }
-
- if (!glfwVulkanSupported()) {
- printf("GLFW failed to find the Vulkan loader.\nExiting ...\n");
- fflush(stdout);
- exit(1);
- }
-
- gladLoadVulkanUserPtr(NULL, (GLADuserptrloadfunc) glfwGetInstanceProcAddress, NULL);
-}
-
-static void demo_init(struct demo *demo, const int argc, const char *argv[])
-{
- int i;
- memset(demo, 0, sizeof(*demo));
- demo->frameCount = INT32_MAX;
-
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "--use_staging") == 0) {
- demo->use_staging_buffer = true;
- continue;
- }
- if (strcmp(argv[i], "--break") == 0) {
- demo->use_break = true;
- continue;
- }
- if (strcmp(argv[i], "--validate") == 0) {
- demo->validate = true;
- continue;
- }
- if (strcmp(argv[i], "--c") == 0 && demo->frameCount == INT32_MAX &&
- i < argc - 1 && sscanf(argv[i + 1], "%d", &demo->frameCount) == 1 &&
- demo->frameCount >= 0) {
- i++;
- continue;
- }
-
- fprintf(stderr, "Usage:\n %s [--use_staging] [--validate] [--break] "
- "[--c <framecount>]\n",
- APP_SHORT_NAME);
- fflush(stderr);
- exit(1);
- }
-
- demo_init_connection(demo);
- demo_init_vk(demo);
-
- demo->width = 300;
- demo->height = 300;
- demo->depthStencil = 1.0;
- demo->depthIncrement = -0.01f;
-}
-
-static void demo_cleanup(struct demo *demo) {
- uint32_t i;
-
- for (i = 0; i < demo->swapchainImageCount; i++) {
- vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);
- }
- free(demo->framebuffers);
- vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);
-
- if (demo->setup_cmd) {
- vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->setup_cmd);
- }
- vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->draw_cmd);
- vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);
-
- vkDestroyPipeline(demo->device, demo->pipeline, NULL);
- vkDestroyRenderPass(demo->device, demo->render_pass, NULL);
- vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);
- vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);
-
- vkDestroyBuffer(demo->device, demo->vertices.buf, NULL);
- vkFreeMemory(demo->device, demo->vertices.mem, NULL);
-
- for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
- vkDestroyImageView(demo->device, demo->textures[i].view, NULL);
- vkDestroyImage(demo->device, demo->textures[i].image, NULL);
- vkFreeMemory(demo->device, demo->textures[i].mem, NULL);
- vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);
- }
-
- for (i = 0; i < demo->swapchainImageCount; i++) {
- vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);
- }
-
- vkDestroyImageView(demo->device, demo->depth.view, NULL);
- vkDestroyImage(demo->device, demo->depth.image, NULL);
- vkFreeMemory(demo->device, demo->depth.mem, NULL);
-
- vkDestroySwapchainKHR(demo->device, demo->swapchain, NULL);
- free(demo->buffers);
-
- vkDestroyDevice(demo->device, NULL);
- if (demo->validate) {
- vkDestroyDebugReportCallbackEXT(demo->inst, demo->msg_callback, NULL);
- }
- vkDestroySurfaceKHR(demo->inst, demo->surface, NULL);
- vkDestroyInstance(demo->inst, NULL);
-
- free(demo->queue_props);
-
- glfwDestroyWindow(demo->window);
- glfwTerminate();
-}
-
-static void demo_resize(struct demo *demo) {
- uint32_t i;
-
- // In order to properly resize the window, we must re-create the swapchain
- // AND redo the command buffers, etc.
- //
- // First, perform part of the demo_cleanup() function:
-
- for (i = 0; i < demo->swapchainImageCount; i++) {
- vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);
- }
- free(demo->framebuffers);
- vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);
-
- if (demo->setup_cmd) {
- vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->setup_cmd);
- demo->setup_cmd = VK_NULL_HANDLE;
- }
- vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->draw_cmd);
- vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);
-
- vkDestroyPipeline(demo->device, demo->pipeline, NULL);
- vkDestroyRenderPass(demo->device, demo->render_pass, NULL);
- vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);
- vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);
-
- vkDestroyBuffer(demo->device, demo->vertices.buf, NULL);
- vkFreeMemory(demo->device, demo->vertices.mem, NULL);
-
- for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
- vkDestroyImageView(demo->device, demo->textures[i].view, NULL);
- vkDestroyImage(demo->device, demo->textures[i].image, NULL);
- vkFreeMemory(demo->device, demo->textures[i].mem, NULL);
- vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);
- }
-
- for (i = 0; i < demo->swapchainImageCount; i++) {
- vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);
- }
-
- vkDestroyImageView(demo->device, demo->depth.view, NULL);
- vkDestroyImage(demo->device, demo->depth.image, NULL);
- vkFreeMemory(demo->device, demo->depth.mem, NULL);
-
- free(demo->buffers);
-
- // Second, re-perform the demo_prepare() function, which will re-create the
- // swapchain:
- demo_prepare(demo);
-}
-
-int main(const int argc, const char *argv[]) {
- struct demo demo;
-
- demo_init(&demo, argc, argv);
- demo_create_window(&demo);
- demo_init_vk_swapchain(&demo);
-
- demo_prepare(&demo);
- demo_run(&demo);
-
- demo_cleanup(&demo);
-
- return validation_error;
-}
-
diff --git a/3rdparty/glfw/source/tests/window.c b/3rdparty/glfw/source/tests/window.c
deleted file mode 100644
index 83baff4..0000000
--- a/3rdparty/glfw/source/tests/window.c
+++ /dev/null
@@ -1,428 +0,0 @@
-//========================================================================
-// Window properties test
-// Copyright (c) Camilla Löwy <[email protected]>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would
-// be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-// be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-// distribution.
-//
-//========================================================================
-
-#define GLAD_GL_IMPLEMENTATION
-#include <glad/gl.h>
-#define GLFW_INCLUDE_NONE
-#include <GLFW/glfw3.h>
-
-#include <stdarg.h>
-
-#define NK_IMPLEMENTATION
-#define NK_INCLUDE_FIXED_TYPES
-#define NK_INCLUDE_FONT_BAKING
-#define NK_INCLUDE_DEFAULT_FONT
-#define NK_INCLUDE_DEFAULT_ALLOCATOR
-#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
-#define NK_INCLUDE_STANDARD_VARARGS
-#define NK_BUTTON_TRIGGER_ON_RELEASE
-#include <nuklear.h>
-
-#define NK_GLFW_GL2_IMPLEMENTATION
-#include <nuklear_glfw_gl2.h>
-
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-
-int main(int argc, char** argv)
-{
- int windowed_x, windowed_y, windowed_width, windowed_height;
- int last_xpos = INT_MIN, last_ypos = INT_MIN;
- int last_width = INT_MIN, last_height = INT_MIN;
- int limit_aspect_ratio = false, aspect_numer = 1, aspect_denom = 1;
- int limit_min_size = false, min_width = 400, min_height = 400;
- int limit_max_size = false, max_width = 400, max_height = 400;
- char width_buffer[12] = "", height_buffer[12] = "";
- char xpos_buffer[12] = "", ypos_buffer[12] = "";
- char numer_buffer[12] = "", denom_buffer[12] = "";
- char min_width_buffer[12] = "", min_height_buffer[12] = "";
- char max_width_buffer[12] = "", max_height_buffer[12] = "";
- int may_close = true;
-
- if (!glfwInit())
- exit(EXIT_FAILURE);
-
- glfwWindowHint(GLFW_SCALE_TO_MONITOR, GLFW_TRUE);
- glfwWindowHint(GLFW_WIN32_KEYBOARD_MENU, GLFW_TRUE);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
-
- GLFWwindow* window = glfwCreateWindow(600, 600, "Window Features", NULL, NULL);
- if (!window)
- {
- glfwTerminate();
- exit(EXIT_FAILURE);
- }
-
- glfwMakeContextCurrent(window);
- gladLoadGL(glfwGetProcAddress);
- glfwSwapInterval(0);
-
- bool position_supported = true;
-
- glfwGetError(NULL);
- glfwGetWindowPos(window, &last_xpos, &last_ypos);
- sprintf(xpos_buffer, "%i", last_xpos);
- sprintf(ypos_buffer, "%i", last_ypos);
- if (glfwGetError(NULL) == GLFW_FEATURE_UNAVAILABLE)
- position_supported = false;
-
- glfwGetWindowSize(window, &last_width, &last_height);
- sprintf(width_buffer, "%i", last_width);
- sprintf(height_buffer, "%i", last_height);
-
- sprintf(numer_buffer, "%i", aspect_numer);
- sprintf(denom_buffer, "%i", aspect_denom);
-
- sprintf(min_width_buffer, "%i", min_width);
- sprintf(min_height_buffer, "%i", min_height);
- sprintf(max_width_buffer, "%i", max_width);
- sprintf(max_height_buffer, "%i", max_height);
-
- struct nk_context* nk = nk_glfw3_init(window, NK_GLFW3_INSTALL_CALLBACKS);
-
- struct nk_font_atlas* atlas;
- nk_glfw3_font_stash_begin(&atlas);
- nk_glfw3_font_stash_end();
-
- while (!(may_close && glfwWindowShouldClose(window)))
- {
- int width, height;
-
- glfwGetWindowSize(window, &width, &height);
-
- struct nk_rect area = nk_rect(0.f, 0.f, (float) width, (float) height);
- nk_window_set_bounds(nk, "main", area);
-
- nk_glfw3_new_frame();
- if (nk_begin(nk, "main", area, 0))
- {
- nk_layout_row_dynamic(nk, 30, 5);
-
- if (nk_button_label(nk, "Toggle Fullscreen"))
- {
- if (glfwGetWindowMonitor(window))
- {
- glfwSetWindowMonitor(window, NULL,
- windowed_x, windowed_y,
- windowed_width, windowed_height, 0);
- }
- else
- {
- GLFWmonitor* monitor = glfwGetPrimaryMonitor();
- const GLFWvidmode* mode = glfwGetVideoMode(monitor);
- glfwGetWindowPos(window, &windowed_x, &windowed_y);
- glfwGetWindowSize(window, &windowed_width, &windowed_height);
- glfwSetWindowMonitor(window, monitor,
- 0, 0, mode->width, mode->height,
- mode->refreshRate);
- }
- }
-
- if (nk_button_label(nk, "Maximize"))
- glfwMaximizeWindow(window);
- if (nk_button_label(nk, "Iconify"))
- glfwIconifyWindow(window);
- if (nk_button_label(nk, "Restore"))
- glfwRestoreWindow(window);
- if (nk_button_label(nk, "Hide (briefly)"))
- {
- glfwHideWindow(window);
-
- const double time = glfwGetTime() + 3.0;
- while (glfwGetTime() < time)
- glfwWaitEventsTimeout(1.0);
-
- glfwShowWindow(window);
- }
-
- nk_layout_row_dynamic(nk, 30, 1);
-
- if (glfwGetWindowAttrib(window, GLFW_MOUSE_PASSTHROUGH))
- {
- nk_label(nk, "Press H to disable mouse passthrough", NK_TEXT_CENTERED);
-
- if (glfwGetKey(window, GLFW_KEY_H))
- glfwSetWindowAttrib(window, GLFW_MOUSE_PASSTHROUGH, false);
- }
-
- nk_label(nk, "Press Enter in a text field to set value", NK_TEXT_CENTERED);
-
- nk_flags events;
- const nk_flags flags = NK_EDIT_FIELD |
- NK_EDIT_SIG_ENTER |
- NK_EDIT_GOTO_END_ON_ACTIVATE;
-
- if (position_supported)
- {
- int xpos, ypos;
- glfwGetWindowPos(window, &xpos, &ypos);
-
- nk_layout_row_dynamic(nk, 30, 3);
- nk_label(nk, "Position", NK_TEXT_LEFT);
-
- events = nk_edit_string_zero_terminated(nk, flags, xpos_buffer,
- sizeof(xpos_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- xpos = atoi(xpos_buffer);
- glfwSetWindowPos(window, xpos, ypos);
- }
- else if (xpos != last_xpos || (events & NK_EDIT_DEACTIVATED))
- sprintf(xpos_buffer, "%i", xpos);
-
- events = nk_edit_string_zero_terminated(nk, flags, ypos_buffer,
- sizeof(ypos_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- ypos = atoi(ypos_buffer);
- glfwSetWindowPos(window, xpos, ypos);
- }
- else if (ypos != last_ypos || (events & NK_EDIT_DEACTIVATED))
- sprintf(ypos_buffer, "%i", ypos);
-
- last_xpos = xpos;
- last_ypos = ypos;
- }
- else
- nk_label(nk, "Position not supported", NK_TEXT_LEFT);
-
- nk_layout_row_dynamic(nk, 30, 3);
- nk_label(nk, "Size", NK_TEXT_LEFT);
-
- events = nk_edit_string_zero_terminated(nk, flags, width_buffer,
- sizeof(width_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- width = atoi(width_buffer);
- glfwSetWindowSize(window, width, height);
- }
- else if (width != last_width || (events & NK_EDIT_DEACTIVATED))
- sprintf(width_buffer, "%i", width);
-
- events = nk_edit_string_zero_terminated(nk, flags, height_buffer,
- sizeof(height_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- height = atoi(height_buffer);
- glfwSetWindowSize(window, width, height);
- }
- else if (height != last_height || (events & NK_EDIT_DEACTIVATED))
- sprintf(height_buffer, "%i", height);
-
- last_width = width;
- last_height = height;
-
- bool update_ratio_limit = false;
- if (nk_checkbox_label(nk, "Aspect Ratio", &limit_aspect_ratio))
- update_ratio_limit = true;
-
- events = nk_edit_string_zero_terminated(nk, flags, numer_buffer,
- sizeof(numer_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- aspect_numer = abs(atoi(numer_buffer));
- update_ratio_limit = true;
- }
- else if (events & NK_EDIT_DEACTIVATED)
- sprintf(numer_buffer, "%i", aspect_numer);
-
- events = nk_edit_string_zero_terminated(nk, flags, denom_buffer,
- sizeof(denom_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- aspect_denom = abs(atoi(denom_buffer));
- update_ratio_limit = true;
- }
- else if (events & NK_EDIT_DEACTIVATED)
- sprintf(denom_buffer, "%i", aspect_denom);
-
- if (update_ratio_limit)
- {
- if (limit_aspect_ratio)
- glfwSetWindowAspectRatio(window, aspect_numer, aspect_denom);
- else
- glfwSetWindowAspectRatio(window, GLFW_DONT_CARE, GLFW_DONT_CARE);
- }
-
- bool update_size_limit = false;
-
- if (nk_checkbox_label(nk, "Minimum Size", &limit_min_size))
- update_size_limit = true;
-
- events = nk_edit_string_zero_terminated(nk, flags, min_width_buffer,
- sizeof(min_width_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- min_width = abs(atoi(min_width_buffer));
- update_size_limit = true;
- }
- else if (events & NK_EDIT_DEACTIVATED)
- sprintf(min_width_buffer, "%i", min_width);
-
- events = nk_edit_string_zero_terminated(nk, flags, min_height_buffer,
- sizeof(min_height_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- min_height = abs(atoi(min_height_buffer));
- update_size_limit = true;
- }
- else if (events & NK_EDIT_DEACTIVATED)
- sprintf(min_height_buffer, "%i", min_height);
-
- if (nk_checkbox_label(nk, "Maximum Size", &limit_max_size))
- update_size_limit = true;
-
- events = nk_edit_string_zero_terminated(nk, flags, max_width_buffer,
- sizeof(max_width_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- max_width = abs(atoi(max_width_buffer));
- update_size_limit = true;
- }
- else if (events & NK_EDIT_DEACTIVATED)
- sprintf(max_width_buffer, "%i", max_width);
-
- events = nk_edit_string_zero_terminated(nk, flags, max_height_buffer,
- sizeof(max_height_buffer),
- nk_filter_decimal);
- if (events & NK_EDIT_COMMITED)
- {
- max_height = abs(atoi(max_height_buffer));
- update_size_limit = true;
- }
- else if (events & NK_EDIT_DEACTIVATED)
- sprintf(max_height_buffer, "%i", max_height);
-
- if (update_size_limit)
- {
- glfwSetWindowSizeLimits(window,
- limit_min_size ? min_width : GLFW_DONT_CARE,
- limit_min_size ? min_height : GLFW_DONT_CARE,
- limit_max_size ? max_width : GLFW_DONT_CARE,
- limit_max_size ? max_height : GLFW_DONT_CARE);
- }
-
- int fb_width, fb_height;
- glfwGetFramebufferSize(window, &fb_width, &fb_height);
- nk_label(nk, "Framebuffer Size", NK_TEXT_LEFT);
- nk_labelf(nk, NK_TEXT_LEFT, "%i", fb_width);
- nk_labelf(nk, NK_TEXT_LEFT, "%i", fb_height);
-
- float xscale, yscale;
- glfwGetWindowContentScale(window, &xscale, &yscale);
- nk_label(nk, "Content Scale", NK_TEXT_LEFT);
- nk_labelf(nk, NK_TEXT_LEFT, "%f", xscale);
- nk_labelf(nk, NK_TEXT_LEFT, "%f", yscale);
-
- nk_layout_row_begin(nk, NK_DYNAMIC, 30, 5);
- int frame_left, frame_top, frame_right, frame_bottom;
- glfwGetWindowFrameSize(window, &frame_left, &frame_top, &frame_right, &frame_bottom);
- nk_layout_row_push(nk, 1.f / 3.f);
- nk_label(nk, "Frame Size:", NK_TEXT_LEFT);
- nk_layout_row_push(nk, 1.f / 6.f);
- nk_labelf(nk, NK_TEXT_LEFT, "%i", frame_left);
- nk_layout_row_push(nk, 1.f / 6.f);
- nk_labelf(nk, NK_TEXT_LEFT, "%i", frame_top);
- nk_layout_row_push(nk, 1.f / 6.f);
- nk_labelf(nk, NK_TEXT_LEFT, "%i", frame_right);
- nk_layout_row_push(nk, 1.f / 6.f);
- nk_labelf(nk, NK_TEXT_LEFT, "%i", frame_bottom);
- nk_layout_row_end(nk);
-
- nk_layout_row_begin(nk, NK_DYNAMIC, 30, 2);
- float opacity = glfwGetWindowOpacity(window);
- nk_layout_row_push(nk, 1.f / 3.f);
- nk_labelf(nk, NK_TEXT_LEFT, "Opacity: %0.3f", opacity);
- nk_layout_row_push(nk, 2.f / 3.f);
- if (nk_slider_float(nk, 0.f, &opacity, 1.f, 0.001f))
- glfwSetWindowOpacity(window, opacity);
- nk_layout_row_end(nk);
-
- nk_layout_row_begin(nk, NK_DYNAMIC, 30, 2);
- int should_close = glfwWindowShouldClose(window);
- nk_layout_row_push(nk, 1.f / 3.f);
- if (nk_checkbox_label(nk, "Should Close", &should_close))
- glfwSetWindowShouldClose(window, should_close);
- nk_layout_row_push(nk, 2.f / 3.f);
- nk_checkbox_label(nk, "May Close", &may_close);
- nk_layout_row_end(nk);
-
- nk_layout_row_dynamic(nk, 30, 1);
- nk_label(nk, "Attributes", NK_TEXT_CENTERED);
-
- nk_layout_row_dynamic(nk, 30, width > 200 ? width / 200 : 1);
-
- int decorated = glfwGetWindowAttrib(window, GLFW_DECORATED);
- if (nk_checkbox_label(nk, "Decorated", &decorated))
- glfwSetWindowAttrib(window, GLFW_DECORATED, decorated);
-
- int resizable = glfwGetWindowAttrib(window, GLFW_RESIZABLE);
- if (nk_checkbox_label(nk, "Resizable", &resizable))
- glfwSetWindowAttrib(window, GLFW_RESIZABLE, resizable);
-
- int floating = glfwGetWindowAttrib(window, GLFW_FLOATING);
- if (nk_checkbox_label(nk, "Floating", &floating))
- glfwSetWindowAttrib(window, GLFW_FLOATING, floating);
-
- int passthrough = glfwGetWindowAttrib(window, GLFW_MOUSE_PASSTHROUGH);
- if (nk_checkbox_label(nk, "Mouse Passthrough", &passthrough))
- glfwSetWindowAttrib(window, GLFW_MOUSE_PASSTHROUGH, passthrough);
-
- int auto_iconify = glfwGetWindowAttrib(window, GLFW_AUTO_ICONIFY);
- if (nk_checkbox_label(nk, "Auto Iconify", &auto_iconify))
- glfwSetWindowAttrib(window, GLFW_AUTO_ICONIFY, auto_iconify);
-
- nk_value_bool(nk, "Focused", glfwGetWindowAttrib(window, GLFW_FOCUSED));
- nk_value_bool(nk, "Hovered", glfwGetWindowAttrib(window, GLFW_HOVERED));
- nk_value_bool(nk, "Visible", glfwGetWindowAttrib(window, GLFW_VISIBLE));
- nk_value_bool(nk, "Iconified", glfwGetWindowAttrib(window, GLFW_ICONIFIED));
- nk_value_bool(nk, "Maximized", glfwGetWindowAttrib(window, GLFW_MAXIMIZED));
- }
- nk_end(nk);
-
- glClear(GL_COLOR_BUFFER_BIT);
- nk_glfw3_render(NK_ANTI_ALIASING_ON);
- glfwSwapBuffers(window);
-
- glfwWaitEvents();
- }
-
- nk_glfw3_shutdown();
- glfwTerminate();
- exit(EXIT_SUCCESS);
-}
-