From 3b191580c392b7a2f7ee7c8a586020817dc7dc05 Mon Sep 17 00:00:00 2001 From: chalonverse Date: Mon, 27 Jun 2022 17:19:39 +0000 Subject: [PATCH] Windows GDK Support (#5830) * Added GDK * Simplfied checks in SDL_config_wingdk.h * Added testgdk sample * Added GDK readme * Fixed error in merge of SDL_windows.h * Additional GDK fixes * OpenWatcom should not export _SDL_GDKGetTaskQueue * Formatting fixes * Moved initialization code into SDL_GDKRunApp --- VisualC-GDK/SDL.sln | 67 + VisualC-GDK/SDL/SDL.vcxproj | 521 +++++++ VisualC-GDK/SDL/SDL.vcxproj.filters | 1358 +++++++++++++++++ VisualC-GDK/SDLmain/SDLmain.vcxproj | 87 ++ VisualC-GDK/SDLtest/SDLtest.vcxproj | 102 ++ VisualC-GDK/clean.sh | 4 + VisualC-GDK/logos/Logo100x100.png | Bin 0 -> 10832 bytes VisualC-GDK/logos/Logo150x150.png | Bin 0 -> 12709 bytes VisualC-GDK/logos/Logo44x44.png | Bin 0 -> 7460 bytes VisualC-GDK/logos/Logo480x480.png | Bin 0 -> 28677 bytes .../testgamecontroller/MicrosoftGame.config | 34 + .../testgamecontroller/PackageLayout.xml | 9 + .../testgamecontroller.vcxproj | 183 +++ .../testgamecontroller.vcxproj.filters | 33 + .../tests/testgdk/MicrosoftGame.config | 34 + VisualC-GDK/tests/testgdk/PackageLayout.xml | 9 + VisualC-GDK/tests/testgdk/src/testgdk.cpp | 398 +++++ VisualC-GDK/tests/testgdk/testgdk.vcxproj | 167 ++ .../tests/testgdk/testgdk.vcxproj.filters | 30 + .../tests/testsprite2/MicrosoftGame.config | 34 + .../tests/testsprite2/PackageLayout.xml | 9 + .../tests/testsprite2/testsprite2.vcxproj | 167 ++ .../testsprite2/testsprite2.vcxproj.filters | 30 + docs/README-gdk.md | 154 ++ docs/README.md | 1 + include/SDL_config.h | 2 + include/SDL_config_wingdk.h | 285 ++++ include/SDL_cpuinfo.h | 2 +- include/SDL_main.h | 26 +- include/SDL_platform.h | 10 +- include/SDL_rwops.h | 2 +- include/SDL_stdinc.h | 8 +- include/SDL_system.h | 36 +- include/SDL_thread.h | 4 +- include/begin_code.h | 4 +- src/SDL.c | 8 +- src/SDL_assert.c | 6 +- src/SDL_log.c | 14 +- src/atomic/SDL_spinlock.c | 2 +- src/audio/wasapi/SDL_wasapi.c | 2 +- src/core/gdk/SDL_gdk.cpp | 177 +++ src/core/gdk/SDL_gdk.h | 24 + src/core/windows/SDL_windows.c | 4 +- src/core/windows/SDL_windows.h | 10 + src/cpuinfo/SDL_cpuinfo.c | 12 +- src/dynapi/SDL2.exports | 2 + src/dynapi/SDL_dynapi_overrides.h | 2 + src/dynapi/SDL_dynapi_procs.h | 22 +- src/events/SDL_events.c | 2 +- src/events/SDL_mouse.c | 8 +- src/events/SDL_sysevents.h | 2 +- src/file/SDL_rwops.c | 8 +- src/hidapi/SDL_hidapi.c | 20 +- src/joystick/SDL_gamecontroller.c | 2 +- src/joystick/SDL_joystick.c | 4 +- src/joystick/hidapi/SDL_hidapi_xboxone.c | 6 +- src/joystick/hidapi/SDL_hidapijoystick.c | 2 +- src/main/gdk/SDL_gdk_main.c | 41 + src/render/direct3d/SDL_render_d3d.c | 4 +- src/render/direct3d11/SDL_render_d3d11.c | 12 +- src/render/direct3d12/SDL_render_d3d12.c | 4 +- src/render/opengl/SDL_render_gl.c | 2 +- src/render/software/SDL_rotate.c | 2 +- src/stdlib/SDL_getenv.c | 8 +- src/stdlib/SDL_iconv.c | 2 +- src/video/SDL_video.c | 4 +- src/video/windows/SDL_windowsevents.c | 8 + test/testsprite2.c | 7 +- 68 files changed, 4150 insertions(+), 93 deletions(-) create mode 100644 VisualC-GDK/SDL.sln create mode 100644 VisualC-GDK/SDL/SDL.vcxproj create mode 100644 VisualC-GDK/SDL/SDL.vcxproj.filters create mode 100644 VisualC-GDK/SDLmain/SDLmain.vcxproj create mode 100644 VisualC-GDK/SDLtest/SDLtest.vcxproj create mode 100644 VisualC-GDK/clean.sh create mode 100644 VisualC-GDK/logos/Logo100x100.png create mode 100644 VisualC-GDK/logos/Logo150x150.png create mode 100644 VisualC-GDK/logos/Logo44x44.png create mode 100644 VisualC-GDK/logos/Logo480x480.png create mode 100644 VisualC-GDK/tests/testgamecontroller/MicrosoftGame.config create mode 100644 VisualC-GDK/tests/testgamecontroller/PackageLayout.xml create mode 100644 VisualC-GDK/tests/testgamecontroller/testgamecontroller.vcxproj create mode 100644 VisualC-GDK/tests/testgamecontroller/testgamecontroller.vcxproj.filters create mode 100644 VisualC-GDK/tests/testgdk/MicrosoftGame.config create mode 100644 VisualC-GDK/tests/testgdk/PackageLayout.xml create mode 100644 VisualC-GDK/tests/testgdk/src/testgdk.cpp create mode 100644 VisualC-GDK/tests/testgdk/testgdk.vcxproj create mode 100644 VisualC-GDK/tests/testgdk/testgdk.vcxproj.filters create mode 100644 VisualC-GDK/tests/testsprite2/MicrosoftGame.config create mode 100644 VisualC-GDK/tests/testsprite2/PackageLayout.xml create mode 100644 VisualC-GDK/tests/testsprite2/testsprite2.vcxproj create mode 100644 VisualC-GDK/tests/testsprite2/testsprite2.vcxproj.filters create mode 100644 docs/README-gdk.md create mode 100644 include/SDL_config_wingdk.h create mode 100644 src/core/gdk/SDL_gdk.cpp create mode 100644 src/core/gdk/SDL_gdk.h create mode 100644 src/main/gdk/SDL_gdk_main.c diff --git a/VisualC-GDK/SDL.sln b/VisualC-GDK/SDL.sln new file mode 100644 index 000000000..a52c78dc9 --- /dev/null +++ b/VisualC-GDK/SDL.sln @@ -0,0 +1,67 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32414.318 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{D69D5741-611F-4E14-8541-1FEE94F50B5A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL2", "SDL\SDL.vcxproj", "{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL2main", "SDLmain\SDLmain.vcxproj", "{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testsprite2", "tests\testsprite2\testsprite2.vcxproj", "{40FB7794-D3C3-4CFE-BCF4-A80C96635682}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL2test", "SDLtest\SDLtest.vcxproj", "{DA956FD3-E143-46F2-9FE5-C77BEBC56B1A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testgamecontroller", "tests\testgamecontroller\testgamecontroller.vcxproj", "{55812185-D13C-4022-9C81-32E0F4A08305}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testgdk", "tests\testgdk\testgdk.vcxproj", "{1C9A3F71-35A5-4C56-B292-F4375B3C3649}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Gaming.Desktop.x64 = Debug|Gaming.Desktop.x64 + Release|Gaming.Desktop.x64 = Release|Gaming.Desktop.x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {40FB7794-D3C3-4CFE-BCF4-A80C96635682}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {40FB7794-D3C3-4CFE-BCF4-A80C96635682}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {40FB7794-D3C3-4CFE-BCF4-A80C96635682}.Debug|Gaming.Desktop.x64.Deploy.0 = Debug|Gaming.Desktop.x64 + {40FB7794-D3C3-4CFE-BCF4-A80C96635682}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {40FB7794-D3C3-4CFE-BCF4-A80C96635682}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {40FB7794-D3C3-4CFE-BCF4-A80C96635682}.Release|Gaming.Desktop.x64.Deploy.0 = Release|Gaming.Desktop.x64 + {DA956FD3-E143-46F2-9FE5-C77BEBC56B1A}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {DA956FD3-E143-46F2-9FE5-C77BEBC56B1A}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {DA956FD3-E143-46F2-9FE5-C77BEBC56B1A}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {DA956FD3-E143-46F2-9FE5-C77BEBC56B1A}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {55812185-D13C-4022-9C81-32E0F4A08305}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {55812185-D13C-4022-9C81-32E0F4A08305}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {55812185-D13C-4022-9C81-32E0F4A08305}.Debug|Gaming.Desktop.x64.Deploy.0 = Debug|Gaming.Desktop.x64 + {55812185-D13C-4022-9C81-32E0F4A08305}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {55812185-D13C-4022-9C81-32E0F4A08305}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {55812185-D13C-4022-9C81-32E0F4A08305}.Release|Gaming.Desktop.x64.Deploy.0 = Release|Gaming.Desktop.x64 + {1C9A3F71-35A5-4C56-B292-F4375B3C3649}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {1C9A3F71-35A5-4C56-B292-F4375B3C3649}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {1C9A3F71-35A5-4C56-B292-F4375B3C3649}.Debug|Gaming.Desktop.x64.Deploy.0 = Debug|Gaming.Desktop.x64 + {1C9A3F71-35A5-4C56-B292-F4375B3C3649}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {1C9A3F71-35A5-4C56-B292-F4375B3C3649}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {1C9A3F71-35A5-4C56-B292-F4375B3C3649}.Release|Gaming.Desktop.x64.Deploy.0 = Release|Gaming.Desktop.x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {40FB7794-D3C3-4CFE-BCF4-A80C96635682} = {D69D5741-611F-4E14-8541-1FEE94F50B5A} + {55812185-D13C-4022-9C81-32E0F4A08305} = {D69D5741-611F-4E14-8541-1FEE94F50B5A} + {1C9A3F71-35A5-4C56-B292-F4375B3C3649} = {D69D5741-611F-4E14-8541-1FEE94F50B5A} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C320C9F2-1A8F-41D7-B02B-6338F872BCAD} + EndGlobalSection +EndGlobal diff --git a/VisualC-GDK/SDL/SDL.vcxproj b/VisualC-GDK/SDL/SDL.vcxproj new file mode 100644 index 000000000..ffcb9c01a --- /dev/null +++ b/VisualC-GDK/SDL/SDL.vcxproj @@ -0,0 +1,521 @@ + + + + + Debug + Gaming.Desktop.x64 + + + Release + Gaming.Desktop.x64 + + + + SDL2 + {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68} + SDL + 10.0 + + + + DynamicLibrary + $(DefaultPlatformToolset) + + + DynamicLibrary + $(DefaultPlatformToolset) + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + .\Debug/SDL.tlb + + + Disabled + $(ProjectDir)/../../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + DLL_EXPORT;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + Level3 + OldStyle + OnlyExplicitInline + true + + + _DEBUG;%(PreprocessorDefinitions) + + + setupapi.lib;winmm.lib;imm32.lib;version.lib;xgameruntime.lib;vcruntimed.lib;msvcrtd.lib;ucrtd.lib;msvcprtd.lib;%(AdditionalDependencies) + true + Windows + true + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + .\Release/SDL.tlb + + + $(ProjectDir)/../../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + DLL_EXPORT;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + Level3 + ProgramDatabase + OnlyExplicitInline + true + + + NDEBUG;%(PreprocessorDefinitions) + + + setupapi.lib;winmm.lib;imm32.lib;version.lib;xgameruntime.lib;vcruntime.lib;msvcrt.lib;ucrt.lib;msvcprt.lib;%(AdditionalDependencies) + true + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC-GDK/SDL/SDL.vcxproj.filters b/VisualC-GDK/SDL/SDL.vcxproj.filters new file mode 100644 index 000000000..8258e5a12 --- /dev/null +++ b/VisualC-GDK/SDL/SDL.vcxproj.filters @@ -0,0 +1,1358 @@ + + + + + {395b3af0-33d0-411b-b153-de1676bf1ef8} + + + {5a3e3167-75be-414f-8947-a5306df372b2} + + + {546d9ed1-988e-49d3-b1a5-e5b3d19de6c1} + + + {a56247ff-5108-4960-ba6a-6814fd1554ec} + + + {8880dfad-2a06-4e84-ab6e-6583641ad2d1} + + + {2b996a7f-f3e9-4300-a97f-2c907bcd89a9} + + + {5713d682-2bc7-4da4-bcf0-262a98f142eb} + + + {5e27e19f-b3f8-4e2d-b323-b00b2040ec86} + + + {a3ab9cff-8495-4a5c-8af6-27e43199a712} + + + {377061e4-3856-4f05-b916-0d3b360df0f6} + + + {226a6643-1c65-4c7f-92aa-861313d974bb} + + + {ef859522-a7fe-4a00-a511-d6a9896adf5b} + + + {01fd2642-4493-4316-b548-fb829f4c9125} + + + {cce7558f-590a-4f0a-ac0d-e579f76e588e} + + + {7a53c9e4-d4bd-40ed-9265-1625df685121} + + + {4c7a051c-ce7c-426c-bf8c-9187827f9052} + + + {97e2f79f-311b-42ea-81b2-e801649fdd93} + + + {baf97c8c-7e90-41e5-bff8-14051b8d3956} + + + {45e50d3a-56c9-4352-b811-0c60c49a2431} + + + {9d86e0ef-d6f6-4db2-bfc5-b3529406fa8d} + + + {b35fa13c-6ed2-4680-8c56-c7d71b76ceab} + + + {61b61b31-9e26-4171-a3bb-b969f1889726} + + + {f63aa216-6ee7-4143-90d3-32be3787f276} + + + {90bee923-89df-417f-a6c3-3e260a7dd54d} + + + {4c8ad943-c2fb-4014-9ca3-041e0ad08426} + + + {e90fa293-2828-4927-8113-35bf561024a9} + + + {3d68ae70-a9ff-46cf-be69-069f0b02aca0} + + + {ebc2fca3-3c26-45e3-815e-3e0581d5e226} + + + {47c445a2-7014-4e15-9660-7c89a27dddcf} + + + {d008487d-6ed0-4251-848b-79a68e3c1459} + + + {c9e8273e-13ae-47dc-bef8-8ad8e64c9a3d} + + + {0b8e136d-56ae-47e7-9981-e863a57ac616} + + + {bf3febd3-9328-43e8-b196-0fd3be8177dd} + + + {1a62dc68-52d2-4c07-9d81-d94dfe1d0d12} + + + {e9f01b22-34b3-4380-ade6-0e96c74e9c90} + + + {f674f22f-7841-4f3a-974e-c36b2d4823fc} + + + {d7ad92de-4e55-4202-9b2b-1bd9a35fe4dc} + + + {8311d79d-9ad5-4369-99fe-b2fb2659d402} + + + {6c4dfb80-fdf9-497c-a6ff-3cd8f22efde9} + + + {4810e35c-33cb-4da2-bfaf-452da20d3c9a} + + + {2cf93f1d-81fd-4bdc-998c-5e2fa43988bc} + + + {5752b7ab-2344-4f38-95ab-b5d3bc150315} + + + {7a0eae3d-f113-4914-b926-6816d1929250} + + + {ee602cbf-96a2-4b0b-92a9-51d38a727411} + + + {a812185b-9060-4a1c-8431-be4f66894626} + + + {31c16cdf-adc4-4950-8293-28ba530f3882} + + + {add61b53-8144-47d6-bd67-3420a87c4905} + + + {e7cdcf36-b462-49c7-98b7-07ea7b3687f4} + + + {82588eef-dcaa-4f69-b2a9-e675940ce54c} + + + {560239c3-8fa1-4d23-a81a-b8408b2f7d3f} + + + {81711059-7575-4ece-9e68-333b63e992c4} + + + {1e44970f-7535-4bfb-b8a5-ea0cea0349e0} + + + {1dd91224-1176-492b-a2cb-e26153394db0} + + + {e3ecfe50-cf22-41d3-8983-2fead5164b47} + + + {5521d22f-1e52-47a6-8c52-06a3b6bdefd7} + + + {4755f3a6-49ac-46d6-86be-21f5c21f2197} + + + {f48c2b17-1bee-4fec-a7c8-24cf619abe08} + + + {3ab60a46-e18e-450a-a916-328fb8547e59} + + + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + API Headers + + + + + + API Headers + + + API Headers + + + API Headers + + + audio + + + audio + + + audio + + + audio + + + core\windows + + + core\windows + + + core\windows + + + core\windows + + + dynapi + + + dynapi + + + dynapi + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + haptic + + + haptic + + + joystick + + + joystick + + + joystick + + + joystick + + + joystick + + + libm + + + libm + + + hidapi\hidapi + + + locale + + + misc + + + audio\directsound + + + audio\disk + + + audio\dummy + + + audio\winmm + + + audio\wasapi + + + haptic\windows + + + haptic\windows + + + haptic\windows + + + joystick\hidapi + + + joystick\hidapi + + + joystick\windows + + + joystick\windows + + + joystick\windows + + + joystick\windows + + + joystick\virtual + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video\dummy + + + video\dummy + + + video\dummy + + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + timer + + + thread + + + thread + + + thread\windows + + + thread\windows + + + thread\generic + + + sensor + + + sensor + + + sensor\dummy + + + sensor\windows + + + render + + + render + + + render + + + render\direct3d + + + render\direct3d11 + + + render\opengl + + + render\opengl + + + render\opengles2 + + + render\opengles2 + + + render\software + + + render\software + + + render\software + + + render\software + + + render\software + + + render\software + + + render\software + + + render\software + + + render\software + + + power + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + video\khronos\vulkan + + + + + + + render\direct3d12 + + + + API Headers + + + core\gdk + + + + + + + + + + + + + audio + + + audio + + + audio + + + audio + + + audio + + + audio + + + atomic + + + atomic + + + core\windows + + + core\windows + + + core\windows + + + cpuinfo + + + dynapi + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + events + + + file + + + filesystem\windows + + + haptic + + + hidapi + + + joystick + + + joystick + + + joystick + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + libm + + + loadso\windows + + + misc + + + misc\windows + + + locale\windows + + + locale + + + audio\directsound + + + audio\disk + + + audio\dummy + + + audio\winmm + + + audio\wasapi + + + audio\wasapi + + + haptic\windows + + + haptic\windows + + + haptic\windows + + + haptic\dummy + + + joystick\dummy + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\windows + + + joystick\windows + + + joystick\windows + + + joystick\windows + + + joystick\windows + + + joystick\virtual + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video + + + video\dummy + + + video\dummy + + + video\dummy + + + video\yuv2rgb + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + video\windows + + + timer + + + timer\windows + + + thread + + + thread\windows + + + thread\windows + + + thread\windows + + + thread\windows + + + thread\windows + + + thread\generic + + + stdlib + + + stdlib + + + stdlib + + + stdlib + + + stdlib + + + stdlib + + + stdlib + + + stdlib + + + sensor + + + sensor\dummy + + + sensor\windows + + + render + + + render + + + render + + + render\direct3d + + + render\direct3d + + + render\direct3d11 + + + render\direct3d11 + + + render\opengl + + + render\opengl + + + render\opengles2 + + + render\opengles2 + + + render\software + + + render\software + + + render\software + + + render\software + + + render\software + + + render\software + + + render\software + + + render\software + + + power + + + + power\windows + + + render\direct3d12 + + + render\direct3d12 + + + stdlib + + + stdlib + + + core\gdk + + + + + + \ No newline at end of file diff --git a/VisualC-GDK/SDLmain/SDLmain.vcxproj b/VisualC-GDK/SDLmain/SDLmain.vcxproj new file mode 100644 index 000000000..1d27a6333 --- /dev/null +++ b/VisualC-GDK/SDLmain/SDLmain.vcxproj @@ -0,0 +1,87 @@ + + + + + Debug + Gaming.Desktop.x64 + + + Release + Gaming.Desktop.x64 + + + + + + + SDL2main + {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A} + SDLmain + 10.0 + + + + StaticLibrary + $(DefaultPlatformToolset) + + + StaticLibrary + $(DefaultPlatformToolset) + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + + + + + $(ProjectDir)/../../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + MultiThreadedDLL + false + Level3 + OldStyle + true + + + + + + Disabled + $(ProjectDir)/../../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + false + Level3 + OldStyle + true + + + + + + \ No newline at end of file diff --git a/VisualC-GDK/SDLtest/SDLtest.vcxproj b/VisualC-GDK/SDLtest/SDLtest.vcxproj new file mode 100644 index 000000000..1487ad7a2 --- /dev/null +++ b/VisualC-GDK/SDLtest/SDLtest.vcxproj @@ -0,0 +1,102 @@ + + + + + Debug + Gaming.Desktop.x64 + + + Release + Gaming.Desktop.x64 + + + + SDL2test + {DA956FD3-E143-46F2-9FE5-C77BEBC56B1A} + SDLtest + 10.0 + + + + StaticLibrary + $(DefaultPlatformToolset) + + + StaticLibrary + $(DefaultPlatformToolset) + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + + + + + $(ProjectDir)/../../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + MultiThreadedDLL + false + Level3 + OldStyle + true + + + + + + Disabled + $(ProjectDir)/../../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + false + Level3 + OldStyle + true + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC-GDK/clean.sh b/VisualC-GDK/clean.sh new file mode 100644 index 000000000..a23f06b54 --- /dev/null +++ b/VisualC-GDK/clean.sh @@ -0,0 +1,4 @@ +#!/bin/sh +find . -type f \( -name '*.user' -o -name '*.sdf' -o -name '*.ncb' -o -name '*.suo' \) -print -delete +find . -type f \( -name '*.bmp' -o -name '*.wav' -o -name '*.dat' \) -print -delete +find . -depth -type d \( -name Gaming.Desktop.x64 \) -exec rm -rv {} \; diff --git a/VisualC-GDK/logos/Logo100x100.png b/VisualC-GDK/logos/Logo100x100.png new file mode 100644 index 0000000000000000000000000000000000000000..2d0333dbd273699a1513b8d2afaa40555bff986b GIT binary patch literal 10832 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 literal 0 HcmV?d00001 diff --git a/VisualC-GDK/logos/Logo150x150.png b/VisualC-GDK/logos/Logo150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..046a8fb142c1bd3c161f5640e534c3215a348103 GIT binary patch literal 12709 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 literal 0 HcmV?d00001 diff --git a/VisualC-GDK/logos/Logo44x44.png b/VisualC-GDK/logos/Logo44x44.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca25b565e0073f90af055eb44e449cf42aec262 GIT binary patch literal 7460 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 iL=s6Pkwg-oUHli9?UpW?NmoYz0000 literal 0 HcmV?d00001 diff --git a/VisualC-GDK/logos/Logo480x480.png b/VisualC-GDK/logos/Logo480x480.png new file mode 100644 index 0000000000000000000000000000000000000000..11231500eb28e235b4b344ef60b4080c6bd38a52 GIT binary patch literal 28677 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 literal 0 HcmV?d00001 diff --git a/VisualC-GDK/tests/testgamecontroller/MicrosoftGame.config b/VisualC-GDK/tests/testgamecontroller/MicrosoftGame.config new file mode 100644 index 000000000..6a9ea2bf8 --- /dev/null +++ b/VisualC-GDK/tests/testgamecontroller/MicrosoftGame.config @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + 7325F784 + 0000000000000000 + + + \ No newline at end of file diff --git a/VisualC-GDK/tests/testgamecontroller/PackageLayout.xml b/VisualC-GDK/tests/testgamecontroller/PackageLayout.xml new file mode 100644 index 000000000..cda188c7c --- /dev/null +++ b/VisualC-GDK/tests/testgamecontroller/PackageLayout.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/VisualC-GDK/tests/testgamecontroller/testgamecontroller.vcxproj b/VisualC-GDK/tests/testgamecontroller/testgamecontroller.vcxproj new file mode 100644 index 000000000..1d90d6688 --- /dev/null +++ b/VisualC-GDK/tests/testgamecontroller/testgamecontroller.vcxproj @@ -0,0 +1,183 @@ + + + + + Debug + Gaming.Desktop.x64 + + + Release + Gaming.Desktop.x64 + + + + {55812185-D13C-4022-9C81-32E0F4A08305} + testgamecontroller + 10.0 + + + + Application + $(DefaultPlatformToolset) + + + Application + $(DefaultPlatformToolset) + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + .\Release/testgamecontroller.tlb + + + $(SolutionDir)/../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + Level3 + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + Windows + xgameruntime.lib;../Microsoft.Xbox.Services.141.GDK.C.Thunks.lib;%(AdditionalDependencies) + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + .\Debug/testgamecontroller.tlb + + + Disabled + $(SolutionDir)/../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + OldStyle + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + true + Windows + xgameruntime.lib;../Microsoft.Xbox.Services.141.GDK.C.Thunks.lib;%(AdditionalDependencies) + + + + + {81ce8daf-ebb2-4761-8e45-b71abcca8c68} + false + false + true + + + {da956fd3-e142-46f2-9dd5-c78bebb56b7a} + false + false + true + + + + + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + + + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + + + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + + + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + + + + + + + + + Document + + + + + + + + + + + + + + Document + + + + + + \ No newline at end of file diff --git a/VisualC-GDK/tests/testgamecontroller/testgamecontroller.vcxproj.filters b/VisualC-GDK/tests/testgamecontroller/testgamecontroller.vcxproj.filters new file mode 100644 index 000000000..b9ffafc1b --- /dev/null +++ b/VisualC-GDK/tests/testgamecontroller/testgamecontroller.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + + + + + + + + + logos + + + logos + + + logos + + + logos + + + + + + + + {5e858cf0-6fba-498d-b33d-11c8ecbb79c7} + + + \ No newline at end of file diff --git a/VisualC-GDK/tests/testgdk/MicrosoftGame.config b/VisualC-GDK/tests/testgdk/MicrosoftGame.config new file mode 100644 index 000000000..f1ab0338e --- /dev/null +++ b/VisualC-GDK/tests/testgdk/MicrosoftGame.config @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + 7325F784 + 0000000000000000 + + + \ No newline at end of file diff --git a/VisualC-GDK/tests/testgdk/PackageLayout.xml b/VisualC-GDK/tests/testgdk/PackageLayout.xml new file mode 100644 index 000000000..f09b2e577 --- /dev/null +++ b/VisualC-GDK/tests/testgdk/PackageLayout.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/VisualC-GDK/tests/testgdk/src/testgdk.cpp b/VisualC-GDK/tests/testgdk/src/testgdk.cpp new file mode 100644 index 000000000..377d48315 --- /dev/null +++ b/VisualC-GDK/tests/testgdk/src/testgdk.cpp @@ -0,0 +1,398 @@ +/* + Copyright (C) 1997-2022 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely. +*/ +/* testgdk: Basic tests of using task queue/xbl (with simple drawing) in GDK. + * NOTE: As of June 2022 GDK, login will only work if MicrosoftGame.config is + * configured properly. See README-gdk.md. + */ + +#include +#include +#include + +#include "SDL_test.h" +#include "SDL_test_common.h" +#include "../src/core/windows/SDL_windows.h" + +extern "C" { +#include "../test/testutils.h" +} + +#include + +#define NUM_SPRITES 100 +#define MAX_SPEED 1 + +static SDLTest_CommonState *state; +static int num_sprites; +static SDL_Texture **sprites; +static SDL_bool cycle_color; +static SDL_bool cycle_alpha; +static int cycle_direction = 1; +static int current_alpha = 0; +static int current_color = 0; +static int sprite_w, sprite_h; +static SDL_BlendMode blendMode = SDL_BLENDMODE_BLEND; + +int done; + +/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ +static void +quit(int rc) +{ + SDL_free(sprites); + SDLTest_CommonQuit(state); + /* If rc is 0, just let main return normally rather than calling exit. + * This allows testing of platforms where SDL_main is required and does meaningful cleanup. + */ + if (rc != 0) { + exit(rc); + } +} + +void +UserLoggedIn(XUserHandle user) +{ + HRESULT hr; + char gamertag[128]; + hr = XUserGetGamertag(user, XUserGamertagComponent::UniqueModern, sizeof(gamertag), gamertag, NULL); + + if (SUCCEEDED(hr)) { + SDL_Log("User logged in: %s", gamertag); + } else { + SDL_Log("[GDK] UserLoggedIn -- XUserGetGamertag failed: 0x%08x.", hr); + } + + XUserCloseHandle(user); +} + +void +AddUserUICallback(XAsyncBlock *asyncBlock) +{ + HRESULT hr; + XUserHandle user = NULL; + + hr = XUserAddResult(asyncBlock, &user); + if (SUCCEEDED(hr)) { + uint64_t userId; + + hr = XUserGetId(user, &userId); + if (FAILED(hr)) { + /* If unable to get the user ID, it means the account is banned, etc. */ + SDL_Log("[GDK] AddUserSilentCallback -- XUserGetId failed: 0x%08x.", hr); + XUserCloseHandle(user); + + /* Per the docs, likely should call XUserResolveIssueWithUiAsync here. */ + } else { + UserLoggedIn(user); + } + } else { + SDL_Log("[GDK] AddUserUICallback -- XUserAddAsync failed: 0x%08x.", hr); + } + + delete asyncBlock; +} + +void +AddUserUI() +{ + HRESULT hr; + XAsyncBlock *asyncBlock = new XAsyncBlock; + + asyncBlock->context = NULL; + asyncBlock->queue = NULL; /* A null queue will use the global process task queue */ + asyncBlock->callback = &AddUserUICallback; + + hr = XUserAddAsync(XUserAddOptions::None, asyncBlock); + + if (FAILED(hr)) { + delete asyncBlock; + SDL_Log("[GDK] AddUserSilent -- failed: 0x%08x", hr); + } +} + +void +AddUserSilentCallback(XAsyncBlock *asyncBlock) +{ + HRESULT hr; + XUserHandle user = NULL; + + hr = XUserAddResult(asyncBlock, &user); + if (SUCCEEDED(hr)) { + uint64_t userId; + + hr = XUserGetId(user, &userId); + if (FAILED(hr)) { + /* If unable to get the user ID, it means the account is banned, etc. */ + SDL_Log("[GDK] AddUserSilentCallback -- XUserGetId failed: 0x%08x. Trying with UI.", hr); + XUserCloseHandle(user); + AddUserUI(); + } else { + UserLoggedIn(user); + } + } else { + SDL_Log("[GDK] AddUserSilentCallback -- XUserAddAsync failed: 0x%08x. Trying with UI.", hr); + AddUserUI(); + } + + delete asyncBlock; +} + +void +AddUserSilent() +{ + HRESULT hr; + XAsyncBlock *asyncBlock = new XAsyncBlock; + + asyncBlock->context = NULL; + asyncBlock->queue = NULL; /* A null queue will use the global process task queue */ + asyncBlock->callback = &AddUserSilentCallback; + + hr = XUserAddAsync(XUserAddOptions::AddDefaultUserSilently, asyncBlock); + + if (FAILED(hr)) { + delete asyncBlock; + SDL_Log("[GDK] AddUserSilent -- failed: 0x%08x", hr); + } +} + +int +LoadSprite(const char *file) +{ + int i; + + for (i = 0; i < state->num_windows; ++i) { + /* This does the SDL_LoadBMP step repeatedly, but that's OK for test code. */ + sprites[i] = LoadTexture(state->renderers[i], file, SDL_TRUE, &sprite_w, &sprite_h); + if (!sprites[i]) { + return (-1); + } + if (SDL_SetTextureBlendMode(sprites[i], blendMode) < 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't set blend mode: %s\n", SDL_GetError()); + SDL_DestroyTexture(sprites[i]); + return (-1); + } + } + + /* We're ready to roll. :) */ + return (0); +} + +void +DrawSprites(SDL_Renderer * renderer, SDL_Texture * sprite) +{ + SDL_Rect viewport, temp; + + /* Query the sizes */ + SDL_RenderGetViewport(renderer, &viewport); + + /* Cycle the color and alpha, if desired */ + if (cycle_color) { + current_color += cycle_direction; + if (current_color < 0) { + current_color = 0; + cycle_direction = -cycle_direction; + } + if (current_color > 255) { + current_color = 255; + cycle_direction = -cycle_direction; + } + SDL_SetTextureColorMod(sprite, 255, (Uint8) current_color, + (Uint8) current_color); + } + if (cycle_alpha) { + current_alpha += cycle_direction; + if (current_alpha < 0) { + current_alpha = 0; + cycle_direction = -cycle_direction; + } + if (current_alpha > 255) { + current_alpha = 255; + cycle_direction = -cycle_direction; + } + SDL_SetTextureAlphaMod(sprite, (Uint8) current_alpha); + } + + /* Draw a gray background */ + SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); + SDL_RenderClear(renderer); + + /* Test points */ + SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF); + SDL_RenderDrawPoint(renderer, 0, 0); + SDL_RenderDrawPoint(renderer, viewport.w-1, 0); + SDL_RenderDrawPoint(renderer, 0, viewport.h-1); + SDL_RenderDrawPoint(renderer, viewport.w-1, viewport.h-1); + + /* Test horizontal and vertical lines */ + SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF); + SDL_RenderDrawLine(renderer, 1, 0, viewport.w-2, 0); + SDL_RenderDrawLine(renderer, 1, viewport.h-1, viewport.w-2, viewport.h-1); + SDL_RenderDrawLine(renderer, 0, 1, 0, viewport.h-2); + SDL_RenderDrawLine(renderer, viewport.w-1, 1, viewport.w-1, viewport.h-2); + + /* Test fill and copy */ + SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); + temp.x = 1; + temp.y = 1; + temp.w = sprite_w; + temp.h = sprite_h; + SDL_RenderFillRect(renderer, &temp); + SDL_RenderCopy(renderer, sprite, NULL, &temp); + temp.x = viewport.w-sprite_w-1; + temp.y = 1; + temp.w = sprite_w; + temp.h = sprite_h; + SDL_RenderFillRect(renderer, &temp); + SDL_RenderCopy(renderer, sprite, NULL, &temp); + temp.x = 1; + temp.y = viewport.h-sprite_h-1; + temp.w = sprite_w; + temp.h = sprite_h; + SDL_RenderFillRect(renderer, &temp); + SDL_RenderCopy(renderer, sprite, NULL, &temp); + temp.x = viewport.w-sprite_w-1; + temp.y = viewport.h-sprite_h-1; + temp.w = sprite_w; + temp.h = sprite_h; + SDL_RenderFillRect(renderer, &temp); + SDL_RenderCopy(renderer, sprite, NULL, &temp); + + /* Test diagonal lines */ + SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF); + SDL_RenderDrawLine(renderer, sprite_w, sprite_h, + viewport.w-sprite_w-2, viewport.h-sprite_h-2); + SDL_RenderDrawLine(renderer, viewport.w-sprite_w-2, sprite_h, + sprite_w, viewport.h-sprite_h-2); + + /* Update the screen! */ + SDL_RenderPresent(renderer); +} + +void +loop() +{ + int i; + SDL_Event event; + + /* Check for events */ + while (SDL_PollEvent(&event)) { + SDLTest_CommonEvent(state, &event, &done); + } + for (i = 0; i < state->num_windows; ++i) { + if (state->windows[i] == NULL) + continue; + DrawSprites(state->renderers[i], sprites[i]); + } +} + +int +main(int argc, char *argv[]) +{ + int i; + const char *icon = "icon.bmp"; + + /* Initialize parameters */ + num_sprites = NUM_SPRITES; + + /* Initialize test framework */ + state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO); + if (!state) { + return 1; + } + + for (i = 1; i < argc;) { + int consumed; + + consumed = SDLTest_CommonArg(state, i); + if (consumed == 0) { + consumed = -1; + if (SDL_strcasecmp(argv[i], "--blend") == 0) { + if (argv[i + 1]) { + if (SDL_strcasecmp(argv[i + 1], "none") == 0) { + blendMode = SDL_BLENDMODE_NONE; + consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) { + blendMode = SDL_BLENDMODE_BLEND; + consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) { + blendMode = SDL_BLENDMODE_ADD; + consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) { + blendMode = SDL_BLENDMODE_MOD; + consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "sub") == 0) { + blendMode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_SUBTRACT, SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_SUBTRACT); + consumed = 2; + } + } + } else if (SDL_strcasecmp(argv[i], "--cyclecolor") == 0) { + cycle_color = SDL_TRUE; + consumed = 1; + } else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) { + cycle_alpha = SDL_TRUE; + consumed = 1; + } else if (SDL_isdigit(*argv[i])) { + num_sprites = SDL_atoi(argv[i]); + consumed = 1; + } else if (argv[i][0] != '-') { + icon = argv[i]; + consumed = 1; + } + } + if (consumed < 0) { + static const char *options[] = { + "[--blend none|blend|add|mod]", + "[--cyclecolor]", + "[--cyclealpha]", + "[num_sprites]", + "[icon.bmp]", + NULL }; + SDLTest_CommonLogUsage(state, argv[0], options); + quit(1); + } + i += consumed; + } + if (!SDLTest_CommonInit(state)) { + quit(2); + } + + /* Create the windows, initialize the renderers, and load the textures */ + sprites = + (SDL_Texture **) SDL_malloc(state->num_windows * sizeof(*sprites)); + if (!sprites) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory!\n"); + quit(2); + } + for (i = 0; i < state->num_windows; ++i) { + SDL_Renderer *renderer = state->renderers[i]; + SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); + SDL_RenderClear(renderer); + } + if (LoadSprite(icon) < 0) { + quit(2); + } + + /* Main render loop */ + done = 0; + + /* Try to add the default user silently */ + AddUserSilent(); + + while (!done) { + loop(); + } + + quit(0); + return 0; +} + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/VisualC-GDK/tests/testgdk/testgdk.vcxproj b/VisualC-GDK/tests/testgdk/testgdk.vcxproj new file mode 100644 index 000000000..bcb57363d --- /dev/null +++ b/VisualC-GDK/tests/testgdk/testgdk.vcxproj @@ -0,0 +1,167 @@ + + + + + Debug + Gaming.Desktop.x64 + + + Release + Gaming.Desktop.x64 + + + + {1C9A3F71-35A5-4C56-B292-F4375B3C3649} + testsprite2 + 10.0 + + + + Application + $(DefaultPlatformToolset) + + + Application + $(DefaultPlatformToolset) + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + .\Release/testsprite2.tlb + + + $(SolutionDir)/../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + Level3 + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + Windows + xgameruntime.lib;../Microsoft.Xbox.Services.141.GDK.C.Thunks.lib;%(AdditionalDependencies) + + + + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + .\Debug/testsprite2.tlb + + + Disabled + $(SolutionDir)/../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + OldStyle + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + true + Windows + xgameruntime.lib;../Microsoft.Xbox.Services.141.GDK.C.Thunks.lib;%(AdditionalDependencies) + + + + + + + + + {81ce8daf-ebb2-4761-8e45-b71abcca8c68} + false + false + true + + + {da956fd3-e142-46f2-9dd5-c78bebb56b7a} + false + false + true + + + {da956fd3-e143-46f2-9fe5-c77bebc56b1a} + false + false + true + + + + + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" +copy "%(FullPath)" "$(OutDir)\" + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" +copy "%(FullPath)" "$(OutDir)\" + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + + + + + + + + + Document + + + + + Document + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC-GDK/tests/testgdk/testgdk.vcxproj.filters b/VisualC-GDK/tests/testgdk/testgdk.vcxproj.filters new file mode 100644 index 000000000..4a143d855 --- /dev/null +++ b/VisualC-GDK/tests/testgdk/testgdk.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + + + + + + + logos + + + logos + + + logos + + + logos + + + + + + + {c3c871f2-c7b7-4025-8ba4-037dde717fe1} + + + \ No newline at end of file diff --git a/VisualC-GDK/tests/testsprite2/MicrosoftGame.config b/VisualC-GDK/tests/testsprite2/MicrosoftGame.config new file mode 100644 index 000000000..6b76188a5 --- /dev/null +++ b/VisualC-GDK/tests/testsprite2/MicrosoftGame.config @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + 7325F784 + 0000000000000000 + + + \ No newline at end of file diff --git a/VisualC-GDK/tests/testsprite2/PackageLayout.xml b/VisualC-GDK/tests/testsprite2/PackageLayout.xml new file mode 100644 index 000000000..62ca97bbe --- /dev/null +++ b/VisualC-GDK/tests/testsprite2/PackageLayout.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/VisualC-GDK/tests/testsprite2/testsprite2.vcxproj b/VisualC-GDK/tests/testsprite2/testsprite2.vcxproj new file mode 100644 index 000000000..1d1c8870d --- /dev/null +++ b/VisualC-GDK/tests/testsprite2/testsprite2.vcxproj @@ -0,0 +1,167 @@ + + + + + Debug + Gaming.Desktop.x64 + + + Release + Gaming.Desktop.x64 + + + + {40FB7794-D3C3-4CFE-BCF4-A80C96635682} + testsprite2 + 10.0 + + + + Application + $(DefaultPlatformToolset) + + + Application + $(DefaultPlatformToolset) + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + .\Release/testsprite2.tlb + + + $(SolutionDir)/../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + Level3 + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + Windows + xgameruntime.lib;../Microsoft.Xbox.Services.141.GDK.C.Thunks.lib;%(AdditionalDependencies) + + + + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + .\Debug/testsprite2.tlb + + + Disabled + $(SolutionDir)/../include;%(AdditionalIncludeDirectories) + %(AdditionalUsingDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + OldStyle + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + true + Windows + xgameruntime.lib;../Microsoft.Xbox.Services.141.GDK.C.Thunks.lib;%(AdditionalDependencies) + + + + + + + + + {81ce8daf-ebb2-4761-8e45-b71abcca8c68} + false + false + true + + + {da956fd3-e142-46f2-9dd5-c78bebb56b7a} + false + false + true + + + {da956fd3-e143-46f2-9fe5-c77bebc56b1a} + false + false + true + + + + + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" +copy "%(FullPath)" "$(OutDir)\" + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy "%(FullPath)" "$(ProjectDir)\" +copy "%(FullPath)" "$(OutDir)\" + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + + + + + + + + + Document + + + + + Document + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC-GDK/tests/testsprite2/testsprite2.vcxproj.filters b/VisualC-GDK/tests/testsprite2/testsprite2.vcxproj.filters new file mode 100644 index 000000000..19672bfad --- /dev/null +++ b/VisualC-GDK/tests/testsprite2/testsprite2.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + + + + + + + logos + + + logos + + + logos + + + logos + + + + + + + {c3c871f2-c7b7-4025-8ba4-037dde717fe1} + + + \ No newline at end of file diff --git a/docs/README-gdk.md b/docs/README-gdk.md new file mode 100644 index 000000000..a59213e77 --- /dev/null +++ b/docs/README-gdk.md @@ -0,0 +1,154 @@ +GDK +===== + +This port allows SDL applications to run via Microsoft's Game Development Kit (GDK). + +At this time, only Windows GDK is supported. Xbox support is slated for the future. + + +Requirements +------------ + +* Microsoft Visual Studio 2022 (in theory, it should also work in 2017 or 2019, but this has not been tested) +* Microsoft GDK June 2022 or newer (public release [here](https://github.com/microsoft/GDK/releases/tag/June_2022)) +* To publish a package or successfully authenticate a user, you will need to create an app id/configure services in Partner Center. However, for local testing purposes (without authenticating on Xbox Live), the identifiers used by the GDK test programs in the included solution will work. + + +Windows GDK Status +------ + +The Windows GDK port supports the full set of Win32 APIs, renderers, controllers, input devices, etc., as the normal Windows x64 build of SDL. + +* Additionally, the GDK port adds the following: + * Compile-time platform detection for SDL programs. The `__GDK__` is `#define`d on every GDK platform, and the `__WINGDK__` is `#define`d on Windows GDK, specifically. (This distinction exists because other GDK platforms support a smaller subset of functionality. This allows you to mark code for "any" GDK separate from Windows GDK.) + * GDK-specific setup: + * Initializing/uninitializing the game runtime, and initializing Xbox Live services + * Creating a global task queue and setting it as the default for the process. When running any async operations, passing in `NULL` as the task queue will make the task get added to the global task queue. + + * An implementation on `WinMain` that performs the above GDK setup (you should link against SDL2main.lib, as in Windows x64). If you are unable to do this, you can instead manually call `SDL_GDKRunApp` from your entry point, passing in your `SDL_main` function and `NULL` as the parameters. + * Global task queue callbacks are dispatched during `SDL_PumpEvents` (which is also called internally if using `SDL_PollEvent`). + * You can get the handle of the global task queue through `SDL_GDKGetTaskQueue`, if needed. When done with the queue, be sure to use `XTaskQueueCloseHandle` to decrement the reference count (otherwise it will cause a resource leak). + +* What doesn't work: + * Compilation with anything other than through the included Visual C++ solution file + +## VisualC-GDK Solution + +The included `VisualC-GDK/SDL.sln` solution includes the following targets for the Gaming.Desktop.x64 configuration: + +* SDL2 (DLL) - This is the typical SDL2.dll, but for Gaming.Desktop.x64. +* SDL2main (lib) - This contains a drop-in implementation of `WinMain` that is used as the entry point for GDK programs. +* tests/testgamecontroller - Standard SDL test program demonstrating controller functionality. +* tests/testgdk - GDK-specific test program that demonstrates using the global task queue to login a user into Xbox Live. + *NOTE*: As of the June 2022 GDK, you cannot test user logins without a valid Title ID and MSAAppId. You will need to manually change the identifiers in the `MicrosoftGame.config` to your valid IDs from Partner Center if you wish to test this. +* tests/testsprite2 - Standard SDL test program demonstrating sprite drawing functionality. + +If you set one of the test programs as a startup project, you can run it directly from Visual Studio. + +Windows GDK Setup, Detailed Steps +--------------------- + +These steps assume you already have a game using SDL that runs on Windows x64 along with a corresponding Visual Studio solution file for the x64 version. If you don't have this, it's easiest to use one of the test program vcxproj files in the `VisualC-GDK` directory as a starting point, though you will still need to do most of the steps below. + +### 1. Add a Gaming.Desktop.x64 Configuration ### + +In your game's existing Visual Studio Solution, go to Build > Configuration Manager. From the "Active solution platform" drop-down select "New...". From the drop-down list, select Gaming.Desktop.x64 and copy the settings from the x64 configuration. + +### 2. Build SDL2 and SDL2main for GDK ### + +Open `VisualC-GDK/SDL.sln` in Visual Studio, you need to build the SDL2 and SDL2main targets (Release is recommended). You will need to copy/keep track of the `SDL2.dll`, `SDL2.lib`, and `SDL2main.lib` output files for your game project. + +*Alternatively*, you could setup your solution file to instead reference the SDL2/SDL2main project file targets from the SDL source, and add those projects as a dependency. This would mean that SDL2 and SDL2main would both be built when your game is built. + +### 3. Configuring Project Settings ### + +While the Gaming.Desktop.x64 configuration sets most of the required settings, there are some additional items to configure for your game project under the Gaming.Desktop.x64 Configuration: + +* Under C/C++ > General > Additional Include Directories, make sure the `SDL/include` path is referenced +* Under Linker > General > Additional Library Directories, make sure to reference the path where the newly-built SDL2.lib and SDL2main.lib are +* Under Linker > Input > Additional Dependencies, you need the following: + * `SDL2.lib` + * `SDL2main.lib` (unless not using) + * `xgameruntime.lib` + * `../Microsoft.Xbox.Services.141.GDK.C.Thunks.lib` +* Note that in general, the GDK libraries depend on the MSVC C/C++ runtime, so there is no way to remove this dependency from a GDK program that links against GDK. + +### 4. Setting up SDL_main ### + +Rather than using your own implementation of `WinMain`, it's recommended that you instead `#include "SDL_main.h"` and declare a standard main function. If you are unable to do this, you can instead manually call `SDL_GDKRunApp` from your entry point, passing in your `SDL_main` function and `NULL` as the parameters. + +### 5. Required DLLs ### + +The game will not launch in the debugger unless required DLLs are included in the directory that contains the game's .exe file. You need to make sure that the following files are copied into the directory: + +* Your SDL2.dll +* "$(Console_GRDKExtLibRoot)Xbox.Services.API.C\DesignTime\CommonConfiguration\Neutral\Lib\Release\Microsoft.Xbox.Services.141.GDK.C.Thunks.dll" + +You can either copy these in a post-build step, or you can add the dlls into the project and set its Configuration Properties > General > Item type to "Copy file," which will also copy them into the output directory. + +### 6. Setting up MicrosoftGame.config ### + +You can copy `VisualC-GDK/tests/testgdk/MicrosoftGame.config` and use that as a starting point in your project. Minimally, you will want to change the Executable Name attribute, the DefaultDisplayName, and the Description. + +This file must be copied into the same directory as the game's .exe file. As with the DLLs, you can either use a post-build step or the "Copy file" item type. + +For basic testing, you do not need to change anything else in `MicrosoftGame.config`. However, if you want to test any Xbox Live services (such as logging in users) _or_ publish a package, you will need to setup a Game app on Partner Center. + +Then, you need to set the following values to the values from Partner Center: + +* Identity tag - Name and Publisher attributes +* TitleId +* MSAAppId + +### 7. Adding Required Logos + +Several logo PNG files are required to be able to launch the game, even from the debugger. You can use the sample logos provided in `VisualC-GDK/logos`. As with the other files, they must be copied into the same directory as the game's .exe file. + + +### 8. Copying any Data Files ### + +When debugging GDK games, there is no way to specify a working directory. Therefore, any required game data must also be copied into the output directory, likely in a post-build step. + + +### 9. Build and Run from Visual Studio ### + +At this point, you should be able to build and run your game from the Visual Studio Debugger. If you get any linker errors, make sure you double-check that you referenced all the required libs. + +If you are testing Xbox Live functionality, it's likely you will need to change to the Sandbox for your title. To do this: + +1. Run "Desktop VS 2022 Gaming Command Prompt" from the Start Menu +2. Switch the sandbox name with: + `XblPCSandbox SANDBOX.#` +3. (To switch back to the retail sandbox): + `XblPCSandbox RETAIL` + +### 10. Packaging and Installing Locally + +You can use one of the test program's `PackageLayout.xml` as a starting point. Minimally, you will need to change the exe to the correct name and also reference any required game data. As with the other data files, it's easiest if you have this copy to the output directory, although it's not a requirement as you can specify relative paths to files. + +To create the package: + +1. Run "Desktop VS 2022 Gaming Command Prompt" from the Start Menu +2. `cd` to the directory containing the `PackageLayout.xml` with the correct paths (if you use the local path as in the sample package layout, this would be from your .exe output directory) +3. `mkdir Package` to create an output directory +4. To package the file into the `Package` directory, use: + `makepkg pack /f PackageLayout.xml /lt /d . /nogameos /pc /pd Package` +5. To install the package, use: + `wdapp install PACKAGENAME.msixvc` +6. Once the package is installed, you can run it from the start menu. +7. As with when running from Visual Studio, if you need to test any Xbox Live functionality you must switch to the correct sandbox. + + +Troubleshooting +--------------- + +#### Xbox Live Login does not work + +As of June 2022 GDK, you must have a valid Title Id and MSAAppId in order to test Xbox Live functionality such as user login. Make sure these are set correctly in the `MicrosoftGame.config`. This means that even testgdk will not let you login without setting these properties to valid values. + +Furthermore, confirm that your PC is set to the correct sandbox. + + +#### "The current user has already installed an unpackaged version of this app. A packaged version cannot replace this." error when installing + +Prior to June 2022 GDK, running from the Visual Studio debugger would still locally register the app (and it would appear on the start menu). To fix this, you have to uninstall it (it's simplest to right click on it from the start menu to uninstall it). diff --git a/docs/README.md b/docs/README.md index 15025efa9..99ec22879 100644 --- a/docs/README.md +++ b/docs/README.md @@ -34,6 +34,7 @@ More documentation and FAQs are available online at [the wiki](http://wiki.libsd - [DirectFB](README-directfb.md) - [DynAPI](README-dynapi.md) - [Emscripten](README-emscripten.md) +- [GDK](README-gdk.md) - [Gesture](README-gesture.md) - [Git](README-git.md) - [iOS](README-ios.md) diff --git a/include/SDL_config.h b/include/SDL_config.h index 749988515..003467907 100644 --- a/include/SDL_config.h +++ b/include/SDL_config.h @@ -33,6 +33,8 @@ #include "SDL_config_windows.h" #elif defined(__WINRT__) #include "SDL_config_winrt.h" +#elif defined(__WINGDK__) +#include "SDL_config_wingdk.h" #elif defined(__MACOSX__) #include "SDL_config_macosx.h" #elif defined(__IPHONEOS__) diff --git a/include/SDL_config_wingdk.h b/include/SDL_config_wingdk.h new file mode 100644 index 000000000..d456024f2 --- /dev/null +++ b/include/SDL_config_wingdk.h @@ -0,0 +1,285 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_config_wingdk_h_ +#define SDL_config_wingdk_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/* Windows GDK does not need Windows SDK version checks because it requires + * a recent version of the Windows 10 SDK. */ + +#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H) +/* At this time, only recent MSVC or clang are supported by Windows GDK */ +#if defined(__clang__) +#define HAVE_STDINT_H 1 +#elif defined(_MSC_VER) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +typedef unsigned __int64 uintptr_t; +#define _UINTPTR_T_DEFINED +#endif +#else /* !__clang__ && !_MSC_VER */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; +#endif +typedef unsigned int uintptr_t; +#endif /* __clang__ || _MSC_VER */ +#endif /* !_STDINT_H_ && !HAVE_STDINT_H */ + +/* GDK only supports 64-bit */ +# define SIZEOF_VOIDP 8 + +#ifdef __clang__ +# define HAVE_GCC_ATOMICS 1 +#endif + +#define HAVE_DDRAW_H 1 +#define HAVE_DINPUT_H 1 +#define HAVE_DSOUND_H 1 +/* No SDK version checks needed for these because the SDK has to be new. */ +#define HAVE_DXGI_H 1 +#define HAVE_XINPUT_H 1 +#define HAVE_WINDOWS_GAMING_INPUT_H 1 +#define HAVE_D3D11_H 1 +#define HAVE_ROAPI_H 1 +#define HAVE_D3D12_H 1 +#define HAVE_SHELLSCALINGAPI_H 1 +#define HAVE_MMDEVICEAPI_H 1 +#define HAVE_AUDIOCLIENT_H 1 +#define HAVE_TPCSHRD_H 1 +#define HAVE_SENSORSAPI_H 1 +#if (defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64)) && (defined(_MSC_VER) && _MSC_VER >= 1600) +#define HAVE_IMMINTRIN_H 1 +#elif defined(__has_include) && (defined(__i386__) || defined(__x86_64)) +# if __has_include() +# define HAVE_IMMINTRIN_H 1 +# endif +#endif + +/* This is disabled by default to avoid C runtime dependencies and manifest requirements */ +#ifdef HAVE_LIBC +/* Useful headers */ +#define STDC_HEADERS 1 +#define HAVE_CTYPE_H 1 +#define HAVE_FLOAT_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_STDIO_H 1 +#define HAVE_STRING_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_QSORT 1 +#define HAVE_BSEARCH 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +/* These functions have security warnings, so we won't use them */ +/* #undef HAVE__STRUPR */ +/* #undef HAVE__STRLWR */ +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +/* #undef HAVE_STRTOK_R */ +/* These functions have security warnings, so we won't use them */ +/* #undef HAVE__LTOA */ +/* #undef HAVE__ULTOA */ +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE__WCSICMP 1 +#define HAVE__WCSNICMP 1 +#define HAVE__WCSDUP 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_CEIL 1 +#define HAVE_COS 1 +#define HAVE_EXP 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_FMOD 1 +#define HAVE_LOG 1 +#define HAVE_LOG10 1 +#define HAVE_POW 1 +#define HAVE_SIN 1 +#define HAVE_SQRT 1 +#define HAVE_TAN 1 +#define HAVE_ACOSF 1 +#define HAVE_ASINF 1 +#define HAVE_ATANF 1 +#define HAVE_ATAN2F 1 +#define HAVE_CEILF 1 +#define HAVE__COPYSIGN 1 +#define HAVE_COSF 1 +#define HAVE_EXPF 1 +#define HAVE_FABSF 1 +#define HAVE_FLOORF 1 +#define HAVE_FMODF 1 +#define HAVE_LOGF 1 +#define HAVE_LOG10F 1 +#define HAVE_POWF 1 +#define HAVE_SINF 1 +#define HAVE_SQRTF 1 +#define HAVE_TANF 1 +#if defined(_MSC_VER) +/* These functions were added with the VC++ 2013 C runtime library */ +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_VSSCANF 1 +#define HAVE_LROUND 1 +#define HAVE_LROUNDF 1 +#define HAVE_ROUND 1 +#define HAVE_ROUNDF 1 +#define HAVE_SCALBN 1 +#define HAVE_SCALBNF 1 +#define HAVE_TRUNC 1 +#define HAVE_TRUNCF 1 +#define HAVE__FSEEKI64 1 +#ifdef _USE_MATH_DEFINES +#define HAVE_M_PI 1 +#endif +#else +#define HAVE_M_PI 1 +#endif +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#endif + +/* Enable various audio drivers */ +#if defined(HAVE_MMDEVICEAPI_H) && defined(HAVE_AUDIOCLIENT_H) +#define SDL_AUDIO_DRIVER_WASAPI 1 +#endif +#define SDL_AUDIO_DRIVER_DSOUND 1 +#define SDL_AUDIO_DRIVER_WINMM 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_DINPUT 1 +#define SDL_JOYSTICK_HIDAPI 1 +#define SDL_JOYSTICK_RAWINPUT 1 +#define SDL_JOYSTICK_VIRTUAL 1 +#ifdef HAVE_WINDOWS_GAMING_INPUT_H +#define SDL_JOYSTICK_WGI 1 +#endif +#define SDL_JOYSTICK_XINPUT 1 +#define SDL_HAPTIC_DINPUT 1 +#define SDL_HAPTIC_XINPUT 1 + +/* Enable the sensor driver */ +#ifdef HAVE_SENSORSAPI_H +#define SDL_SENSOR_WINDOWS 1 +#else +#define SDL_SENSOR_DUMMY 1 +#endif + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WINDOWS 1 + +/* Enable various threading systems */ +#define SDL_THREAD_GENERIC_COND_SUFFIX 1 +#define SDL_THREAD_WINDOWS 1 + +/* Enable various timer systems */ +#define SDL_TIMER_WINDOWS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDOWS 1 + +#ifndef SDL_VIDEO_RENDER_D3D +#define SDL_VIDEO_RENDER_D3D 1 +#endif +#if !defined(SDL_VIDEO_RENDER_D3D11) && defined(HAVE_D3D11_H) +#define SDL_VIDEO_RENDER_D3D11 1 +#endif +#if !defined(SDL_VIDEO_RENDER_D3D12) && defined(HAVE_D3D12_H) +#define SDL_VIDEO_RENDER_D3D12 1 +#endif + +/* Enable OpenGL support */ +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_WGL +#define SDL_VIDEO_OPENGL_WGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL_ES2 +#define SDL_VIDEO_RENDER_OGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_ES2 +#define SDL_VIDEO_OPENGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_EGL +#define SDL_VIDEO_OPENGL_EGL 1 +#endif + +/* Enable Vulkan support */ +#define SDL_VIDEO_VULKAN 1 + +/* Enable system power support */ +#define SDL_POWER_WINDOWS 1 + +/* Enable filesystem support */ +#define SDL_FILESYSTEM_WINDOWS 1 + +#endif /* SDL_config_wingdk_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL_cpuinfo.h b/include/SDL_cpuinfo.h index fa22f3aa3..e31b139c7 100644 --- a/include/SDL_cpuinfo.h +++ b/include/SDL_cpuinfo.h @@ -79,7 +79,7 @@ _m_prefetch(void *__P) #if !defined(SDL_DISABLE_ARM_NEON_H) # if defined(__ARM_NEON) # include -# elif defined(__WINDOWS__) || defined(__WINRT__) +# elif defined(__WINDOWS__) || defined(__WINRT__) || defined(__GDK__) /* Visual Studio doesn't define __ARM_ARCH, but _M_ARM (if set, always 7), and _M_ARM64 (if set, always 1). */ # if defined(_M_ARM) # include diff --git a/include/SDL_main.h b/include/SDL_main.h index a7679f278..ea1213610 100644 --- a/include/SDL_main.h +++ b/include/SDL_main.h @@ -51,6 +51,15 @@ */ #define SDL_MAIN_NEEDED +#elif defined(__GDK__) +/* On GDK, SDL provides a main function that initializes the game runtime. + + Please note that #include'ing SDL_main.h is not enough to get a main() + function working. You must either link against SDL2main or, if not possible, + call the SDL_GDKRunApp function from your entry point. +*/ +#define SDL_MAIN_NEEDED + #elif defined(__IPHONEOS__) /* On iOS SDL provides a main function that creates an application delegate and starts the iOS application run loop. @@ -148,7 +157,7 @@ extern SDLMAIN_DECLSPEC int SDL_main(int argc, char *argv[]); */ extern DECLSPEC void SDLCALL SDL_SetMainReady(void); -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) /** * Register a win32 window class for SDL's use. @@ -192,7 +201,7 @@ extern DECLSPEC int SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void */ extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__GDK__) */ #ifdef __WINRT__ @@ -227,6 +236,19 @@ extern DECLSPEC int SDLCALL SDL_UIKitRunApp(int argc, char *argv[], SDL_main_fun #endif /* __IPHONEOS__ */ +#ifdef __GDK__ + +/** + * Initialize and launch an SDL GDK application. + * + * \param mainFunction the SDL app's C-style main(), an SDL_main_func + * \param reserved reserved for future use; should be NULL + * \returns 0 on success or -1 on failure; call SDL_GetError() to retrieve + * more information on the failure. + */ +extern DECLSPEC int SDLCALL SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved); + +#endif /* __GDK__ */ #ifdef __cplusplus } diff --git a/include/SDL_platform.h b/include/SDL_platform.h index b70fb02fd..2b61605df 100644 --- a/include/SDL_platform.h +++ b/include/SDL_platform.h @@ -144,7 +144,7 @@ #endif #if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) -/* Try to find out if we're compiling for WinRT or non-WinRT */ +/* Try to find out if we're compiling for WinRT, GDK or non-WinRT/GDK */ #if defined(_MSC_VER) && defined(__has_include) #if __has_include() #define HAVE_WINAPIFAMILY_H 1 @@ -169,6 +169,9 @@ #if WINAPI_FAMILY_WINRT #undef __WINRT__ #define __WINRT__ 1 +#elif defined(_GAMING_DESKTOP) /* GDK project configuration always defines _GAMING_XXX */ +#undef __WINGDK__ +#define __WINGDK__ 1 #else #undef __WINDOWS__ #define __WINDOWS__ 1 @@ -179,6 +182,11 @@ #undef __WIN32__ #define __WIN32__ 1 #endif +/* This is to support generic "any GDK" separate from a platform-specific GDK */ +#if defined(__WINGDK__) || defined(__XBOXONEGDK__) || defined(__XBOXSERIESGDK__) +#undef __GDK__ +#define __GDK__ 1 +#endif #if defined(__PSP__) #undef __PSP__ #define __PSP__ 1 diff --git a/include/SDL_rwops.h b/include/SDL_rwops.h index 30b69a806..3960f567c 100644 --- a/include/SDL_rwops.h +++ b/include/SDL_rwops.h @@ -98,7 +98,7 @@ typedef struct SDL_RWops { void *asset; } androidio; -#elif defined(__WIN32__) +#elif defined(__WIN32__) || defined(__GDK__) struct { SDL_bool append; diff --git a/include/SDL_stdinc.h b/include/SDL_stdinc.h index c0bc8aa1a..0da225627 100644 --- a/include/SDL_stdinc.h +++ b/include/SDL_stdinc.h @@ -259,7 +259,7 @@ typedef uint64_t Uint64; #ifndef SDL_PRIs64 #ifdef PRIs64 #define SDL_PRIs64 PRIs64 -#elif defined(__WIN32__) +#elif defined(__WIN32__) || defined(__GDK__) #define SDL_PRIs64 "I64d" #elif defined(__LINUX__) && defined(__LP64__) #define SDL_PRIs64 "ld" @@ -270,7 +270,7 @@ typedef uint64_t Uint64; #ifndef SDL_PRIu64 #ifdef PRIu64 #define SDL_PRIu64 PRIu64 -#elif defined(__WIN32__) +#elif defined(__WIN32__) || defined(__GDK__) #define SDL_PRIu64 "I64u" #elif defined(__LINUX__) && defined(__LP64__) #define SDL_PRIu64 "lu" @@ -281,7 +281,7 @@ typedef uint64_t Uint64; #ifndef SDL_PRIx64 #ifdef PRIx64 #define SDL_PRIx64 PRIx64 -#elif defined(__WIN32__) +#elif defined(__WIN32__) || defined(__GDK__) #define SDL_PRIx64 "I64x" #elif defined(__LINUX__) && defined(__LP64__) #define SDL_PRIx64 "lx" @@ -292,7 +292,7 @@ typedef uint64_t Uint64; #ifndef SDL_PRIX64 #ifdef PRIX64 #define SDL_PRIX64 PRIX64 -#elif defined(__WIN32__) +#elif defined(__WIN32__) || defined(__GDK__) #define SDL_PRIX64 "I64X" #elif defined(__LINUX__) && defined(__LP64__) #define SDL_PRIX64 "lX" diff --git a/include/SDL_system.h b/include/SDL_system.h index cf5c320f7..6780876b2 100644 --- a/include/SDL_system.h +++ b/include/SDL_system.h @@ -41,7 +41,7 @@ extern "C" { /* Platform specific functions for Windows */ -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) typedef void (SDLCALL * SDL_WindowsMessageHook)(void *userdata, void *hWnd, unsigned int message, Uint64 wParam, Sint64 lParam); @@ -55,6 +55,10 @@ typedef void (SDLCALL * SDL_WindowsMessageHook)(void *userdata, void *hWnd, unsi */ extern DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata); +#endif /* defined(__WIN32__) || defined(__GDK__) */ + +#if defined(__WIN32__) || defined(__WINGDK__) + /** * Get the D3D9 adapter index that matches the specified display index. * @@ -102,6 +106,10 @@ typedef struct ID3D11Device ID3D11Device; */ extern DECLSPEC ID3D11Device* SDLCALL SDL_RenderGetD3D11Device(SDL_Renderer * renderer); +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ + +#if defined(__WIN32__) || defined(__GDK__) + typedef struct ID3D12Device ID3D12Device; /** @@ -118,6 +126,10 @@ typedef struct ID3D12Device ID3D12Device; */ extern DECLSPEC ID3D12Device* SDLCALL SDL_RenderGetD3D12Device(SDL_Renderer* renderer); +#endif /* defined(__WIN32__) || defined(__GDK__) */ + +#if defined(__WIN32__) || defined(__WINGDK__) + /** * Get the DXGI Adapter and Output indices for the specified display index. * @@ -138,8 +150,7 @@ extern DECLSPEC ID3D12Device* SDLCALL SDL_RenderGetD3D12Device(SDL_Renderer* ren */ extern DECLSPEC SDL_bool SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex ); -#endif /* __WIN32__ */ - +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ /* Platform specific functions for Linux */ #ifdef __LINUX__ @@ -580,6 +591,25 @@ extern DECLSPEC void SDLCALL SDL_OnApplicationDidBecomeActive(void); extern DECLSPEC void SDLCALL SDL_OnApplicationDidChangeStatusBarOrientation(void); #endif +/* Functions used only by GDK */ +#if defined(__GDK__) +typedef struct XTaskQueueObject * XTaskQueueHandle; + +/** + * Gets a reference to the global async task queue handle for GDK, + * initializing if needed. + * + * Once you are done with the task queue, you should call XTaskQueueCloseHandle + * to reduce the reference count to avoid a resource leak. + * + * \param outTaskQueue a pointer to be filled in with task queue handle. + * \returns 0 if success, -1 if any error occurs. + * + */ +extern DECLSPEC int SDLCALL SDL_GDKGetTaskQueue(XTaskQueueHandle * outTaskQueue); + +#endif + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/include/SDL_thread.h b/include/SDL_thread.h index 1e04a4f8f..7364f8137 100644 --- a/include/SDL_thread.h +++ b/include/SDL_thread.h @@ -35,7 +35,7 @@ #include "SDL_atomic.h" #include "SDL_mutex.h" -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__GDK__) #include /* _beginthreadex() and _endthreadex() */ #endif #if defined(__OS2__) /* for _beginthread() and _endthread() */ @@ -88,7 +88,7 @@ typedef enum { typedef int (SDLCALL * SDL_ThreadFunction) (void *data); -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__GDK__) /** * \file SDL_thread.h * diff --git a/include/begin_code.h b/include/begin_code.h index b1b1a3a9b..6c2f096f8 100644 --- a/include/begin_code.h +++ b/include/begin_code.h @@ -51,7 +51,7 @@ /* Some compilers use a special export keyword */ #ifndef DECLSPEC -# if defined(__WIN32__) || defined(__WINRT__) || defined(__CYGWIN__) +# if defined(__WIN32__) || defined(__WINRT__) || defined(__CYGWIN__) || defined(__GDK__) # ifdef DLL_EXPORT # define DECLSPEC __declspec(dllexport) # else @@ -74,7 +74,7 @@ /* By default SDL uses the C calling convention */ #ifndef SDLCALL -#if (defined(__WIN32__) || defined(__WINRT__)) && !defined(__GNUC__) +#if (defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__)) && !defined(__GNUC__) #define SDLCALL __cdecl #elif defined(__OS2__) || defined(__EMX__) #define SDLCALL _System diff --git a/src/SDL.c b/src/SDL.c index 0afaeb18c..d1326fb2e 100644 --- a/src/SDL.c +++ b/src/SDL.c @@ -20,7 +20,7 @@ */ #include "./SDL_internal.h" -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__GDK__) #include "core/windows/SDL_windows.h" #elif defined(__OS2__) #include /* _exit() */ @@ -89,7 +89,7 @@ SDL_COMPILE_TIME_ASSERT(SDL_PATCHLEVEL_max, SDL_PATCHLEVEL <= 99); extern SDL_NORETURN void SDL_ExitProcess(int exitcode); SDL_NORETURN void SDL_ExitProcess(int exitcode) { -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) /* "if you do not know the state of all threads in your process, it is better to call TerminateProcess than ExitProcess" https://msdn.microsoft.com/en-us/library/windows/desktop/ms682658(v=vs.85).aspx */ @@ -579,6 +579,8 @@ SDL_GetPlatform(void) return "Windows"; #elif __WINRT__ return "WinRT"; +#elif __WINGDK__ + return "WinGDK"; #elif __TVOS__ return "tvOS"; #elif __IPHONEOS__ @@ -630,6 +632,6 @@ _DllMainCRTStartup(HANDLE hModule, } #endif /* Building DLL */ -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__GDK__) */ /* vi: set sts=4 ts=4 sw=4 expandtab: */ diff --git a/src/SDL_assert.c b/src/SDL_assert.c index 02cd6b3fd..8153bf98a 100644 --- a/src/SDL_assert.c +++ b/src/SDL_assert.c @@ -20,7 +20,7 @@ */ #include "./SDL_internal.h" -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__GDK__) #include "core/windows/SDL_windows.h" #endif @@ -32,7 +32,7 @@ #include "SDL_assert_c.h" #include "video/SDL_sysvideo.h" -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) #ifndef WS_OVERLAPPEDWINDOW #define WS_OVERLAPPEDWINDOW 0 #endif @@ -90,7 +90,7 @@ static void SDL_AddAssertionToReport(SDL_assert_data *data) } } -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) #define ENDLINE "\r\n" #else #define ENDLINE "\n" diff --git a/src/SDL_log.c b/src/SDL_log.c index 88dd6af66..a00fa2880 100644 --- a/src/SDL_log.c +++ b/src/SDL_log.c @@ -20,7 +20,7 @@ */ #include "./SDL_internal.h" -#if defined(__WIN32__) || defined(__WINRT__) +#if defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) #include "core/windows/SDL_windows.h" #endif @@ -362,7 +362,7 @@ SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list } } -#if defined(__WIN32__) && !defined(HAVE_STDIO_H) && !defined(__WINRT__) +#if defined(__WIN32__) && !defined(HAVE_STDIO_H) && !defined(__WINRT__) && !defined(__GDK__) /* Flag tracking the attachment of the console: 0=unattached, 1=attached to a console, 2=attached to a file, -1=error */ static int consoleAttached = 0; @@ -374,7 +374,7 @@ static void SDLCALL SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, const char *message) { -#if defined(__WIN32__) || defined(__WINRT__) +#if defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) /* Way too many allocations here, urgh */ /* Note: One can't call SDL_SetError here, since that function itself logs. */ { @@ -383,7 +383,7 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, LPTSTR tstr; SDL_bool isstack; -#if !defined(HAVE_STDIO_H) && !defined(__WINRT__) +#if !defined(HAVE_STDIO_H) && !defined(__WINRT__) && !defined(__GDK__) BOOL attachResult; DWORD attachError; DWORD charsWritten; @@ -422,7 +422,7 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, } } } -#endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) */ +#endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) && !defined(__GDK__) */ length = SDL_strlen(SDL_priority_prefixes[priority]) + 2 + SDL_strlen(message) + 1 + 1 + 1; output = SDL_small_alloc(char, length, &isstack); @@ -432,7 +432,7 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, /* Output to debugger */ OutputDebugString(tstr); -#if !defined(HAVE_STDIO_H) && !defined(__WINRT__) +#if !defined(HAVE_STDIO_H) && !defined(__WINRT__) && !defined(__GDK__) /* Screen output to stderr, if console was attached. */ if (consoleAttached == 1) { if (!WriteConsole(stderrHandle, tstr, (DWORD) SDL_tcslen(tstr), &charsWritten, NULL)) { @@ -447,7 +447,7 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, OutputDebugString(TEXT("Error calling WriteFile\r\n")); } } -#endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) */ +#endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) && !defined(__GDK__) */ SDL_free(tstr); SDL_small_free(output, isstack); diff --git a/src/atomic/SDL_spinlock.c b/src/atomic/SDL_spinlock.c index f9877c3fe..53776d5e0 100644 --- a/src/atomic/SDL_spinlock.c +++ b/src/atomic/SDL_spinlock.c @@ -20,7 +20,7 @@ */ #include "../SDL_internal.h" -#if defined(__WIN32__) || defined(__WINRT__) +#if defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) #include "../core/windows/SDL_windows.h" #endif diff --git a/src/audio/wasapi/SDL_wasapi.c b/src/audio/wasapi/SDL_wasapi.c index 862ed9f5e..5b966aa31 100644 --- a/src/audio/wasapi/SDL_wasapi.c +++ b/src/audio/wasapi/SDL_wasapi.c @@ -519,7 +519,7 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream) SDL_assert(client != NULL); -#ifdef __WINRT__ /* CreateEventEx() arrived in Vista, so we need an #ifdef for XP. */ +#if defined(__WINRT__) || defined(__GDK__) /* CreateEventEx() arrived in Vista, so we need an #ifdef for XP. */ this->hidden->event = CreateEventEx(NULL, NULL, 0, EVENT_ALL_ACCESS); #else this->hidden->event = CreateEventW(NULL, 0, 0, NULL); diff --git a/src/core/gdk/SDL_gdk.cpp b/src/core/gdk/SDL_gdk.cpp new file mode 100644 index 000000000..4058a9b8f --- /dev/null +++ b/src/core/gdk/SDL_gdk.cpp @@ -0,0 +1,177 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../../SDL_internal.h" + +#include "SDL_system.h" +#include "../windows/SDL_windows.h" +#include "SDL_messagebox.h" +#include "SDL_main.h" +#include +#include +#include /* CommandLineToArgvW() */ + +static XTaskQueueHandle GDK_GlobalTaskQueue; + +extern "C" DECLSPEC int +SDL_GDKGetTaskQueue(XTaskQueueHandle * outTaskQueue) +{ + /* If this is the first call, first create the global task queue. */ + if (!GDK_GlobalTaskQueue) { + HRESULT hr; + + hr = XTaskQueueCreate(XTaskQueueDispatchMode::ThreadPool, + XTaskQueueDispatchMode::Manual, + &GDK_GlobalTaskQueue + ); + if (FAILED(hr)) { + SDL_SetError("[GDK] Could not create global task queue"); + return -1; + } + + /* The initial call gets the non-duplicated handle so they can clean it up */ + *outTaskQueue = GDK_GlobalTaskQueue; + } else { + /* Duplicate the global task queue handle into outTaskQueue */ + if (FAILED(XTaskQueueDuplicateHandle(GDK_GlobalTaskQueue, outTaskQueue))) { + SDL_SetError("[GDK] Unable to acquire global task queue"); + return -1; + } + } + + return 0; +} + +extern "C" void +GDK_DispatchTaskQueue(void) +{ + /* If there is no global task queue, don't do anything. + * This gives the option to opt-out for those who want to handle everything themselves. + */ + if (GDK_GlobalTaskQueue) { + /* Dispatch any callbacks which are ready. */ + while (XTaskQueueDispatch(GDK_GlobalTaskQueue, XTaskQueuePort::Completion, 0)) + ; + } +} + +/* Pop up an out of memory message, returns to Windows */ +extern "C" static BOOL +OutOfMemory(void) +{ + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal Error", "Out of memory - aborting", NULL); + return FALSE; +} + +/* Gets the arguments with GetCommandLine, converts them to argc and argv + and calls SDL_main */ +extern "C" DECLSPEC int +SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved) +{ + LPWSTR *argvw; + char **argv; + int i, argc, result; + HRESULT hr; + XTaskQueueHandle taskQueue; + + argvw = CommandLineToArgvW(GetCommandLineW(), &argc); + if (argvw == NULL) { + return OutOfMemory(); + } + + /* Note that we need to be careful about how we allocate/free memory here. + * If the application calls SDL_SetMemoryFunctions(), we can't rely on + * SDL_free() to use the same allocator after SDL_main() returns. + */ + + /* Parse it into argv and argc */ + argv = (char **) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (argc + 1) * sizeof(*argv)); + if (!argv) { + return OutOfMemory(); + } + for (i = 0; i < argc; ++i) { + DWORD len; + char *arg = WIN_StringToUTF8W(argvw[i]); + if (!arg) { + return OutOfMemory(); + } + len = (DWORD) SDL_strlen(arg); + argv[i] = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len + 1); + if (!argv[i]) { + return OutOfMemory(); + } + SDL_memcpy(argv[i], arg, len); + SDL_free(arg); + } + argv[i] = NULL; + LocalFree(argvw); + + hr = XGameRuntimeInitialize(); + + if (SUCCEEDED(hr) && SDL_GDKGetTaskQueue(&taskQueue) == 0) { + Uint32 titleid = 0; + char scidBuffer[64]; + XblInitArgs xblArgs; + + XTaskQueueSetCurrentProcessTaskQueue(taskQueue); + + /* Try to get the title ID and initialize Xbox Live */ + hr = XGameGetXboxTitleId(&titleid); + if (SUCCEEDED(hr)) { + SDL_zero(xblArgs); + xblArgs.queue = taskQueue; + SDL_snprintf(scidBuffer, 64, "00000000-0000-0000-0000-0000%08X", titleid); + xblArgs.scid = scidBuffer; + hr = XblInitialize(&xblArgs); + } else { + SDL_SetError("[GDK] Unable to get titleid. Will not call XblInitialize. Check MicrosoftGame.config!"); + } + + SDL_SetMainReady(); + + /* Run the application main() code */ + result = mainFunction(argc, argv); + + /* !!! FIXME: This follows the docs exactly, but for some reason still leaks handles on exit? */ + /* Terminate the task queue and dispatch any pending tasks */ + XTaskQueueTerminate(taskQueue, false, nullptr, nullptr); + while (XTaskQueueDispatch(taskQueue, XTaskQueuePort::Completion, 0)) + ; + + XTaskQueueCloseHandle(taskQueue); + + XGameRuntimeUninitialize(); + } else { +#ifdef __WINGDK__ + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal Error", "[GDK] Could not initialize - aborting", NULL); +#else + SDL_assert_always(0 && "[GDK] Could not initialize - aborting"); +#endif + result = -1; + } + + /* Free argv, to avoid memory leak */ + for (i = 0; i < argc; ++i) { + HeapFree(GetProcessHeap(), 0, argv[i]); + } + HeapFree(GetProcessHeap(), 0, argv); + + return result; +} diff --git a/src/core/gdk/SDL_gdk.h b/src/core/gdk/SDL_gdk.h new file mode 100644 index 000000000..628d3e621 --- /dev/null +++ b/src/core/gdk/SDL_gdk.h @@ -0,0 +1,24 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../../SDL_internal.h" + +/* This is called from WIN_PumpEvents on GDK */ +extern void GDK_DispatchTaskQueue(void); diff --git a/src/core/windows/SDL_windows.c b/src/core/windows/SDL_windows.c index 50e128fcc..f5b2642f5 100644 --- a/src/core/windows/SDL_windows.c +++ b/src/core/windows/SDL_windows.c @@ -20,7 +20,7 @@ */ #include "../../SDL_internal.h" -#if defined(__WIN32__) || defined(__WINRT__) +#if defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) #include "SDL_windows.h" #include "SDL_error.h" @@ -338,6 +338,6 @@ WIN_RectToRECT(const SDL_Rect *sdlrect, RECT *winrect) winrect->bottom = sdlrect->y + sdlrect->h - 1; } -#endif /* __WIN32__ || __WINRT__ */ +#endif /* defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/core/windows/SDL_windows.h b/src/core/windows/SDL_windows.h index 7b3b9bcfa..48f4d93b1 100644 --- a/src/core/windows/SDL_windows.h +++ b/src/core/windows/SDL_windows.h @@ -40,6 +40,16 @@ #define _WIN32_WINNT 0x501 /* Need 0x410 for AlphaBlend() and 0x500 for EnumDisplayDevices(), 0x501 for raw input */ #endif #define WINVER _WIN32_WINNT +#elif defined(__WINGDK__) +#define WIN32_LEAN_AND_MEAN +#define STRICT +#ifndef UNICODE +#define UNICODE 1 +#endif +#undef WINVER +#undef _WIN32_WINNT +#define _WIN32_WINNT 0xA00 +#define WINVER _WIN32_WINNT #endif #include diff --git a/src/cpuinfo/SDL_cpuinfo.c b/src/cpuinfo/SDL_cpuinfo.c index 9386d0ebb..8eb942bd3 100644 --- a/src/cpuinfo/SDL_cpuinfo.c +++ b/src/cpuinfo/SDL_cpuinfo.c @@ -24,7 +24,7 @@ #include "../SDL_internal.h" #endif -#if defined(__WIN32__) || defined(__WINRT__) +#if defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) #include "../core/windows/SDL_windows.h" #endif #if defined(__OS2__) @@ -456,7 +456,7 @@ CPU_haveNEON(void) query the OS kernel in a platform-specific way. :/ */ #if defined(SDL_CPUINFO_DISABLED) return 0; /* disabled */ -#elif (defined(__WINDOWS__) || defined(__WINRT__)) && (defined(_M_ARM) || defined(_M_ARM64)) +#elif (defined(__WINDOWS__) || defined(__WINRT__) || defined(__GDK__)) && (defined(_M_ARM) || defined(_M_ARM64)) /* Visual Studio, for ARM, doesn't define __ARM_ARCH. Handle this first. */ /* Seems to have been removed */ # if !defined(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) @@ -671,7 +671,7 @@ SDL_GetCPUCount(void) sysctlbyname("hw.ncpu", &SDL_CPUCount, &size, NULL, 0); } #endif -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) if (SDL_CPUCount <= 0) { SYSTEM_INFO info; GetSystemInfo(&info); @@ -912,11 +912,11 @@ SDL_GetCPUFeatures(void) SDL_CPUFeatures |= CPU_HAS_NEON; SDL_SIMDAlignment = SDL_max(SDL_SIMDAlignment, 16); } - if (CPU_haveLSX()) { + if (CPU_haveLSX()) { SDL_CPUFeatures |= CPU_HAS_LSX; SDL_SIMDAlignment = SDL_max(SDL_SIMDAlignment, 16); } - if (CPU_haveLASX()) { + if (CPU_haveLASX()) { SDL_CPUFeatures |= CPU_HAS_LASX; SDL_SIMDAlignment = SDL_max(SDL_SIMDAlignment, 32); } @@ -1053,7 +1053,7 @@ SDL_GetSystemRAM(void) } } #endif -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) if (SDL_SystemRAM <= 0) { MEMORYSTATUSEX stat; stat.dwLength = sizeof(stat); diff --git a/src/dynapi/SDL2.exports b/src/dynapi/SDL2.exports index c928dc739..74098be67 100644 --- a/src/dynapi/SDL2.exports +++ b/src/dynapi/SDL2.exports @@ -849,3 +849,5 @@ ++'_SDL_HasLASX'.'SDL2.dll'.'SDL_HasLASX' ++'_SDL_RenderGetD3D12Device'.'SDL2.dll'.'SDL_RenderGetD3D12Device' ++'_SDL_utf8strnlen'.'SDL2.dll'.'SDL_utf8strnlen' +# ++'_SDL_GDKGetTaskQueue'.'SDL2.dll'.'SDL_GDKGetTaskQueue' +# ++'_SDL_GDKRunApp'.'SDL2.dll'.'SDL_GDKRunApp' diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h index 1083fd9ad..12d8554f4 100644 --- a/src/dynapi/SDL_dynapi_overrides.h +++ b/src/dynapi/SDL_dynapi_overrides.h @@ -875,3 +875,5 @@ #define SDL_HasLASX SDL_HasLASX_REAL #define SDL_RenderGetD3D12Device SDL_RenderGetD3D12Device_REAL #define SDL_utf8strnlen SDL_utf8strnlen_REAL +#define SDL_GDKGetTaskQueue SDL_GDKGetTaskQueue_REAL +#define SDL_GDKRunApp SDL_GDKRunApp_REAL diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index db4fa1bb9..f0a2d0d8b 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -48,7 +48,7 @@ SDL_DYNAPI_PROC(int,SDL_snprintf,(SDL_OUT_Z_CAP(b) char *a, size_t b, SDL_PRINTF #undef SDL_CreateThread #endif -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__GDK__) SDL_DYNAPI_PROC(SDL_Thread*,SDL_CreateThread,(SDL_ThreadFunction a, const char *b, void *c, pfnSDL_CurrentBeginThread d, pfnSDL_CurrentEndThread e),(a,b,c,d,e),return) #elif defined(__OS2__) SDL_DYNAPI_PROC(SDL_Thread*,SDL_CreateThread,(SDL_ThreadFunction a, const char *b, void *c, pfnSDL_CurrentBeginThread d, pfnSDL_CurrentEndThread e),(a,b,c,d,e),return) @@ -62,9 +62,12 @@ SDL_DYNAPI_PROC(SDL_RWops*,SDL_RWFromFP,(FILE *a, SDL_bool b),(a,b),return) SDL_DYNAPI_PROC(SDL_RWops*,SDL_RWFromFP,(void *a, SDL_bool b),(a,b),return) #endif -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) SDL_DYNAPI_PROC(int,SDL_RegisterApp,(const char *a, Uint32 b, void *c),(a,b,c),return) SDL_DYNAPI_PROC(void,SDL_UnregisterApp,(void),(),) +#endif + +#if defined(__WIN32__) || defined(__WINGDK__) SDL_DYNAPI_PROC(int,SDL_Direct3D9GetAdapterIndex,(int a),(a),return) SDL_DYNAPI_PROC(IDirect3DDevice9*,SDL_RenderGetD3D9Device,(SDL_Renderer *a),(a),return) #endif @@ -599,7 +602,7 @@ SDL_DYNAPI_PROC(void,SDL_GL_ResetAttributes,(void),(),) SDL_DYNAPI_PROC(SDL_bool,SDL_HasAVX,(void),(),return) SDL_DYNAPI_PROC(SDL_AssertionHandler,SDL_GetDefaultAssertionHandler,(void),(),return) SDL_DYNAPI_PROC(SDL_AssertionHandler,SDL_GetAssertionHandler,(void **a),(a),return) -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) SDL_DYNAPI_PROC(SDL_bool,SDL_DXGIGetOutputInfo,(int a,int *b, int *c),(a,b,c),return) #endif SDL_DYNAPI_PROC(SDL_bool,SDL_RenderIsClipEnabled,(SDL_Renderer *a),(a),return) @@ -620,7 +623,7 @@ SDL_DYNAPI_PROC(int,SDL_QueueAudio,(SDL_AudioDeviceID a, const void *b, Uint32 c SDL_DYNAPI_PROC(Uint32,SDL_GetQueuedAudioSize,(SDL_AudioDeviceID a),(a),return) SDL_DYNAPI_PROC(void,SDL_ClearQueuedAudio,(SDL_AudioDeviceID a),(a),) SDL_DYNAPI_PROC(SDL_Window*,SDL_GetGrabbedWindow,(void),(),return) -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) SDL_DYNAPI_PROC(void,SDL_SetWindowsMessageHook,(SDL_WindowsMessageHook a, void *b),(a,b),) #endif SDL_DYNAPI_PROC(int,SDL_GetDisplayDPI,(int a, float *b, float *c, float *d),(a,b,c,d),return) @@ -744,7 +747,7 @@ SDL_DYNAPI_PROC(SDL_bool,SDL_HasColorKey,(SDL_Surface *a),(a),return) #undef SDL_CreateThreadWithStackSize #endif -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__GDK__) SDL_DYNAPI_PROC(SDL_Thread*,SDL_CreateThreadWithStackSize,(SDL_ThreadFunction a, const char *b, const size_t c, void *d, pfnSDL_CurrentBeginThread e, pfnSDL_CurrentEndThread f),(a,b,c,d,e,f),return) #elif defined(__OS2__) SDL_DYNAPI_PROC(SDL_Thread*,SDL_CreateThreadWithStackSize,(SDL_ThreadFunction a, const char *b, const size_t c, void *d, pfnSDL_CurrentBeginThread e, pfnSDL_CurrentEndThread f),(a,b,c,d,e,f),return) @@ -854,7 +857,7 @@ SDL_DYNAPI_PROC(float,SDL_roundf,(float a),(a),return) SDL_DYNAPI_PROC(long,SDL_lround,(double a),(a),return) SDL_DYNAPI_PROC(long,SDL_lroundf,(float a),(a),return) SDL_DYNAPI_PROC(int,SDL_SoftStretchLinear,(SDL_Surface *a, const SDL_Rect *b, SDL_Surface *c, const SDL_Rect *d),(a,b,c,d),return) -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) SDL_DYNAPI_PROC(ID3D11Device*,SDL_RenderGetD3D11Device,(SDL_Renderer *a),(a),return) #endif SDL_DYNAPI_PROC(int,SDL_UpdateNVTexture,(SDL_Texture *a, const SDL_Rect *b, const Uint8 *c, int d, const Uint8 *e, int f),(a,b,c,d,e,f),return) @@ -948,7 +951,12 @@ SDL_DYNAPI_PROC(void,SDL_GUIDToString,(SDL_GUID a, char *b, int c),(a,b,c),) SDL_DYNAPI_PROC(SDL_GUID,SDL_GUIDFromString,(const char *a),(a),return) SDL_DYNAPI_PROC(SDL_bool,SDL_HasLSX,(void),(),return) SDL_DYNAPI_PROC(SDL_bool,SDL_HasLASX,(void),(),return) -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) SDL_DYNAPI_PROC(ID3D12Device*,SDL_RenderGetD3D12Device,(SDL_Renderer *a),(a),return) #endif SDL_DYNAPI_PROC(size_t,SDL_utf8strnlen,(const char *a, size_t b),(a,b),return) + +#if defined(__GDK__) +SDL_DYNAPI_PROC(int,SDL_GDKGetTaskQueue,(XTaskQueueHandle *a),(a),return) +SDL_DYNAPI_PROC(int,SDL_GDKRunApp,(SDL_main_func a, void *b),(a,b),return) +#endif diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index 4f52d10a3..6e5ee319f 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -35,7 +35,7 @@ #include "SDL_syswm.h" #undef SDL_PRIs64 -#if defined(__WIN32__) && !defined(__CYGWIN__) +#if (defined(__WIN32__) || defined(__GDK__)) && !defined(__CYGWIN__) #define SDL_PRIs64 "I64d" #else #define SDL_PRIs64 "lld" diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index dfa9a6c42..90dcd38a4 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -28,7 +28,7 @@ #include "SDL_events_c.h" #include "../SDL_hints_c.h" #include "../video/SDL_sysvideo.h" -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) #include "../core/windows/SDL_windows.h" // For GetDoubleClickTime() #endif #if defined(__OS2__) @@ -55,7 +55,7 @@ SDL_MouseDoubleClickTimeChanged(void *userdata, const char *name, const char *ol if (hint && *hint) { mouse->double_click_time = SDL_atoi(hint); } else { -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) mouse->double_click_time = GetDoubleClickTime(); #elif defined(__OS2__) mouse->double_click_time = WinQuerySysValue(HWND_DESKTOP, SV_DBLCLKTIME); @@ -1069,7 +1069,7 @@ SDL_CaptureMouse(SDL_bool enabled) return SDL_Unsupported(); } -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) /* Windows mouse capture is tied to the current thread, and must be called * from the thread that created the window being captured. Since we update * the mouse capture state from the event processing, any application state @@ -1078,7 +1078,7 @@ SDL_CaptureMouse(SDL_bool enabled) if (!SDL_OnVideoThread()) { return SDL_SetError("SDL_CaptureMouse() must be called on the main thread"); } -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ if (enabled && SDL_GetKeyboardFocus() == NULL) { return SDL_SetError("No window has focus"); diff --git a/src/events/SDL_sysevents.h b/src/events/SDL_sysevents.h index 1a48462be..a41df84d0 100644 --- a/src/events/SDL_sysevents.h +++ b/src/events/SDL_sysevents.h @@ -29,7 +29,7 @@ #define MUST_THREAD_EVENTS #endif -#ifdef __WIN32__ /* Windows doesn't allow a separate event thread */ +#if defined(__WIN32__) || defined(__GDK__) /* Windows doesn't allow a separate event thread */ #define CANT_THREAD_EVENTS #endif diff --git a/src/file/SDL_rwops.c b/src/file/SDL_rwops.c index 0b4cc17b2..56f912566 100644 --- a/src/file/SDL_rwops.c +++ b/src/file/SDL_rwops.c @@ -30,7 +30,7 @@ #include "../SDL_internal.h" -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__GDK__) #include "../core/windows/SDL_windows.h" #endif @@ -62,7 +62,7 @@ #include "nacl_io/nacl_io.h" #endif -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) /* Functions to read/write Win32 API file pointers */ @@ -303,7 +303,7 @@ windows_file_close(SDL_RWops * context) } return 0; } -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__GDK__) */ #ifdef HAVE_STDIO_H @@ -574,7 +574,7 @@ SDL_RWFromFile(const char *file, const char *mode) rwops->close = Android_JNI_FileClose; rwops->type = SDL_RWOPS_JNIFILE; -#elif defined(__WIN32__) +#elif defined(__WIN32__) || defined(__GDK__) rwops = SDL_AllocRW(); if (!rwops) return NULL; /* SDL_SetError already setup by SDL_AllocRW() */ diff --git a/src/hidapi/SDL_hidapi.c b/src/hidapi/SDL_hidapi.c index d65611779..718e5c192 100644 --- a/src/hidapi/SDL_hidapi.c +++ b/src/hidapi/SDL_hidapi.c @@ -37,7 +37,7 @@ #if !SDL_HIDAPI_DISABLED -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__WINGDK__) #include "../core/windows/SDL_windows.h" #endif @@ -89,7 +89,7 @@ static struct SDL_bool m_bCanGetNotifications; Uint32 m_unLastDetect; -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__WINGDK__) SDL_threadID m_nThreadID; WNDCLASSEXA m_wndClass; HWND m_hwndMsg; @@ -110,7 +110,7 @@ static struct } SDL_HIDAPI_discovery; -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) struct _DEV_BROADCAST_HDR { DWORD dbch_size; @@ -156,7 +156,7 @@ static LRESULT CALLBACK ControllerWndProc(HWND hwnd, UINT message, WPARAM wParam return DefWindowProc(hwnd, message, wParam, lParam); } -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ #if defined(__MACOSX__) @@ -219,7 +219,7 @@ HIDAPI_InitializeDiscovery() SDL_HIDAPI_discovery.m_bCanGetNotifications = SDL_FALSE; SDL_HIDAPI_discovery.m_unLastDetect = 0; -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__WINGDK__) SDL_HIDAPI_discovery.m_nThreadID = SDL_ThreadID(); SDL_zero(SDL_HIDAPI_discovery.m_wndClass); @@ -246,7 +246,7 @@ HIDAPI_InitializeDiscovery() SDL_HIDAPI_discovery.m_hNotify = RegisterDeviceNotification( SDL_HIDAPI_discovery.m_hwndMsg, &devBroadcast, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES ); SDL_HIDAPI_discovery.m_bCanGetNotifications = ( SDL_HIDAPI_discovery.m_hNotify != 0 ); } -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ #if defined(__MACOSX__) SDL_HIDAPI_discovery.m_notificationPort = IONotificationPortCreate(kIOMasterPortDefault); @@ -369,7 +369,7 @@ HIDAPI_UpdateDiscovery() return; } -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__WINGDK__) #if 0 /* just let the usual SDL_PumpEvents loop dispatch these, fixing bug 4286. --ryan. */ /* We'll only get messages on the same thread that created the window */ if (SDL_ThreadID() == SDL_HIDAPI_discovery.m_nThreadID) { @@ -382,7 +382,7 @@ HIDAPI_UpdateDiscovery() } } #endif -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ #if defined(__MACOSX__) if (SDL_HIDAPI_discovery.m_notificationPort) { @@ -474,7 +474,7 @@ HIDAPI_ShutdownDiscovery() return; } -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__WINGDK__) if (SDL_HIDAPI_discovery.m_hNotify) UnregisterDeviceNotification(SDL_HIDAPI_discovery.m_hNotify); @@ -578,7 +578,7 @@ static const SDL_UDEV_Symbols *udev_ctx = NULL; #include "mac/hid.c" #define HAVE_PLATFORM_BACKEND 1 #define udev_ctx 1 -#elif __WINDOWS__ +#elif __WINDOWS__ || __WINGDK__ #include "windows/hid.c" #define HAVE_PLATFORM_BACKEND 1 #define udev_ctx 1 diff --git a/src/joystick/SDL_gamecontroller.c b/src/joystick/SDL_gamecontroller.c index 2472695a8..b667e8dcb 100644 --- a/src/joystick/SDL_gamecontroller.c +++ b/src/joystick/SDL_gamecontroller.c @@ -1019,7 +1019,7 @@ static char *SDL_PrivateGetControllerGUIDFromMappingString(const char *pMapping) pchGUID[pFirstComma - pMapping] = '\0'; /* Convert old style GUIDs to the new style in 2.0.5 */ -#if __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) if (SDL_strlen(pchGUID) == 32 && SDL_memcmp(&pchGUID[20], "504944564944", 12) == 0) { SDL_memcpy(&pchGUID[20], "000000000000", 12); diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c index bfb204642..0eb600ac8 100644 --- a/src/joystick/SDL_joystick.c +++ b/src/joystick/SDL_joystick.c @@ -37,7 +37,7 @@ /* This is included in only one place because it has a large static list of controllers */ #include "controller_type.h" -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) /* Needed for checking for input remapping programs */ #include "../core/windows/SDL_windows.h" @@ -2362,7 +2362,7 @@ static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid) static SDL_bool SDL_IsPS4RemapperRunning(void) { -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) const char *mapper_processes[] = { "DS4Windows.exe", "InputMapper.exe", diff --git a/src/joystick/hidapi/SDL_hidapi_xboxone.c b/src/joystick/hidapi/SDL_hidapi_xboxone.c index b549ef6d6..35635b72a 100644 --- a/src/joystick/hidapi/SDL_hidapi_xboxone.c +++ b/src/joystick/hidapi/SDL_hidapi_xboxone.c @@ -156,7 +156,7 @@ SetInitState(SDL_DriverXboxOne_Context *ctx, SDL_XboxOneInitState state) static void SendAckIfNeeded(SDL_HIDAPI_Device *device, Uint8 *data, int size) { -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) /* The Windows driver is taking care of acks */ #else if ((data[1] & 0x30) == 0x30) { @@ -179,7 +179,7 @@ SendAckIfNeeded(SDL_HIDAPI_Device *device, Uint8 *data, int size) SDL_SetError("Couldn't send ack packet"); } } -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__WINGDK__ */ } #if 0 @@ -912,7 +912,7 @@ HIDAPI_DriverXboxOne_UpdateInitState(SDL_HIDAPI_Device *device, SDL_DriverXboxOn switch (ctx->init_state) { case XBOX_ONE_INIT_STATE_START_NEGOTIATING: -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) /* The Windows driver is taking care of negotiation */ SetInitState(ctx, XBOX_ONE_INIT_STATE_COMPLETE); #else diff --git a/src/joystick/hidapi/SDL_hidapijoystick.c b/src/joystick/hidapi/SDL_hidapijoystick.c index 38164b0f7..b0b9a505a 100644 --- a/src/joystick/hidapi/SDL_hidapijoystick.c +++ b/src/joystick/hidapi/SDL_hidapijoystick.c @@ -32,7 +32,7 @@ #include "SDL_hidapi_rumble.h" #include "../../SDL_hints_c.h" -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__WINGDK__) #include "../windows/SDL_rawinputjoystick_c.h" #endif diff --git a/src/main/gdk/SDL_gdk_main.c b/src/main/gdk/SDL_gdk_main.c new file mode 100644 index 000000000..4a25bbb18 --- /dev/null +++ b/src/main/gdk/SDL_gdk_main.c @@ -0,0 +1,41 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "SDL_config.h" + +/* Include this so we define UNICODE properly */ +#include "../../core/windows/SDL_windows.h" + +/* Include the SDL main definition header */ +#include "SDL.h" +#include "SDL_main.h" + +#ifdef main +# undef main +#endif /* main */ + +/* This is where execution begins */ +int WINAPI +WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) +{ + return SDL_GDKRunApp(SDL_main, NULL); +} + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c index 3d0eac892..5344d0a55 100644 --- a/src/render/direct3d/SDL_render_d3d.c +++ b/src/render/direct3d/SDL_render_d3d.c @@ -1775,7 +1775,7 @@ SDL_RenderDriver D3D_RenderDriver = { }; #endif /* SDL_VIDEO_RENDER_D3D && !SDL_RENDER_DISABLED */ -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) /* This function needs to always exist on Windows, for the Dynamic API. */ IDirect3DDevice9 * SDL_RenderGetD3D9Device(SDL_Renderer * renderer) @@ -1799,6 +1799,6 @@ SDL_RenderGetD3D9Device(SDL_Renderer * renderer) return device; } -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c index 49a193ab0..cd3dab4a2 100644 --- a/src/render/direct3d11/SDL_render_d3d11.c +++ b/src/render/direct3d11/SDL_render_d3d11.c @@ -672,7 +672,7 @@ done: return result; } -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) static DXGI_MODE_ROTATION D3D11_GetCurrentRotation() @@ -681,7 +681,7 @@ D3D11_GetCurrentRotation() return DXGI_MODE_ROTATION_IDENTITY; } -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ static BOOL D3D11_IsDisplayRotated90Degrees(DXGI_MODE_ROTATION rotation) @@ -827,7 +827,7 @@ D3D11_CreateSwapChain(SDL_Renderer * renderer, int w, int h) goto done; #endif } else { -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) SDL_SysWMinfo windowinfo; SDL_VERSION(&windowinfo.version); SDL_GetWindowWMInfo(renderer->window, &windowinfo); @@ -849,7 +849,7 @@ D3D11_CreateSwapChain(SDL_Renderer * renderer, int w, int h) #else SDL_SetError(__FUNCTION__", Unable to find something to attach a swap chain to"); goto done; -#endif /* ifdef __WIN32__ / else */ +#endif /* defined(__WIN32__) || defined(__WINGDK__) / else */ } data->swapEffect = swapChainDesc.SwapEffect; @@ -2473,7 +2473,7 @@ SDL_RenderDriver D3D11_RenderDriver = { #endif /* SDL_VIDEO_RENDER_D3D11 && !SDL_RENDER_DISABLED */ -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__WINGDK__) /* This function needs to always exist on Windows, for the Dynamic API. */ ID3D11Device * SDL_RenderGetD3D11Device(SDL_Renderer * renderer) @@ -2497,6 +2497,6 @@ SDL_RenderGetD3D11Device(SDL_Renderer * renderer) return device; } -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/render/direct3d12/SDL_render_d3d12.c b/src/render/direct3d12/SDL_render_d3d12.c index 5fbe42b73..24c29f759 100644 --- a/src/render/direct3d12/SDL_render_d3d12.c +++ b/src/render/direct3d12/SDL_render_d3d12.c @@ -3042,7 +3042,7 @@ SDL_RenderDriver D3D12_RenderDriver = { #endif /* SDL_VIDEO_RENDER_D3D12 && !SDL_RENDER_DISABLED */ -#ifdef __WIN32__ +#if defined(__WIN32__) || defined(__GDK__) #ifdef __cplusplus extern "C" #endif @@ -3069,6 +3069,6 @@ SDL_RenderGetD3D12Device(SDL_Renderer * renderer) return device; } -#endif /* __WIN32__ */ +#endif /* defined(__WIN32__) || defined(__GDK__) */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index dbbb7ee52..73a5694dd 100644 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -1715,7 +1715,7 @@ GL_IsProbablyAccelerated(const GL_RenderData *data) /*const char *vendor = (const char *) data->glGetString(GL_VENDOR);*/ const char *renderer = (const char *) data->glGetString(GL_RENDERER); -#ifdef __WINDOWS__ +#if defined(__WINDOWS__) || defined(__WINGDK__) if (SDL_strcmp(renderer, "GDI Generic") == 0) { return SDL_FALSE; /* Microsoft's fallback software renderer. Fix your system! */ } diff --git a/src/render/software/SDL_rotate.c b/src/render/software/SDL_rotate.c index d5ffc147a..ade087265 100644 --- a/src/render/software/SDL_rotate.c +++ b/src/render/software/SDL_rotate.c @@ -32,7 +32,7 @@ Andreas Schiffler -- aschiffler at ferzkopp dot net #if SDL_VIDEO_RENDER_SW && !SDL_RENDER_DISABLED -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__GDK__) #include "../../core/windows/SDL_windows.h" #endif diff --git a/src/stdlib/SDL_getenv.c b/src/stdlib/SDL_getenv.c index add833284..b74974c34 100644 --- a/src/stdlib/SDL_getenv.c +++ b/src/stdlib/SDL_getenv.c @@ -25,7 +25,7 @@ #include "../SDL_internal.h" -#if defined(__WIN32__) +#if defined(__WIN32__) || defined(__WINGDK__) #include "../core/windows/SDL_windows.h" #endif @@ -35,7 +35,7 @@ #include "SDL_stdinc.h" -#if defined(__WIN32__) && (!defined(HAVE_SETENV) || !defined(HAVE_GETENV)) +#if (defined(__WIN32__) || defined(__WINGDK__)) && (!defined(HAVE_SETENV) || !defined(HAVE_GETENV)) /* Note this isn't thread-safe! */ static char *SDL_envmem = NULL; /* Ugh, memory leak */ static size_t SDL_envmemlen = 0; @@ -54,7 +54,7 @@ SDL_setenv(const char *name, const char *value, int overwrite) return setenv(name, value, overwrite); } -#elif defined(__WIN32__) +#elif defined(__WIN32__) || defined(__WINGDK__) int SDL_setenv(const char *name, const char *value, int overwrite) { @@ -187,7 +187,7 @@ SDL_getenv(const char *name) return getenv(name); } -#elif defined(__WIN32__) +#elif defined(__WIN32__) || defined(__WINGDK__) char * SDL_getenv(const char *name) { diff --git a/src/stdlib/SDL_iconv.c b/src/stdlib/SDL_iconv.c index f3a4cbbee..bee60d506 100644 --- a/src/stdlib/SDL_iconv.c +++ b/src/stdlib/SDL_iconv.c @@ -131,7 +131,7 @@ static struct { "US-ASCII", ENCODING_ASCII }, { "8859-1", ENCODING_LATIN1 }, { "ISO-8859-1", ENCODING_LATIN1 }, -#if defined(__WIN32__) || defined(__OS2__) +#if defined(__WIN32__) || defined(__OS2__) || defined(__GDK__) { "WCHAR_T", ENCODING_UTF16LE }, #else { "WCHAR_T", ENCODING_UCS4NATIVE }, diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 084ece803..24fb48103 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -1667,7 +1667,7 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags) /* Clear minimized if not on windows, only windows handles it at create rather than FinishWindowCreation, * but it's important or window focus will get broken on windows! */ -#if !defined(__WIN32__) +#if !defined(__WIN32__) && !defined(__GDK__) if (window->flags & SDL_WINDOW_MINIMIZED) { window->flags &= ~SDL_WINDOW_MINIMIZED; } @@ -2534,7 +2534,7 @@ SDL_CreateWindowFramebuffer(SDL_Window * window) attempt_texture_framebuffer = SDL_FALSE; } - #if defined(__WIN32__) /* GDI BitBlt() is way faster than Direct3D dynamic textures right now. (!!! FIXME: is this still true?) */ + #if defined(__WIN32__) || defined(__WINGDK__) /* GDI BitBlt() is way faster than Direct3D dynamic textures right now. (!!! FIXME: is this still true?) */ else if ((_this->CreateWindowFramebuffer != NULL) && (SDL_strcmp(_this->name, "windows") == 0)) { attempt_texture_framebuffer = SDL_FALSE; } diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 6273a5a98..57c72afdf 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -53,6 +53,10 @@ #include "wmmsg.h" #endif +#ifdef __GDK__ +#include "../../core/gdk/SDL_gdk.h" +#endif + /* #define HIGHDPI_DEBUG */ /* Masks for processing the windows KEYDOWN and KEYUP messages */ @@ -1803,6 +1807,10 @@ WIN_PumpEvents(_THIS) /* Update mouse capture */ WIN_UpdateMouseCapture(); + +#ifdef __GDK__ + GDK_DispatchTaskQueue(); +#endif } diff --git a/test/testsprite2.c b/test/testsprite2.c index fa709e349..a91ddd86e 100644 --- a/test/testsprite2.c +++ b/test/testsprite2.c @@ -56,7 +56,12 @@ quit(int rc) SDL_free(positions); SDL_free(velocities); SDLTest_CommonQuit(state); - exit(rc); + /* If rc is 0, just let main return normally rather than calling exit. + * This allows testing of platforms where SDL_main is required and does meaningful cleanup. + */ + if (rc != 0) { + exit(rc); + } } int