diff --git a/CMakeLists.txt b/CMakeLists.txt index 3256f12..12ea6f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,7 @@ target_link_libraries(emu SDL3::SDL3) target_compile_definitions(emu PUBLIC CHIPS_USE_UI) +target_compile_definitions(emu PRIVATE ${SOKOL_GFX_BACKEND_DEFINE}) if(CMAKE_SYSTEM_NAME STREQUAL "Linux") message(STATUS "Building for Linux") diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 8a5e695..5a55fea 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -1,15 +1,19 @@ # select the sokol-gfx backend depending on platform if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") add_definitions(-DSOKOL_GLES3) + set(SOKOL_GFX_BACKEND_DEFINE "SOKOL_GLES3" PARENT_SCOPE) set(slang "glsl300es") elseif(FIPS_ANDROID) add_definitions(-DSOKOL_GLES3) + set(SOKOL_GFX_BACKEND_DEFINE "SOKOL_GLES3" PARENT_SCOPE) set(slang "glsl300es") elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows") add_definitions(-DSOKOL_GLCORE) + set(SOKOL_GFX_BACKEND_DEFINE "SOKOL_GLCORE" PARENT_SCOPE) set(slang "glsl410") elseif(FIPS_OSX) add_definitions(-DSOKOL_METAL) + set(SOKOL_GFX_BACKEND_DEFINE "SOKOL_METAL" PARENT_SCOPE) if (FIPS_IOS) set(slang "metal_ios") else() @@ -17,6 +21,7 @@ elseif(FIPS_OSX) endif() else() add_definitions(-DSOKOL_GLES3) + set(SOKOL_GFX_BACKEND_DEFINE "SOKOL_GLES3" PARENT_SCOPE) set(slang "glsl300es") endif() diff --git a/src/x65.c b/src/x65.c index 98d1fee..6fda1b8 100644 --- a/src/x65.c +++ b/src/x65.c @@ -158,6 +158,12 @@ static void app_load_rom_labels(const char* rom_file) { } void app_init(void) { +#if defined(SOKOL_GLES3) || defined(SOKOL_GLCORE) + LOG_INFO("OpenGL context: %s %d.%d", + sapp_gl_is_gles() ? "OpenGL ES" : "OpenGL", + sapp_gl_get_major_version(), + sapp_gl_get_minor_version()); +#endif saudio_setup(&(saudio_desc){ .sample_rate = SGU_CHIP_CLOCK, .num_channels = SGU_AUDIO_CHANNELS, @@ -838,6 +844,19 @@ sapp_desc sokol_main(int argc, char* argv[]) { const chips_display_info_t info = x65_display_info(0); const int default_width = info.screen.width + BORDER_LEFT + BORDER_RIGHT; const int default_height = info.screen.height + BORDER_TOP + BORDER_BOTTOM; + + // Use the minimum OpenGL/GLES version required by the compiled shaders to + // maximize compatibility with older hardware. + // - SOKOL_GLES3 shaders are compiled for glsl300es -> requires GLES 3.0 + // - SOKOL_GLCORE shaders are compiled for glsl410 -> requires GL 4.1 +#if defined(SOKOL_GLES3) + const int gl_major = 3, gl_minor = 0; +#elif defined(SOKOL_GLCORE) + const int gl_major = 4, gl_minor = 1; +#else + const int gl_major = 0, gl_minor = 0; // Metal / D3D11 / WebGPU: ignored +#endif + return (sapp_desc){ .init_cb = app_init, .frame_cb = app_frame, @@ -855,6 +874,10 @@ sapp_desc sokol_main(int argc, char* argv[]) { }, .enable_clipboard = true, .enable_dragndrop = true, + .gl = { + .major_version = gl_major, + .minor_version = gl_minor, + }, .html5 = { .bubble_mouse_events = true, .update_document_title = true,