diff --git a/CMakeLists.txt b/CMakeLists.txt index fd62e985f01fc..20d378d85ffc6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,11 @@ endif() # See docs/release_checklist.md project(SDL3 LANGUAGES C VERSION "3.3.0") +if(GDK_GAMING_XBOX) + # FIXME: Setting the standard of individual files doesn't seem to work properly + set(CMAKE_CXX_STANDARD 17) +endif() + if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) set(SDL3_MAINPROJECT ON) else() @@ -331,8 +336,8 @@ dep_option(SDL_DISKAUDIO "Support the disk writer audio driver" ON "SD dep_option(SDL_DUMMYAUDIO "Support the dummy audio driver" ON "SDL_AUDIO" OFF) dep_option(SDL_DUMMYVIDEO "Use dummy video driver" ON "SDL_VIDEO" OFF) dep_option(SDL_IBUS "Enable IBus support" ON "${UNIX_SYS}" OFF) -dep_option(SDL_OPENGL "Include OpenGL support" ON "SDL_VIDEO;NOT IOS;NOT VISIONOS;NOT TVOS;NOT WATCHOS" OFF) -dep_option(SDL_OPENGLES "Include OpenGL ES support" ON "SDL_VIDEO;NOT VISIONOS;NOT TVOS;NOT WATCHOS" OFF) +dep_option(SDL_OPENGL "Include OpenGL support" ON "SDL_VIDEO;NOT IOS;NOT VISIONOS;NOT TVOS;NOT WATCHOS;NOT GDK_GAMING_XBOX" OFF) +dep_option(SDL_OPENGLES "Include OpenGL ES support" ON "SDL_VIDEO;NOT VISIONOS;NOT TVOS;NOT WATCHOS;NOT GDK_GAMING_XBOX" OFF) set_option(SDL_PTHREADS "Use POSIX threads for multi-threading" ${SDL_PTHREADS_DEFAULT}) dep_option(SDL_PTHREADS_SEM "Use pthread semaphores" ON "SDL_PTHREADS" OFF) dep_option(SDL_OSS "Support the OSS audio API" ${SDL_OSS_DEFAULT} "UNIX_SYS OR RISCOS;SDL_AUDIO" OFF) @@ -375,8 +380,8 @@ dep_option(SDL_RENDER_D3D12 "Enable the Direct3D 12 render driver" ON "SD dep_option(SDL_RENDER_METAL "Enable the Metal render driver" ON "SDL_RENDER;${APPLE}" OFF) dep_option(SDL_RENDER_GPU "Enable the SDL_GPU render driver" ON "SDL_RENDER;SDL_GPU" OFF) dep_option(SDL_VIVANTE "Use Vivante EGL video driver" ON "${UNIX_SYS};SDL_CPU_ARM32" OFF) -dep_option(SDL_VULKAN "Enable Vulkan support" ON "SDL_VIDEO;ANDROID OR APPLE OR LINUX OR FREEBSD OR WINDOWS" OFF) -dep_option(SDL_RENDER_VULKAN "Enable the Vulkan render driver" ON "SDL_RENDER;SDL_VULKAN" OFF) +dep_option(SDL_VULKAN "Enable Vulkan support" ON "SDL_VIDEO;ANDROID OR APPLE OR LINUX OR FREEBSD OR WINDOWS;NOT GDK_GAMING_XBOX" OFF) +dep_option(SDL_RENDER_VULKAN "Enable the Vulkan render driver" ON "SDL_RENDER;SDL_VULKAN;NOT GDK_GAMING_XBOX" OFF) dep_option(SDL_METAL "Enable Metal support" ON "APPLE" OFF) set_option(SDL_OPENVR "Use OpenVR video driver" OFF) dep_option(SDL_KMSDRM "Use KMS DRM video driver" ${UNIX_SYS} "SDL_VIDEO" OFF) @@ -385,11 +390,11 @@ set_option(SDL_OFFSCREEN "Use offscreen video driver" ON) dep_option(SDL_DUMMYCAMERA "Support the dummy camera driver" ON SDL_CAMERA OFF) option_string(SDL_BACKGROUNDING_SIGNAL "number to use for magic backgrounding signal or 'OFF'" OFF) option_string(SDL_FOREGROUNDING_SIGNAL "number to use for magic foregrounding signal or 'OFF'" OFF) -dep_option(SDL_HIDAPI "Enable the HIDAPI subsystem" ON "NOT VISIONOS" OFF) +dep_option(SDL_HIDAPI "Enable the HIDAPI subsystem" ON "NOT VISIONOS;NOT GDK_GAMING_XBOX" OFF) dep_option(SDL_HIDAPI_LIBUSB "Use libusb for low level joystick drivers" ON SDL_HIDAPI_LIBUSB_AVAILABLE OFF) dep_option(SDL_HIDAPI_LIBUSB_SHARED "Dynamically load libusb support" ON "SDL_HIDAPI_LIBUSB;SDL_DEPS_SHARED" OFF) dep_option(SDL_HIDAPI_JOYSTICK "Use HIDAPI for low level joystick drivers" ON SDL_HIDAPI OFF) -dep_option(SDL_VIRTUAL_JOYSTICK "Enable the virtual-joystick driver" ON SDL_HIDAPI OFF) +dep_option(SDL_VIRTUAL_JOYSTICK "Enable the virtual-joystick driver" ON "SDL_HIDAPI OR GDK_GAMING_XBOX" OFF) set_option(SDL_LIBUDEV "Enable libudev support" ON) set_option(SDL_ASAN "Use AddressSanitizer to detect memory errors" OFF) set_option(SDL_CCACHE "Use Ccache to speed up build" OFF) @@ -441,6 +446,32 @@ if(SDL_PRESEED) SDL_Preseed_CMakeCache() endif() +if(GDK_GAMING_XBOX) + if(GDK_GAMING_XBOX_ONE) + message(STATUS "Building shader blobs (Xbox One)") + execute_process( + COMMAND cmd.exe /Q /c "${SDL3_SOURCE_DIR}/src/render/direct3d12/compile_shaders_xbox.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} one" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + execute_process( + COMMAND cmd.exe /Q /c "${SDL3_SOURCE_DIR}/src/gpu/d3d12/compile_shaders_xbox.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} one" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + elseif(GDK_GAMING_XBOX_SCARLETT) + message(STATUS "Building shader blobs (Xbox Series)") + execute_process( + COMMAND cmd.exe /Q /c "${SDL3_SOURCE_DIR}/src/render/direct3d12/compile_shaders_xbox.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + execute_process( + COMMAND cmd.exe /Q /c "${SDL3_SOURCE_DIR}/src/gpu/d3d12/compile_shaders_xbox.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + else() + message(FATAL_ERROR "Unknown Xbox system") + endif() +endif() + if(SDL_SHARED) add_library(SDL3-shared SHARED) add_library(SDL3::SDL3-shared ALIAS SDL3-shared) @@ -1055,6 +1086,10 @@ if(SDL_LIBC) strcasestr ) endif() + if(GDK_GAMING_XBOX) + list(REMOVE_ITEM symbols_to_check itoa) + endif() + check_library_exists(m pow "" HAVE_LIBM) cmake_push_check_state() if(HAVE_LIBM) @@ -1922,6 +1957,9 @@ elseif(WINDOWS) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/windows/*.cpp") sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/windows/*.c") sdl_glob_sources("${SDL3_SOURCE_DIR}/src/io/windows/*.c") + if(GDK_GAMING_XBOX) + sdl_sources("${SDL3_SOURCE_DIR}/src/main/gdk/SDL_sysmain_runapp.cpp") + endif() if(TARGET SDL3-shared AND MSVC AND NOT SDL_LIBC) # Prevent codegen that would use the VC runtime libraries. @@ -1955,10 +1993,19 @@ elseif(WINDOWS) check_include_file(ddraw.h HAVE_DDRAW_H) check_include_file(dsound.h HAVE_DSOUND_H) check_include_file(dinput.h HAVE_DINPUT_H) + check_include_file(dxgi.h HAVE_DXGI_H) + # FIXME: Not sure why, avoiding the above still keeps "HAVE_DDRAW_H" and friends being 1? + if(GDK_GAMING_XBOX) + set(HAVE_D3D9_H 0) + set(HAVE_D3D11_H 0) + set(HAVE_DDRAW_H 0) + set(HAVE_DSOUND_H 0) + set(HAVE_DINPUT_H 0) + set(HAVE_DXGI_H 0) + endif() if(SDL_CPU_ARM32) # !!! FIXME: this should probably check if we're !(x86 or x86-64) instead of arm. set(HAVE_DINPUT_H 0) endif() - check_include_file(dxgi.h HAVE_DXGI_H) cmake_pop_check_state() if(HAVE_D3D9_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H) set(HAVE_DIRECTX TRUE) @@ -1989,6 +2036,10 @@ elseif(WINDOWS) static __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2 *s2; int main(int argc, char **argv) { return 0; }" HAVE_WINDOWS_GAMING_INPUT_H ) + # FIXME: Avoiding the check above still marks it as 1 + if(GDK_GAMING_XBOX) + set(HAVE_WINDOWS_GAMING_INPUT_H 0) + endif() check_c_source_compiles(" #include #define COBJMACROS @@ -2003,6 +2054,11 @@ elseif(WINDOWS) check_include_file(sensorsapi.h HAVE_SENSORSAPI_H) check_include_file(shellscalingapi.h HAVE_SHELLSCALINGAPI_H) check_include_file(shobjidl_core.h HAVE_SHOBJIDL_CORE_H) + # FIXME: removing the checks didn't work? + if(GDK_GAMING_XBOX) + set(HAVE_ROAPI_H 0) + set(HAVE_SHELLSCALINGAPI_H 0) + endif() check_c_source_compiles(" #include #include @@ -2034,17 +2090,35 @@ elseif(WINDOWS) CheckOpenVR() - if(SDL_RENDER_D3D AND HAVE_D3D9_H) + if(SDL_RENDER_D3D AND HAVE_D3D9_H AND NOT GDK_GAMING_XBOX) set(SDL_VIDEO_RENDER_D3D 1) set(HAVE_RENDER_D3D TRUE) endif() - if(SDL_RENDER_D3D11 AND HAVE_D3D11_H) + if(GDK_GAMING_XBOX) + set_source_files_properties("${SDL3_SOURCE_DIR}/src/render/direct3d/SDL_render_d3d.c" PROPERTIES LANGUAGE CXX) + sdl_sources("${SDL3_SOURCE_DIR}/src/video/gdk/SDL_gdktextinput.cpp") + endif() + if(SDL_RENDER_D3D11 AND HAVE_D3D11_H AND NOT GDK_GAMING_XBOX) set(SDL_VIDEO_RENDER_D3D11 1) set(HAVE_RENDER_D3D11 TRUE) endif() if(SDL_RENDER_D3D12) set(SDL_VIDEO_RENDER_D3D12 1) set(HAVE_RENDER_D3D12 TRUE) + if(GDK_GAMING_XBOX) + set_source_files_properties("${SDL3_SOURCE_DIR}/src/render/direct3d12/SDL_render_d3d12.c" PROPERTIES LANGUAGE CXX) + sdl_sources("${SDL3_SOURCE_DIR}/src/render/direct3d12/SDL_render_d3d12_xbox.cpp") + if(GDK_GAMING_XBOX_ONE) + sdl_sources("${SDL3_SOURCE_DIR}/src/render/direct3d12/SDL_shaders_d3d12_xboxone.cpp") + # TODO: This should also happen for "SDL_GPU && !(SDL_RENDER)" + sdl_link_dependency(d3d12 LIBS d3d12_x.lib) + elseif(GDK_GAMING_XBOX_SCARLETT) + sdl_sources("${SDL3_SOURCE_DIR}/src/render/direct3d12/SDL_shaders_d3d12_xboxseries.cpp") + sdl_link_dependency(d3d12 LIBS d3d12_xs.lib) + else() + message(FATAL_ERROR "Unknown Xbox system") + endif() + endif() endif() set(HAVE_SDL_VIDEO TRUE) endif() @@ -2065,14 +2139,18 @@ elseif(WINDOWS) set(HAVE_SDL_THREADS TRUE) - if(SDL_SENSOR AND HAVE_SENSORSAPI_H) + if(SDL_SENSOR AND HAVE_SENSORSAPI_H AND NOT GDK_GAMING_XBOX) set(SDL_SENSOR_WINDOWS 1) set(HAVE_SDL_SENSORS TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/sensor/windows/*.c") endif() if(SDL_POWER) - set(SDL_POWER_WINDOWS 1) + if(GDK_GAMING_XBOX) + set(SDL_POWER_HARDWIRED 1) + else() + set(SDL_POWER_WINDOWS 1) + endif() sdl_sources("${SDL3_SOURCE_DIR}/src/power/windows/SDL_syspower.c") set(HAVE_SDL_POWER TRUE) endif() @@ -2080,8 +2158,15 @@ elseif(WINDOWS) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/windows/*.c") set(HAVE_SDL_LOCALE TRUE) - set(SDL_FILESYSTEM_WINDOWS 1) - sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/windows/*.c") + if(NOT GDK_GAMING_XBOX) + set(SDL_FILESYSTEM_WINDOWS 1) + endif() + file(GLOB SDL3_WIN_FILESYSTEM_FILES "${SDL3_SOURCE_DIR}/src/filesystem/windows/*.c") + if(GDK_GAMING_XBOX) + list(REMOVE_ITEM SDL3_WIN_FILESYSTEM_FILES "${SDL3_SOURCE_DIR}/src/filesystem/windows/SDL_sysfilesystem.c") + sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/gdk/SDL_sysfilesystem.cpp") + endif() + sdl_glob_sources("${SDL3_WIN_FILESYSTEM_FILES}") set(HAVE_SDL_FILESYSTEM TRUE) set(SDL_FSOPS_WINDOWS 1) @@ -2094,7 +2179,14 @@ elseif(WINDOWS) set(HAVE_SDL_STORAGE 1) # Libraries for Win32 native and MinGW - sdl_link_dependency(base LIBS kernel32 user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32) + if(GDK_GAMING_XBOX) + add_link_options("/NODEFAULTLIB") + # Needed to inherit base dependencies, specifically to link XblInitialize correctly + set(CMAKE_CXX_STANDARD_LIBRARIES "$(CMAKE_CXX_STANDARD_LIBRARIES) %(AdditionalDependencies) ") + sdl_link_dependency(base LIBS xgameplatform xgameruntime xmem pixevt) + else() + sdl_link_dependency(base LIBS kernel32 user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32) + endif() set(SDL_TIME_WINDOWS 1) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/windows/*.c") @@ -2109,6 +2201,10 @@ elseif(WINDOWS) set(HAVE_SDL_LOADSO TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/windows/*.c") + if(GDK_GAMING_XBOX) + sdl_sources("${SDL3_SOURCE_DIR}/src/core/gdk/SDL_gdk.cpp") +# sdl_sources("${SDL3_SOURCE_DIR}/src/core/windows/pch_cpp.cpp") + endif() if(SDL_VIDEO) if(SDL_OPENGL) @@ -2134,8 +2230,10 @@ elseif(WINDOWS) endif() endif() - sdl_glob_sources("${SDL3_SOURCE_DIR}/src/tray/windows/*.c") - set(HAVE_SDL_TRAY TRUE) + if(NOT GDK_GAMING_XBOX) + sdl_glob_sources("${SDL3_SOURCE_DIR}/src/tray/windows/*.c") + set(HAVE_SDL_TRAY TRUE) + endif() endif() if(SDL_HIDAPI) @@ -2144,23 +2242,37 @@ elseif(WINDOWS) if(SDL_JOYSTICK) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/windows/*.c") + if (GDK_GAMING_XBOX) + set_source_files_properties("${SDL3_SOURCE_DIR}/src/joystick/windows/SDL_windowsjoystick.c" PROPERTIES LANGUAGE CXX CXX_STANDARD 17) + set_source_files_properties("${SDL3_SOURCE_DIR}/src/joystick/windows/SDL_xinputjoystick.c" PROPERTIES LANGUAGE CXX CXX_STANDARD 17) + sdl_sources("${SDL3_SOURCE_DIR}/src/joystick/gdk/SDL_gameinputjoystick.c") + endif() - set(SDL_JOYSTICK_RAWINPUT 1) + if(NOT GDK_GAMING_XBOX) + set(SDL_JOYSTICK_RAWINPUT 1) + endif() if(HAVE_DINPUT_H) set(SDL_JOYSTICK_DINPUT 1) sdl_link_dependency(joystick LIBS dinput8) endif() - if(HAVE_XINPUT_H) + if(HAVE_XINPUT_H AND NOT GDK_GAMING_XBOX) set(SDL_JOYSTICK_XINPUT 1) set(HAVE_XINPUT TRUE) endif() - if(HAVE_WINDOWS_GAMING_INPUT_H) + if(GDK_GAMING_XBOX) + set_source_files_properties("${SDL3_SOURCE_DIR}/src/core/windows/SDL_xinput.c" PROPERTIES LANGUAGE CXX CXX_STANDARD 17) + endif() + if(HAVE_WINDOWS_GAMING_INPUT_H AND NOT GDK_GAMING_XBOX) set(SDL_JOYSTICK_WGI 1) endif() if(HAVE_GAMEINPUT_H) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/gdk/*.cpp") set(SDL_JOYSTICK_GAMEINPUT 1) endif() + if(GDK_GAMING_DESKTOP OR GDK_GAMING_XBOX) + set(SDL_GDK_TEXTINPUT 1) + set(SDL_DISABLE_WINDOWS_IME 1) + endif() set(HAVE_SDL_JOYSTICK TRUE) if(SDL_HAPTIC) @@ -2168,6 +2280,9 @@ elseif(WINDOWS) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/haptic/windows/*.c") set(SDL_HAPTIC_DINPUT 1) set(HAVE_SDL_HAPTIC TRUE) + if(GDK_GAMING_XBOX) + set_source_files_properties("${SDL3_SOURCE_DIR}/src/haptic/windows/SDL_windowshaptic.c" PROPERTIES LANGUAGE CXX CXX_STANDARD 17) + endif() endif() endif() endif() @@ -3041,7 +3156,7 @@ if (SDL_DIALOG) elseif(HAIKU) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/haiku/SDL_haikudialog.cc) set(HAVE_SDL_DIALOG TRUE) - elseif(WINDOWS) + elseif(WINDOWS AND NOT GDK_GAMING_XBOX) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/windows/SDL_windowsdialog.c) set(HAVE_SDL_DIALOG TRUE) elseif(MACOS) @@ -3051,7 +3166,7 @@ if (SDL_DIALOG) endif() sdl_sources("${SDL3_SOURCE_DIR}/src/process/SDL_process.c") -if(WINDOWS) +if(WINDOWS AND NOT GDK_GAMING_XBOX) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/process/windows/*.c") set(SDL_PROCESS_WINDOWS 1) set(HAVE_SDL_PROCESS TRUE) @@ -3120,6 +3235,10 @@ if(SDL_GPU) endif() if(WINDOWS) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.c") + sdl_glob_sources("${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.cpp") + if(GDK_GAMING_XBOX) + set_source_files_properties("${SDL3_SOURCE_DIR}/src/gpu/d3d12/SDL_gpu_d3d12.c" PROPERTIES LANGUAGE CXX CXX_STANDARD 17) + endif() set(SDL_GPU_D3D12 1) set(HAVE_SDL_GPU TRUE) endif()