cmake, sdl: fix for some SBCs

sdl: don't request alpha channel for gl context
sdl: start fullscreen if not desktop
cmake: make openmp, host libzip optional. gles needs libEGL
fix crash when falling back to gl after vk init fails
This commit is contained in:
Flyinghead 2021-03-19 15:51:09 +01:00
parent ee109d0fec
commit 9bc832c4c6
4 changed files with 60 additions and 37 deletions

View File

@ -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)

View File

@ -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++)

View File

@ -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);

View File

@ -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())