diff --git a/CMakeLists.txt b/CMakeLists.txt index af4fcd070..5f74a0c82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,10 @@ option(ENABLE_OPROFILE "Enable OProfile" OFF) option(TEST_AUTOMATION "Enable test automation" OFF) option(ENABLE_LOG "Enable full logging" OFF) option(ASAN "Enable address sanitizer" OFF) +option(USE_GLES "Use GLES[3] API" OFF) +option(USE_GLES2 "Use GLES2 API" OFF) +option(USE_HOST_LIBZIP "Use host libzip" ON) +option(USE_OPENMP "Use OpenMP if available" ON) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/shell/cmake") @@ -86,7 +90,7 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE target_include_directories(${PROJECT_NAME} PRIVATE core core/deps core/deps/stb core/deps/xbyak core/khronos) find_package(OpenMP) -if(OpenMP_CXX_FOUND AND NOT APPLE) +if(OpenMP_CXX_FOUND AND NOT APPLE AND USE_OPENMP) if(MINGW) target_link_libraries(${PROJECT_NAME} PRIVATE "-static -lgomp -lpthread") target_compile_options(${PROJECT_NAME} PRIVATE -fopenmp) @@ -192,17 +196,19 @@ if(PKG_CONFIG_FOUND AND NOT ANDROID AND NOT APPLE) target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::FLAC) endif() - pkg_check_modules(LIBEVDEV IMPORTED_TARGET libevdev) - if(LIBEVDEV_FOUND) - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_EVDEV) - target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBEVDEV) - - pkg_check_modules(LIBUDEV IMPORTED_TARGET libudev) - if(LIBUDEV_FOUND) - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_UDEV) - target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBUDEV) - endif() - endif() + if(NOT SDL2_FOUND) + pkg_check_modules(LIBEVDEV IMPORTED_TARGET libevdev) + if(LIBEVDEV_FOUND) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_EVDEV) + target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBEVDEV) + + pkg_check_modules(LIBUDEV IMPORTED_TARGET libudev) + if(LIBUDEV_FOUND) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_UDEV) + target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBUDEV) + endif() + endif() + endif() pkg_check_modules(LIBPULSE IMPORTED_TARGET libpulse) if(LIBPULSE_FOUND) @@ -210,9 +216,11 @@ if(PKG_CONFIG_FOUND AND NOT ANDROID AND NOT APPLE) target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBPULSE) endif() - pkg_check_modules(LIBZIP IMPORTED_TARGET libzip) - if(LIBZIP_FOUND) - target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBZIP) + if(USE_HOST_LIBZIP) + pkg_check_modules(LIBZIP IMPORTED_TARGET libzip) + if(LIBZIP_FOUND) + target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBZIP) + endif() endif() if(ENABLE_OPROFILE) @@ -228,9 +236,17 @@ if(PKG_CONFIG_FOUND AND NOT ANDROID AND NOT APPLE) endif() if(UNIX AND NOT APPLE AND NOT ANDROID) - set(OpenGL_GL_PREFERENCE LEGACY) - find_package(OpenGL REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL) + if(USE_GLES2) + target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES2) + target_link_libraries(${PROJECT_NAME} PRIVATE GLESv2 EGL) + elseif(USE_GLES) + target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES3) + target_link_libraries(${PROJECT_NAME} PRIVATE EGL) + else() + set(OpenGL_GL_PREFERENCE LEGACY) + find_package(OpenGL REQUIRED) + target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL) + endif() find_package(Threads REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads) @@ -248,6 +264,8 @@ if(UNIX AND NOT APPLE AND NOT ANDROID) target_include_directories(${PROJECT_NAME} PRIVATE ${X11_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} PRIVATE ${X11_LIBRARIES}) endif() + else() + target_compile_definitions(${PROJECT_NAME} PRIVATE EGL_NO_X11) endif() target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_DL_LIBS} rt) @@ -776,8 +794,13 @@ target_sources(${PROJECT_NAME} PRIVATE core/rend/TexCache.cpp core/rend/TexCache.h) -if(NOT APPLE AND NOT ANDROID) - target_sources(${PROJECT_NAME} PRIVATE core/rend/gl4/abuffer.cpp core/rend/gl4/gl4.h core/rend/gl4/gldraw.cpp core/rend/gl4/gles.cpp core/rend/gl4/gltex.cpp) +if(NOT (APPLE OR ANDROID OR USE_GLES)) + target_sources(${PROJECT_NAME} PRIVATE + core/rend/gl4/abuffer.cpp + core/rend/gl4/gl4.h + core/rend/gl4/gldraw.cpp + core/rend/gl4/gles.cpp + core/rend/gl4/gltex.cpp) endif() if(NOT APPLE) diff --git a/core/sdl/sdl.cpp b/core/sdl/sdl.cpp index 6b82f248f..aeb0b184c 100644 --- a/core/sdl/sdl.cpp +++ b/core/sdl/sdl.cpp @@ -474,15 +474,17 @@ bool sdl_recreate_window(u32 flags) get_window_state(); SDL_DestroyWindow(window); } -#ifdef TARGET_PANDORA - flags |= SDL_FULLSCREEN; -#else - flags |= SDL_SWSURFACE | SDL_WINDOW_RESIZABLE; + flags |= SDL_SWSURFACE; +#if !defined(GLES) + flags |= SDL_WINDOW_RESIZABLE; if (window_fullscreen) flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; else if (window_maximized) flags |= SDL_WINDOW_MAXIMIZED; +#else + flags |= SDL_WINDOW_FULLSCREEN; #endif + window = SDL_CreateWindow("Flycast", x, y, window_width * scaling, window_height * scaling, flags); if (window == nullptr) { @@ -490,7 +492,7 @@ bool sdl_recreate_window(u32 flags) return false; } -#ifndef _WIN32 +#if !defined(GLES) && !defined(_WIN32) // Set the window icon u32 pixels[48 * 48]; for (int i = 0; i < 48 * 48; i++) diff --git a/core/wsi/sdl.cpp b/core/wsi/sdl.cpp index 4bc58c620..0060b92b9 100644 --- a/core/wsi/sdl.cpp +++ b/core/wsi/sdl.cpp @@ -42,7 +42,6 @@ bool SDLGLGraphicsContext::Init() SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); @@ -51,23 +50,21 @@ bool SDLGLGraphicsContext::Init() return false; glcontext = SDL_GL_CreateContext(window); - if (!glcontext) - { #ifndef GLES + if (glcontext == SDL_GLContext()) + { SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); glcontext = SDL_GL_CreateContext(window); - if (!glcontext) - { -#endif - ERROR_LOG(RENDERER, "Error creating SDL GL context"); - SDL_DestroyWindow(window); - window = nullptr; - return false; -#ifndef GLES - } + } #endif + if (glcontext == SDL_GLContext()) + { + ERROR_LOG(RENDERER, "Error creating SDL GL context"); + SDL_DestroyWindow(window); + window = nullptr; + return false; } SDL_GL_MakeCurrent(window, NULL); diff --git a/core/wsi/switcher.cpp b/core/wsi/switcher.cpp index d4c3623ef..2cfb5178b 100644 --- a/core/wsi/switcher.cpp +++ b/core/wsi/switcher.cpp @@ -36,6 +36,7 @@ void InitRenderApi() // Fall back to Open GL WARN_LOG(RENDERER, "Vulkan init failed. Falling back to Open GL."); config::RendererType = RenderType::OpenGL; + config::RendererType.commit(); } #endif if (!theGLContext.Init())