diff --git a/CMakeLists.txt b/CMakeLists.txt index 455a6cbd..f17af613 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,6 @@ option(LOVR_USE_WEBXR "Enable the WebXR backend for the headset module" OFF) option(LOVR_USE_DESKTOP "Enable the keyboard/mouse backend for the headset module" ON) option(LOVR_USE_STEAM_AUDIO "Enable the Steam Audio spatializer (be sure to also set LOVR_STEAM_AUDIO_PATH)" OFF) option(LOVR_USE_OCULUS_AUDIO "Enable the Oculus Audio spatializer (be sure to also set LOVR_OCULUS_AUDIO_PATH)" OFF) -option(LOVR_USE_LINUX_EGL "Use the EGL graphics extension on Linux" OFF) option(LOVR_SANITIZE "Enable Address Sanitizer" OFF) option(LOVR_SYSTEM_GLFW "Use the system-provided glfw" OFF) @@ -686,7 +685,7 @@ elseif(EMSCRIPTEN) configure_file(etc/lovr.ico favicon.ico COPYONLY) elseif(ANDROID) target_sources(lovr PRIVATE src/core/os_android.c) - target_link_libraries(lovr log EGL android dl) + target_link_libraries(lovr log android dl) target_include_directories(lovr PRIVATE "${ANDROID_NDK}/sources/android/native_app_glue") # Dynamically linked targets output libraries in raw/lib/ for easy including in apk with aapt @@ -779,11 +778,6 @@ elseif(ANDROID) add_dependencies(buildAPK move_libraries) endif() elseif(UNIX) - if(LOVR_USE_LINUX_EGL) - target_compile_definitions(lovr PRIVATE LOVR_LINUX_EGL) - else() - target_compile_definitions(lovr PRIVATE LOVR_LINUX_X11) - endif() target_sources(lovr PRIVATE src/core/os_linux.c) set_target_properties(lovr PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" diff --git a/src/core/os_android.c b/src/core/os_android.c index c9e83ead..15659079 100644 --- a/src/core/os_android.c +++ b/src/core/os_android.c @@ -4,8 +4,7 @@ #include #include #include -#include -#include +#include // This is probably bad, but makes things easier to build #include @@ -13,10 +12,6 @@ static struct { struct android_app* app; JNIEnv* jni; - EGLDisplay display; - EGLContext context; - EGLConfig config; - EGLSurface surface; fn_quit* onQuit; fn_key* onKeyboardEvent; fn_text* onTextEvent; @@ -175,10 +170,6 @@ bool os_init() { } void os_destroy() { - if (state.display) eglMakeCurrent(state.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - if (state.surface) eglDestroySurface(state.display, state.surface); - if (state.context) eglDestroyContext(state.display, state.context); - if (state.display) eglTerminate(state.display); memset(&state, 0, sizeof(state)); } @@ -255,6 +246,22 @@ void os_request_permission(os_permission permission) { } } +void* os_vm_init(size_t size) { + return mmap(NULL, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +} + +bool os_vm_free(void* p, size_t size) { + return !munmap(p, size); +} + +bool os_vm_commit(void* p, size_t size) { + return !mprotect(p, size, PROT_READ | PROT_WRITE); +} + +bool os_vm_release(void* p, size_t size) { + return !madvise(p, size, MADV_DONTNEED); +} + // Notes about polling: // - Stop polling if a destroy is requested to give the application a chance to shut down. // Otherwise this loop would still wait for an event and the app would seem unresponsive. @@ -305,86 +312,6 @@ void os_on_permission(fn_permission* callback) { } bool os_window_open(const os_window_config* config) { - if (state.display) { - return true; - } - - if ((state.display = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY) { - return false; - } - - if (eglInitialize(state.display, NULL, NULL) == EGL_FALSE) { - return false; - } - - EGLConfig configs[1024]; - EGLint configCount; - if (eglGetConfigs(state.display, configs, sizeof(configs) / sizeof(configs[0]), &configCount) == EGL_FALSE) { - return false; - } - - const EGLint attributes[] = { - EGL_RED_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_BLUE_SIZE, 8, - EGL_ALPHA_SIZE, 8, - EGL_DEPTH_SIZE, 0, - EGL_STENCIL_SIZE, 0, - EGL_SAMPLES, 0, - EGL_NONE - }; - - state.config = 0; - for (EGLint i = 0; i < configCount && state.config == 0; i++) { - EGLint value, mask; - - mask = EGL_OPENGL_ES3_BIT_KHR; - if (!eglGetConfigAttrib(state.display, configs[i], EGL_RENDERABLE_TYPE, &value) || (value & mask) != mask) { - continue; - } - - mask = EGL_PBUFFER_BIT | EGL_WINDOW_BIT; - if (!eglGetConfigAttrib(state.display, configs[i], EGL_SURFACE_TYPE, &value) || (value & mask) != mask) { - continue; - } - - for (size_t a = 0; a < sizeof(attributes) / sizeof(attributes[0]); a += 2) { - if (attributes[a] == EGL_NONE) { - state.config = configs[i]; - break; - } - - if (!eglGetConfigAttrib(state.display, configs[i], attributes[a], &value) || value != attributes[a + 1]) { - break; - } - } - } - - EGLint contextAttributes[] = { - EGL_CONTEXT_CLIENT_VERSION, 3, - EGL_NONE - }; - - if ((state.context = eglCreateContext(state.display, state.config, EGL_NO_CONTEXT, contextAttributes)) == EGL_NO_CONTEXT) { - return false; - } - - EGLint surfaceAttributes[] = { - EGL_WIDTH, 16, - EGL_HEIGHT, 16, - EGL_NONE - }; - - if ((state.surface = eglCreatePbufferSurface(state.display, state.config, surfaceAttributes)) == EGL_NO_SURFACE) { - eglDestroyContext(state.display, state.context); - return false; - } - - if (eglMakeCurrent(state.display, state.surface, state.surface, state.context) == EGL_FALSE) { - eglDestroySurface(state.display, state.surface); - eglDestroyContext(state.display, state.context); - } - return true; } @@ -490,22 +417,6 @@ JNIEnv* os_get_jni() { return state.jni; } -EGLDisplay os_get_egl_display() { - return state.display; -} - -EGLContext os_get_egl_context() { - return state.context; -} - -EGLContext os_get_egl_config() { - return state.config; -} - -EGLSurface os_get_egl_surface() { - return state.surface; -} - const char** os_vk_get_instance_extensions(uint32_t* count) { return *count = 0, NULL; } diff --git a/src/core/os_glfw.h b/src/core/os_glfw.h index 0a1a6080..180490aa 100644 --- a/src/core/os_glfw.h +++ b/src/core/os_glfw.h @@ -8,24 +8,10 @@ #include #ifndef EMSCRIPTEN -# ifdef _WIN32 -# define GLFW_EXPOSE_NATIVE_WIN32 -# define GLFW_EXPOSE_NATIVE_WGL -# endif -# ifdef _WIN32 -# define GLFW_EXPOSE_NATIVE_WIN32 -# define GLFW_EXPOSE_NATIVE_WGL -# endif -# ifdef LOVR_LINUX_EGL -# define EGL_NO_X11 -# include -# define GLFW_EXPOSE_NATIVE_EGL -# endif -# ifdef LOVR_LINUX_X11 -# define GLFW_EXPOSE_NATIVE_X11 -# define GLFW_EXPOSE_NATIVE_GLX -# endif -# include +#ifdef _WIN32 +#define GLFW_EXPOSE_NATIVE_WIN32 +#endif +#include #endif static struct { @@ -217,9 +203,6 @@ bool os_window_open(const os_window_config* config) { glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); #endif -#ifdef LOVR_LINUX_EGL - glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_EGL_CONTEXT_API); -#endif glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); @@ -253,9 +236,6 @@ bool os_window_open(const os_window_config* config) { }); } -#ifndef LOVR_VK - glfwMakeContextCurrent(glfwState.window); -#endif glfwSetWindowCloseCallback(glfwState.window, onWindowClose); glfwSetWindowFocusCallback(glfwState.window, onWindowFocus); glfwSetWindowSizeCallback(glfwState.window, onWindowResize); @@ -333,56 +313,6 @@ bool os_is_key_down(os_key key) { HANDLE os_get_win32_window() { return (HANDLE) glfwGetWin32Window(glfwState.window); } - -HGLRC os_get_win32_context() { - return glfwGetWGLContext(glfwState.window); -} -#endif - -#ifdef LOVR_LINUX_EGL -PFNEGLGETPROCADDRESSPROC os_get_egl_proc_addr() { - return (PFNEGLGETPROCADDRESSPROC) glfwGetProcAddress; -} - -EGLDisplay os_get_egl_display() { - return glfwGetEGLDisplay(); -} - -EGLContext os_get_egl_context() { - return glfwGetEGLContext(glfwState.window); -} - -EGLConfig os_get_egl_config() { - EGLDisplay dpy = os_get_egl_display(); - EGLContext ctx = os_get_egl_context(); - EGLint cfg_id = -1; - EGLint num_cfgs = -1; - EGLConfig cfg = NULL; - PFNEGLQUERYCONTEXTPROC eglQueryContext = (PFNEGLQUERYCONTEXTPROC)glfwGetProcAddress("eglQueryContext"); - PFNEGLCHOOSECONFIGPROC eglChooseConfig = (PFNEGLCHOOSECONFIGPROC)glfwGetProcAddress("eglChooseConfig"); - - eglQueryContext(dpy, ctx, EGL_CONFIG_ID, &cfg_id); - EGLint attrs [4] = { - EGL_CONFIG_ID, cfg_id, - EGL_NONE, EGL_NONE, - }; - eglChooseConfig(dpy, attrs, &cfg, 1, &num_cfgs); - return cfg; -} -#endif - -#ifdef LOVR_LINUX_X11 -Display* os_get_x11_display() { - return glfwGetX11Display(); -} - -GLXDrawable os_get_glx_drawable() { - return glfwGetGLXWindow(glfwState.window); -} - -GLXContext os_get_glx_context() { - return glfwGetGLXContext(glfwState.window); -} #endif #ifdef LOVR_VK