Misc: Remove unused code
18
README.md
|
@ -80,24 +80,6 @@ To set up:
|
||||||
|
|
||||||
The Qt frontend includes an automatic update checker. Builds downloaded after 2020/08/07 will automatically check for updates each time the emulator starts, this can be disabled in Settings. Alternatively, you can force an update check by clicking `Help->Check for Updates`.
|
The Qt frontend includes an automatic update checker. Builds downloaded after 2020/08/07 will automatically check for updates each time the emulator starts, this can be disabled in Settings. Alternatively, you can force an update check by clicking `Help->Check for Updates`.
|
||||||
|
|
||||||
### Universal Windows Platform / Xbox One
|
|
||||||
|
|
||||||
The DuckStation fullscreen UI is available for the Universal Windows Platform and Xbox One.
|
|
||||||
|
|
||||||
To use on Xbox One:
|
|
||||||
|
|
||||||
1. Ensure your console is in developer mode. You will need to purchase a developer license from Microsoft.
|
|
||||||
2. Download the duckstation-uwp.appx file.
|
|
||||||
3. Navigate to the device portal for your console (displayed in the home screen).
|
|
||||||
4. Install the appx file by clicking Add in the main page.
|
|
||||||
5. Set the app to Game mode instead of App mode: Scroll down to DuckStation in the listinng, press the `Change View` button, select `View Details`, and change `App` to `Game`.
|
|
||||||
6. Upload a BIOS image to the local state directory for DuckStation, or place your BIOS image on a removable USB drive. If using a USB drive, you will need to set the BIOS path in DuckStation's settings to point to this directory.
|
|
||||||
7. Add games to the local state games directory, or use a removable USB drive. Again, you will have to register this path in Game List Settings for it to scan.
|
|
||||||
8. Launch the app, and enjoy. By default, the `Change View` button will open the quick menu.
|
|
||||||
9. Don't forget to enable enhancements, an Xbox One S can do 8x resolution scale with 4K output, Series consoles can go higher.
|
|
||||||
|
|
||||||
**NOTE:** I'd recommend using a USB drive for saving memory cards, as the local state directory will be removed when you uninstall the app.
|
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
The only supported version of DuckStation for Linux are the AppImages in the releases page. The AppImages require a distribution equivalent to Ubuntu 20.04 or newer to run, which is also the minimum requirement for Qt 6. If you are using a packaged version of DuckStation from another source, please do not ask us for assistance and speak to your packager instead, they have a history of breaking things and there's a good chance that's the issue.
|
The only supported version of DuckStation for Linux are the AppImages in the releases page. The AppImages require a distribution equivalent to Ubuntu 20.04 or newer to run, which is also the minimum requirement for Qt 6. If you are using a packaged version of DuckStation from another source, please do not ask us for assistance and speak to your packager instead, they have a history of breaking things and there's a good chance that's the issue.
|
||||||
|
|
|
@ -18,30 +18,15 @@
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<PreprocessorDefinitions>_CRT_INTERNAL_NONSTDC_NAMES;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;_CRT_INTERNAL_NONSTDC_NAMES;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalOptions>/Zc:__cplusplus /Zo /utf-8 %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/Zc:__cplusplus /Zo /utf-8 %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
||||||
<!-- Disable exceptions when not building for UWP. -->
|
|
||||||
<ItemDefinitionGroup Condition="!$(Configuration.Contains(UWP))">
|
|
||||||
<ClCompile>
|
|
||||||
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
|
|
||||||
<ItemDefinitionGroup Condition="$(Configuration.Contains(UWP))">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
|
||||||
<AdditionalIncludeDirectories></AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>_UWP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
|
|
||||||
<ItemDefinitionGroup Condition="$(Configuration.Contains(Debug))">
|
<ItemDefinitionGroup Condition="$(Configuration.Contains(Debug))">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
|
|
|
@ -49,59 +49,15 @@
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>x64</Platform>
|
<Platform>x64</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="DebugUWP|ARM64">
|
|
||||||
<Configuration>DebugUWP</Configuration>
|
|
||||||
<Platform>ARM64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="DebugUWP|Win32">
|
|
||||||
<Configuration>DebugUWP</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="DebugUWP|x64">
|
|
||||||
<Configuration>DebugUWP</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="ReleaseUWP|ARM64">
|
|
||||||
<Configuration>ReleaseUWP</Configuration>
|
|
||||||
<Platform>ARM64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="ReleaseUWP|Win32">
|
|
||||||
<Configuration>ReleaseUWP</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="ReleaseUWP|x64">
|
|
||||||
<Configuration>ReleaseUWP</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<PropertyGroup Label="UserMacros">
|
|
||||||
<BuildingForUWP Condition="'$(Configuration)'=='DebugUWP' Or '$(Configuration)'=='ReleaseUWP'">true</BuildingForUWP>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<Import Project="$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.210505.3\build\native\Microsoft.Windows.CppWinRT.props" Condition="$(Configuration.Contains(UWP)) And Exists('$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.210505.3\build\native\Microsoft.Windows.CppWinRT.props')" />
|
|
||||||
|
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<ProjectName>$(MSBuildProjectName)</ProjectName>
|
<ProjectName>$(MSBuildProjectName)</ProjectName>
|
||||||
<RootNamespace>$(MSBuildProjectName)</RootNamespace>
|
<RootNamespace>$(MSBuildProjectName)</RootNamespace>
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Label="Globals" Condition="!$(Configuration.Contains(UWP))">
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Label="Globals" Condition="$(Configuration.Contains(UWP))">
|
|
||||||
<MinimalCoreWin>true</MinimalCoreWin>
|
|
||||||
<DefaultLanguage>en-US</DefaultLanguage>
|
|
||||||
<MinimumVisualStudioVersion>15.0</MinimumVisualStudioVersion>
|
|
||||||
<AppContainerApplication>true</AppContainerApplication>
|
|
||||||
<ApplicationType>Windows Store</ApplicationType>
|
|
||||||
<ApplicationTypeRevision>10.0</ApplicationTypeRevision>
|
|
||||||
<WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == '' ">10.0.19041.0</WindowsTargetPlatformVersion>
|
|
||||||
<WindowsTargetPlatformMinVersion>10.0.17134.0</WindowsTargetPlatformMinVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Label="UserMacros">
|
<PropertyGroup Label="UserMacros">
|
||||||
<RootBuildDir>$(SolutionDir)build\$(Configuration)-$(Platform)\</RootBuildDir>
|
<RootBuildDir>$(SolutionDir)build\$(Configuration)-$(Platform)\</RootBuildDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
|
@ -8,12 +8,6 @@
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Label="Globals" Condition="'$(BuildingForUWP)'=='true'">
|
|
||||||
<CppWinRTOptimized Condition="'$(Configuration)'=='ReleaseUWP'">true</CppWinRTOptimized>
|
|
||||||
<CppWinRTRootNamespaceAutoMerge>false</CppWinRTRootNamespaceAutoMerge>
|
|
||||||
<CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<Import Project="Toolkit.props" />
|
<Import Project="Toolkit.props" />
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
|
|
@ -1,14 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
|
||||||
<Import Project="$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.210505.3\build\native\Microsoft.Windows.CppWinRT.targets" Condition="'$(BuildingForUWP)'=='true' And Exists('$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.210505.3\build\native\Microsoft.Windows.CppWinRT.props')" />
|
|
||||||
|
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
|
||||||
<PropertyGroup>
|
|
||||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Error Condition="'$(BuildingForUWP)'=='true' And !Exists('$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.210505.3\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.210505.3\build\native\Microsoft.Windows.CppWinRT.props'))" />
|
|
||||||
<Error Condition="'$(BuildingForUWP)'=='true' And !Exists('$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.210505.3\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)packages\Microsoft.Windows.CppWinRT.2.0.210505.3\build\native\Microsoft.Windows.CppWinRT.targets'))" />
|
|
||||||
</Target>
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -1,360 +0,0 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 16
|
|
||||||
VisualStudioVersion = 16.0.29230.47
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glad", "dep\glad\glad.vcxproj", "{43540154-9E1E-409C-834F-B84BE5621388}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dependencies", "Dependencies", "{BA490C0E-497D-4634-A21E-E65012006385}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "imgui", "dep\imgui\imgui.vcxproj", "{BB08260F-6FBC-46AF-8924-090EE71360C6}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "src\common\common.vcxproj", "{EE054E08-3799-4A59-A422-18259C105FFD}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2} = {7F909E29-4808-4BD9-A60C-56C51A3AAEC2}
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388} = {43540154-9E1E-409C-834F-B84BE5621388}
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423} = {ED601289-AC1A-46B8-A8ED-17DB9EB73423}
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017} = {425D6C99-D1C8-43C2-B8AC-4D7B1D941017}
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035} = {9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620} = {7FF9FDB9-D504-47DB-A16A-B08071999620}
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3} = {39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core", "src\core\core.vcxproj", "{868B98C8-65A1-494B-8346-250A73A48C0A}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD} = {EE054E08-3799-4A59-A422-18259C105FFD}
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6} = {BB08260F-6FBC-46AF-8924-090EE71360C6}
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB} = {8906836E-F06E-46E8-B11A-74E5E8C7B8FB}
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423} = {ED601289-AC1A-46B8-A8ED-17DB9EB73423}
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C} = {09553C96-9F39-49BF-8AE6-7ACBD07C410C}
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035} = {9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620} = {7FF9FDB9-D504-47DB-A16A-B08071999620}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stb", "dep\stb\stb.vcxproj", "{ED601289-AC1A-46B8-A8ED-17DB9EB73423}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "simpleini", "dep\simpleini\simpleini.vcxproj", "{3773F4CC-614E-4028-8595-22E08CA649E3}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxml2", "dep\tinyxml2\tinyxml2.vcxproj", "{933118A9-68C5-47B4-B151-B03C93961623}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "dep\minizip\minizip.vcxproj", "{8BDA439C-6358-45FB-9994-2FF083BABE06}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620} = {7FF9FDB9-D504-47DB-A16A-B08071999620}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "dep\zlib\zlib.vcxproj", "{7FF9FDB9-D504-47DB-A16A-B08071999620}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libchdr", "dep\libchdr\libchdr.vcxproj", "{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239} = {DD944834-7899-4C1C-A4C1-064B5009D239}
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620} = {7FF9FDB9-D504-47DB-A16A-B08071999620}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lzma", "dep\lzma\lzma.vcxproj", "{DD944834-7899-4C1C-A4C1-064B5009D239}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "frontend-common", "src\frontend-common\frontend-common.vcxproj", "{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB} = {075CED82-6A20-46DF-94C7-9624AC9DDBEB}
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06} = {8BDA439C-6358-45FB-9994-2FF083BABE06}
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623} = {933118A9-68C5-47B4-B151-B03C93961623}
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A} = {868B98C8-65A1-494B-8346-250A73A48C0A}
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3} = {3773F4CC-614E-4028-8595-22E08CA649E3}
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64} = {4BA0A6D4-3AE1-42B2-9347-096FD023FF64}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xxhash", "dep\xxhash\xxhash.vcxproj", "{09553C96-9F39-49BF-8AE6-7ACBD07C410C}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scmversion", "src\scmversion\scmversion.vcxproj", "{075CED82-6A20-46DF-94C7-9624AC9DDBEB}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glslang", "dep\glslang\glslang.vcxproj", "{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vulkan-loader", "dep\vulkan-loader\vulkan-loader.vcxproj", "{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vixl", "dep\vixl\vixl.vcxproj", "{8906836E-F06E-46E8-B11A-74E5E8C7B8FB}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsamplerate", "dep\libsamplerate\libsamplerate.vcxproj", "{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rcheevos", "dep\rcheevos\rcheevos.vcxproj", "{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "duckstation-uwp", "src\duckstation-uwp\duckstation-uwp.vcxproj", "{E2A6CEA9-9537-4C61-B637-81F1F17EF638}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6} = {6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
DebugUWP|ARM64 = DebugUWP|ARM64
|
|
||||||
DebugUWP|x64 = DebugUWP|x64
|
|
||||||
DebugUWP|x86 = DebugUWP|x86
|
|
||||||
ReleaseUWP|ARM64 = ReleaseUWP|ARM64
|
|
||||||
ReleaseUWP|x64 = ReleaseUWP|x64
|
|
||||||
ReleaseUWP|x86 = ReleaseUWP|x86
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{EE054E08-3799-4A59-A422-18259C105FFD}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{868B98C8-65A1-494B-8346-250A73A48C0A}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{6245DEC8-D2DA-47EE-A373-CBD6FCF3ECE6}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{075CED82-6A20-46DF-94C7-9624AC9DDBEB}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.DebugUWP|ARM64.Deploy.0 = DebugUWP|ARM64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.DebugUWP|x64.Build.0 = DebugUWP|x64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.DebugUWP|x64.Deploy.0 = DebugUWP|x64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.DebugUWP|x86.Build.0 = DebugUWP|Win32
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.DebugUWP|x86.Deploy.0 = DebugUWP|Win32
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.ReleaseUWP|ARM64.Deploy.0 = ReleaseUWP|ARM64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.ReleaseUWP|x64.Deploy.0 = ReleaseUWP|x64
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
|
|
||||||
{E2A6CEA9-9537-4C61-B637-81F1F17EF638}.ReleaseUWP|x86.Deploy.0 = ReleaseUWP|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(NestedProjects) = preSolution
|
|
||||||
{43540154-9E1E-409C-834F-B84BE5621388} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{BB08260F-6FBC-46AF-8924-090EE71360C6} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{ED601289-AC1A-46B8-A8ED-17DB9EB73423} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{3773F4CC-614E-4028-8595-22E08CA649E3} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{933118A9-68C5-47B4-B151-B03C93961623} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{8BDA439C-6358-45FB-9994-2FF083BABE06} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{7FF9FDB9-D504-47DB-A16A-B08071999620} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{425D6C99-D1C8-43C2-B8AC-4D7B1D941017} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{DD944834-7899-4C1C-A4C1-064B5009D239} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{09553C96-9F39-49BF-8AE6-7ACBD07C410C} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{7F909E29-4808-4BD9-A60C-56C51A3AAEC2} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{9C8DDEB0-2B8F-4F5F-BA86-127CDF27F035} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{8906836E-F06E-46E8-B11A-74E5E8C7B8FB} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64} = {BA490C0E-497D-4634-A21E-E65012006385}
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
SolutionGuid = {26E40B32-7C1D-48D0-95F4-1A500E054028}
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
#include "windows_headers.h"
|
#include "windows_headers.h"
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
#include <tlhelp32.h>
|
#include <tlhelp32.h>
|
||||||
|
@ -13,7 +13,7 @@ static std::mutex s_AssertFailedMutex;
|
||||||
|
|
||||||
static inline void FreezeThreads(void** ppHandle)
|
static inline void FreezeThreads(void** ppHandle)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
|
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
|
||||||
if (hSnapshot != INVALID_HANDLE_VALUE)
|
if (hSnapshot != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
@ -43,7 +43,7 @@ static inline void FreezeThreads(void** ppHandle)
|
||||||
|
|
||||||
static inline void ResumeThreads(void* pHandle)
|
static inline void ResumeThreads(void* pHandle)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
HANDLE hSnapshot = (HANDLE)pHandle;
|
HANDLE hSnapshot = (HANDLE)pHandle;
|
||||||
if (pHandle != INVALID_HANDLE_VALUE)
|
if (pHandle != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
@ -79,7 +79,7 @@ void Y_OnAssertFailed(const char* szMessage, const char* szFunction, const char*
|
||||||
char szMsg[512];
|
char szMsg[512];
|
||||||
std::snprintf(szMsg, sizeof(szMsg), "%s in function %s (%s:%u)", szMessage, szFunction, szFile, uLine);
|
std::snprintf(szMsg, sizeof(szMsg), "%s in function %s (%s:%u)", szMessage, szFunction, szFile, uLine);
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
||||||
WriteConsoleA(GetStdHandle(STD_ERROR_HANDLE), szMsg, static_cast<DWORD>(std::strlen(szMsg)), NULL, NULL);
|
WriteConsoleA(GetStdHandle(STD_ERROR_HANDLE), szMsg, static_cast<DWORD>(std::strlen(szMsg)), NULL, NULL);
|
||||||
OutputDebugStringA(szMsg);
|
OutputDebugStringA(szMsg);
|
||||||
|
@ -114,7 +114,7 @@ void Y_OnPanicReached(const char* szMessage, const char* szFunction, const char*
|
||||||
char szMsg[512];
|
char szMsg[512];
|
||||||
std::snprintf(szMsg, sizeof(szMsg), "%s in function %s (%s:%u)", szMessage, szFunction, szFile, uLine);
|
std::snprintf(szMsg, sizeof(szMsg), "%s in function %s (%s:%u)", szMessage, szFunction, szFile, uLine);
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
||||||
WriteConsoleA(GetStdHandle(STD_ERROR_HANDLE), szMsg, static_cast<DWORD>(std::strlen(szMsg)), NULL, NULL);
|
WriteConsoleA(GetStdHandle(STD_ERROR_HANDLE), szMsg, static_cast<DWORD>(std::strlen(szMsg)), NULL, NULL);
|
||||||
OutputDebugStringA(szMsg);
|
OutputDebugStringA(szMsg);
|
||||||
|
|
|
@ -286,7 +286,7 @@ public:
|
||||||
{
|
{
|
||||||
if (m_discarded)
|
if (m_discarded)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
// delete the temporary file
|
// delete the temporary file
|
||||||
if (!DeleteFileW(StringUtil::UTF8StringToWideString(m_temporaryFileName).c_str()))
|
if (!DeleteFileW(StringUtil::UTF8StringToWideString(m_temporaryFileName).c_str()))
|
||||||
{
|
{
|
||||||
|
@ -294,14 +294,6 @@ public:
|
||||||
"AtomicUpdatedFileByteStream::~AtomicUpdatedFileByteStream(): Failed to delete temporary file '%s'",
|
"AtomicUpdatedFileByteStream::~AtomicUpdatedFileByteStream(): Failed to delete temporary file '%s'",
|
||||||
m_temporaryFileName.c_str());
|
m_temporaryFileName.c_str());
|
||||||
}
|
}
|
||||||
#elif defined(_UWP)
|
|
||||||
// delete the temporary file
|
|
||||||
if (!DeleteFileFromAppW(StringUtil::UTF8StringToWideString(m_temporaryFileName).c_str()))
|
|
||||||
{
|
|
||||||
Log_WarningPrintf(
|
|
||||||
"AtomicUpdatedFileByteStream::~AtomicUpdatedFileByteStream(): Failed to delete temporary file '%s'",
|
|
||||||
m_temporaryFileName.c_str());
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
// delete the temporary file
|
// delete the temporary file
|
||||||
if (remove(m_temporaryFileName.c_str()) < 0)
|
if (remove(m_temporaryFileName.c_str()) < 0)
|
||||||
|
@ -326,7 +318,7 @@ public:
|
||||||
|
|
||||||
fflush(m_pFile);
|
fflush(m_pFile);
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
// move the atomic file name to the original file name
|
// move the atomic file name to the original file name
|
||||||
if (!MoveFileExW(StringUtil::UTF8StringToWideString(m_temporaryFileName).c_str(),
|
if (!MoveFileExW(StringUtil::UTF8StringToWideString(m_temporaryFileName).c_str(),
|
||||||
StringUtil::UTF8StringToWideString(m_originalFileName).c_str(), MOVEFILE_REPLACE_EXISTING))
|
StringUtil::UTF8StringToWideString(m_originalFileName).c_str(), MOVEFILE_REPLACE_EXISTING))
|
||||||
|
@ -339,17 +331,6 @@ public:
|
||||||
{
|
{
|
||||||
m_committed = true;
|
m_committed = true;
|
||||||
}
|
}
|
||||||
#elif defined(_UWP)
|
|
||||||
if (!FileSystem::RenamePath(m_temporaryFileName.c_str(), m_originalFileName.c_str()))
|
|
||||||
{
|
|
||||||
Log_WarningPrintf("AtomicUpdatedFileByteStream::Commit(): Failed to rename temporary file '%s' to '%s'",
|
|
||||||
m_temporaryFileName.c_str(), m_originalFileName.c_str());
|
|
||||||
m_discarded = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_committed = true;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
// move the atomic file name to the original file name
|
// move the atomic file name to the original file name
|
||||||
if (rename(m_temporaryFileName.c_str(), m_originalFileName.c_str()) < 0)
|
if (rename(m_temporaryFileName.c_str(), m_originalFileName.c_str()) < 0)
|
||||||
|
@ -1049,7 +1030,6 @@ std::unique_ptr<ByteStream> ByteStream::OpenFile(const char* fileName, u32 openM
|
||||||
{
|
{
|
||||||
DebugAssert(openMode & (BYTESTREAM_OPEN_CREATE | BYTESTREAM_OPEN_WRITE));
|
DebugAssert(openMode & (BYTESTREAM_OPEN_CREATE | BYTESTREAM_OPEN_WRITE));
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#ifndef _UWP
|
|
||||||
// generate the temporary file name
|
// generate the temporary file name
|
||||||
u32 fileNameLength = static_cast<u32>(std::strlen(fileName));
|
u32 fileNameLength = static_cast<u32>(std::strlen(fileName));
|
||||||
char* temporaryFileName = (char*)alloca(fileNameLength + 8);
|
char* temporaryFileName = (char*)alloca(fileNameLength + 8);
|
||||||
|
@ -1058,35 +1038,14 @@ std::unique_ptr<ByteStream> ByteStream::OpenFile(const char* fileName, u32 openM
|
||||||
// fill in random characters
|
// fill in random characters
|
||||||
_mktemp_s(temporaryFileName, fileNameLength + 8);
|
_mktemp_s(temporaryFileName, fileNameLength + 8);
|
||||||
const std::wstring wideTemporaryFileName(StringUtil::UTF8StringToWideString(temporaryFileName));
|
const std::wstring wideTemporaryFileName(StringUtil::UTF8StringToWideString(temporaryFileName));
|
||||||
#else
|
|
||||||
// On UWP, preserve the extension, as it affects permissions.
|
|
||||||
std::string temporaryFileName;
|
|
||||||
const char* extension = std::strrchr(fileName, '.');
|
|
||||||
if (extension)
|
|
||||||
temporaryFileName.append(fileName, extension - fileName);
|
|
||||||
else
|
|
||||||
temporaryFileName.append(fileName);
|
|
||||||
|
|
||||||
temporaryFileName.append("_XXXXXX");
|
|
||||||
_mktemp_s(temporaryFileName.data(), temporaryFileName.size() + 1);
|
|
||||||
if (extension)
|
|
||||||
temporaryFileName.append(extension);
|
|
||||||
|
|
||||||
const std::wstring wideTemporaryFileName(StringUtil::UTF8StringToWideString(temporaryFileName));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// massive hack here
|
// massive hack here
|
||||||
DWORD desiredAccess = GENERIC_WRITE;
|
DWORD desiredAccess = GENERIC_WRITE;
|
||||||
if (openMode & BYTESTREAM_OPEN_READ)
|
if (openMode & BYTESTREAM_OPEN_READ)
|
||||||
desiredAccess |= GENERIC_READ;
|
desiredAccess |= GENERIC_READ;
|
||||||
|
|
||||||
#ifndef _UWP
|
|
||||||
HANDLE hFile =
|
HANDLE hFile =
|
||||||
CreateFileW(wideTemporaryFileName.c_str(), desiredAccess, FILE_SHARE_DELETE, NULL, CREATE_NEW, 0, NULL);
|
CreateFileW(wideTemporaryFileName.c_str(), desiredAccess, FILE_SHARE_DELETE, NULL, CREATE_NEW, 0, NULL);
|
||||||
#else
|
|
||||||
HANDLE hFile =
|
|
||||||
CreateFile2FromAppW(wideTemporaryFileName.c_str(), desiredAccess, FILE_SHARE_DELETE, CREATE_NEW, nullptr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (hFile == INVALID_HANDLE_VALUE)
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -2,15 +2,15 @@
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PreprocessorDefinitions Condition="('$(BuildingForUWP)'!='true' And '$(Platform)'!='ARM64')">WITH_OPENGL=1;WITH_VULKAN=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Platform)'!='ARM64'">WITH_OPENGL=1;WITH_VULKAN=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories Condition="('$(BuildingForUWP)'!='true' And '$(Platform)'!='ARM64')">$(SolutionDir)dep\glad\include;$(SolutionDir)dep\vulkan\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Platform)'!='ARM64'">$(SolutionDir)dep\glad\include;$(SolutionDir)dep\vulkan\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\fmt\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\fmt\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies Condition="('$(BuildingForUWP)'!='true' And '$(Platform)'!='ARM64')">$(RootBuildDir)glad\glad.lib;$(RootBuildDir)glslang\glslang.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies Condition="'$(Platform)'!='ARM64'">$(RootBuildDir)glad\glad.lib;$(RootBuildDir)glslang\glslang.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalDependencies>$(RootBuildDir)zstd\zstd.lib;$(RootBuildDir)fmt\fmt.lib;$(RootBuildDir)zlib\zlib.lib;$(RootBuildDir)minizip\minizip.lib;$(RootBuildDir)lzma\lzma.lib;d3dcompiler.lib;d3d11.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>$(RootBuildDir)zstd\zstd.lib;$(RootBuildDir)fmt\fmt.lib;$(RootBuildDir)zlib\zlib.lib;$(RootBuildDir)minizip\minizip.lib;$(RootBuildDir)lzma\lzma.lib;d3dcompiler.lib;d3d11.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
|
@ -27,35 +27,30 @@
|
||||||
<ClInclude Include="fifo_queue.h" />
|
<ClInclude Include="fifo_queue.h" />
|
||||||
<ClInclude Include="file_system.h" />
|
<ClInclude Include="file_system.h" />
|
||||||
<ClInclude Include="gl\context.h">
|
<ClInclude Include="gl\context.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="gl\context_wgl.h">
|
<ClInclude Include="gl\context_wgl.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="gl\loader.h">
|
<ClInclude Include="gl\loader.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="gl\program.h">
|
<ClInclude Include="gl\program.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="gl\shader_cache.h">
|
<ClInclude Include="gl\shader_cache.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="gl\stream_buffer.h">
|
<ClInclude Include="gl\stream_buffer.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="gl\texture.h">
|
<ClInclude Include="gl\texture.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="hash_combine.h" />
|
<ClInclude Include="hash_combine.h" />
|
||||||
<ClInclude Include="heap_array.h" />
|
<ClInclude Include="heap_array.h" />
|
||||||
<ClInclude Include="http_downloader.h" />
|
<ClInclude Include="http_downloader.h" />
|
||||||
<ClInclude Include="http_downloader_uwp.h">
|
<ClInclude Include="http_downloader_winhttp.h" />
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'!='true'">true</ExcludedFromBuild>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="http_downloader_winhttp.h">
|
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="image.h" />
|
<ClInclude Include="image.h" />
|
||||||
<ClInclude Include="layered_settings_interface.h" />
|
<ClInclude Include="layered_settings_interface.h" />
|
||||||
<ClInclude Include="log.h" />
|
<ClInclude Include="log.h" />
|
||||||
|
@ -74,52 +69,48 @@
|
||||||
<ClInclude Include="string.h" />
|
<ClInclude Include="string.h" />
|
||||||
<ClInclude Include="heterogeneous_containers.h" />
|
<ClInclude Include="heterogeneous_containers.h" />
|
||||||
<ClInclude Include="string_util.h" />
|
<ClInclude Include="string_util.h" />
|
||||||
<ClInclude Include="thirdparty\StackWalker.h">
|
<ClInclude Include="thirdparty\StackWalker.h" />
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="threading.h" />
|
<ClInclude Include="threading.h" />
|
||||||
<ClInclude Include="timer.h" />
|
<ClInclude Include="timer.h" />
|
||||||
<ClInclude Include="types.h" />
|
<ClInclude Include="types.h" />
|
||||||
<ClInclude Include="minizip_helpers.h" />
|
<ClInclude Include="minizip_helpers.h" />
|
||||||
<ClInclude Include="vulkan\builders.h">
|
<ClInclude Include="vulkan\builders.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\context.h">
|
<ClInclude Include="vulkan\context.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\entry_points.h">
|
<ClInclude Include="vulkan\entry_points.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\loader.h">
|
<ClInclude Include="vulkan\loader.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\shader_cache.h">
|
<ClInclude Include="vulkan\shader_cache.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\shader_compiler.h">
|
<ClInclude Include="vulkan\shader_compiler.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\staging_buffer.h">
|
<ClInclude Include="vulkan\staging_buffer.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\staging_texture.h">
|
<ClInclude Include="vulkan\staging_texture.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\stream_buffer.h">
|
<ClInclude Include="vulkan\stream_buffer.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\swap_chain.h">
|
<ClInclude Include="vulkan\swap_chain.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\texture.h">
|
<ClInclude Include="vulkan\texture.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="vulkan\util.h">
|
<ClInclude Include="vulkan\util.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="win32_progress_callback.h">
|
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="win32_progress_callback.h" />
|
||||||
<ClInclude Include="windows_headers.h" />
|
<ClInclude Include="windows_headers.h" />
|
||||||
<ClInclude Include="window_info.h" />
|
<ClInclude Include="window_info.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -142,30 +133,25 @@
|
||||||
<ClCompile Include="d3d12\util.cpp" />
|
<ClCompile Include="d3d12\util.cpp" />
|
||||||
<ClCompile Include="file_system.cpp" />
|
<ClCompile Include="file_system.cpp" />
|
||||||
<ClCompile Include="gl\context.cpp">
|
<ClCompile Include="gl\context.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="gl\context_wgl.cpp">
|
<ClCompile Include="gl\context_wgl.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="gl\program.cpp">
|
<ClCompile Include="gl\program.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="gl\shader_cache.cpp">
|
<ClCompile Include="gl\shader_cache.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="gl\stream_buffer.cpp">
|
<ClCompile Include="gl\stream_buffer.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="gl\texture.cpp">
|
<ClCompile Include="gl\texture.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="http_downloader.cpp" />
|
<ClCompile Include="http_downloader.cpp" />
|
||||||
<ClCompile Include="http_downloader_uwp.cpp">
|
<ClCompile Include="http_downloader_winhttp.cpp" />
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'!='true'">true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="http_downloader_winhttp.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="image.cpp" />
|
<ClCompile Include="image.cpp" />
|
||||||
<ClCompile Include="layered_settings_interface.cpp" />
|
<ClCompile Include="layered_settings_interface.cpp" />
|
||||||
<ClCompile Include="log.cpp" />
|
<ClCompile Include="log.cpp" />
|
||||||
|
@ -176,47 +162,43 @@
|
||||||
<ClCompile Include="sha1_digest.cpp" />
|
<ClCompile Include="sha1_digest.cpp" />
|
||||||
<ClCompile Include="string.cpp" />
|
<ClCompile Include="string.cpp" />
|
||||||
<ClCompile Include="string_util.cpp" />
|
<ClCompile Include="string_util.cpp" />
|
||||||
<ClCompile Include="thirdparty\StackWalker.cpp">
|
<ClCompile Include="thirdparty\StackWalker.cpp" />
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="threading.cpp" />
|
<ClCompile Include="threading.cpp" />
|
||||||
<ClCompile Include="timer.cpp" />
|
<ClCompile Include="timer.cpp" />
|
||||||
<ClCompile Include="vulkan\builders.cpp">
|
<ClCompile Include="vulkan\builders.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\context.cpp">
|
<ClCompile Include="vulkan\context.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\loader.cpp">
|
<ClCompile Include="vulkan\loader.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\shader_cache.cpp">
|
<ClCompile Include="vulkan\shader_cache.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\shader_compiler.cpp">
|
<ClCompile Include="vulkan\shader_compiler.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\staging_buffer.cpp">
|
<ClCompile Include="vulkan\staging_buffer.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\staging_texture.cpp">
|
<ClCompile Include="vulkan\staging_texture.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\stream_buffer.cpp">
|
<ClCompile Include="vulkan\stream_buffer.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\swap_chain.cpp">
|
<ClCompile Include="vulkan\swap_chain.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\texture.cpp">
|
<ClCompile Include="vulkan\texture.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="vulkan\util.cpp">
|
<ClCompile Include="vulkan\util.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="win32_progress_callback.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="win32_progress_callback.cpp" />
|
||||||
<ClCompile Include="window_info.cpp" />
|
<ClCompile Include="window_info.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -224,7 +206,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="vulkan\entry_points.inl">
|
<None Include="vulkan\entry_points.inl">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
|
|
|
@ -117,7 +117,6 @@
|
||||||
<ClInclude Include="d3d12\shader_cache.h">
|
<ClInclude Include="d3d12\shader_cache.h">
|
||||||
<Filter>d3d12</Filter>
|
<Filter>d3d12</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="http_downloader_uwp.h" />
|
|
||||||
<ClInclude Include="http_downloader_winhttp.h" />
|
<ClInclude Include="http_downloader_winhttp.h" />
|
||||||
<ClInclude Include="http_downloader.h" />
|
<ClInclude Include="http_downloader.h" />
|
||||||
<ClInclude Include="vulkan\entry_points.h">
|
<ClInclude Include="vulkan\entry_points.h">
|
||||||
|
@ -245,7 +244,6 @@
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="http_downloader_winhttp.cpp" />
|
<ClCompile Include="http_downloader_winhttp.cpp" />
|
||||||
<ClCompile Include="http_downloader.cpp" />
|
<ClCompile Include="http_downloader.cpp" />
|
||||||
<ClCompile Include="http_downloader_uwp.cpp" />
|
|
||||||
<ClCompile Include="vulkan\loader.cpp">
|
<ClCompile Include="vulkan\loader.cpp">
|
||||||
<Filter>vulkan</Filter>
|
<Filter>vulkan</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
#include "windows_headers.h"
|
#include "windows_headers.h"
|
||||||
|
|
||||||
#include "thirdparty/StackWalker.h"
|
#include "thirdparty/StackWalker.h"
|
||||||
|
|
|
@ -6,10 +6,6 @@
|
||||||
#include <d3dcompiler.h>
|
#include <d3dcompiler.h>
|
||||||
Log_SetChannel(D3D12::ShaderCache);
|
Log_SetChannel(D3D12::ShaderCache);
|
||||||
|
|
||||||
#ifdef _UWP
|
|
||||||
#include <winrt/Windows.System.Profile.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace D3D12 {
|
namespace D3D12 {
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
@ -24,19 +20,7 @@ struct CacheIndexEntry
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
static bool CanUsePipelineCache()
|
ShaderCache::ShaderCache() = default;
|
||||||
{
|
|
||||||
#ifdef _UWP
|
|
||||||
// GetCachedBlob crashes on XBox UWP for some reason...
|
|
||||||
const auto version_info = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo();
|
|
||||||
const auto device_family = version_info.DeviceFamily();
|
|
||||||
return (device_family != L"Windows.Xbox");
|
|
||||||
#else
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ShaderCache::ShaderCache() : m_use_pipeline_cache(CanUsePipelineCache()) {}
|
|
||||||
|
|
||||||
ShaderCache::~ShaderCache()
|
ShaderCache::~ShaderCache()
|
||||||
{
|
{
|
||||||
|
@ -80,8 +64,6 @@ void ShaderCache::Open(std::string_view base_path, D3D_FEATURE_LEVEL feature_lev
|
||||||
CreateNew(shader_index_filename, shader_blob_filename, m_shader_index_file, m_shader_blob_file);
|
CreateNew(shader_index_filename, shader_blob_filename, m_shader_index_file, m_shader_blob_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_use_pipeline_cache)
|
|
||||||
{
|
|
||||||
const std::string base_pipelines_filename = GetCacheBaseFileName(base_path, "pipelines", feature_level, debug);
|
const std::string base_pipelines_filename = GetCacheBaseFileName(base_path, "pipelines", feature_level, debug);
|
||||||
const std::string pipelines_index_filename = base_pipelines_filename + ".idx";
|
const std::string pipelines_index_filename = base_pipelines_filename + ".idx";
|
||||||
const std::string pipelines_blob_filename = base_pipelines_filename + ".bin";
|
const std::string pipelines_blob_filename = base_pipelines_filename + ".bin";
|
||||||
|
@ -93,7 +75,6 @@ void ShaderCache::Open(std::string_view base_path, D3D_FEATURE_LEVEL feature_lev
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void ShaderCache::InvalidatePipelineCache()
|
void ShaderCache::InvalidatePipelineCache()
|
||||||
{
|
{
|
||||||
|
@ -110,15 +91,11 @@ void ShaderCache::InvalidatePipelineCache()
|
||||||
m_pipeline_index_file = nullptr;
|
m_pipeline_index_file = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_use_pipeline_cache)
|
const std::string base_pipelines_filename = GetCacheBaseFileName(m_base_path, "pipelines", m_feature_level, m_debug);
|
||||||
{
|
|
||||||
const std::string base_pipelines_filename =
|
|
||||||
GetCacheBaseFileName(m_base_path, "pipelines", m_feature_level, m_debug);
|
|
||||||
const std::string pipelines_index_filename = base_pipelines_filename + ".idx";
|
const std::string pipelines_index_filename = base_pipelines_filename + ".idx";
|
||||||
const std::string pipelines_blob_filename = base_pipelines_filename + ".bin";
|
const std::string pipelines_blob_filename = base_pipelines_filename + ".bin";
|
||||||
CreateNew(pipelines_index_filename, pipelines_blob_filename, m_pipeline_index_file, m_pipeline_blob_file);
|
CreateNew(pipelines_index_filename, pipelines_blob_filename, m_pipeline_index_file, m_pipeline_blob_file);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
bool ShaderCache::CreateNew(const std::string& index_filename, const std::string& blob_filename, std::FILE*& index_file,
|
bool ShaderCache::CreateNew(const std::string& index_filename, const std::string& blob_filename, std::FILE*& index_file,
|
||||||
std::FILE*& blob_file)
|
std::FILE*& blob_file)
|
||||||
|
|
|
@ -111,7 +111,6 @@ private:
|
||||||
CacheIndex m_pipeline_index;
|
CacheIndex m_pipeline_index;
|
||||||
|
|
||||||
D3D_FEATURE_LEVEL m_feature_level = D3D_FEATURE_LEVEL_11_0;
|
D3D_FEATURE_LEVEL m_feature_level = D3D_FEATURE_LEVEL_11_0;
|
||||||
bool m_use_pipeline_cache = false;
|
|
||||||
bool m_debug = false;
|
bool m_debug = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -23,19 +23,6 @@
|
||||||
#include <share.h>
|
#include <share.h>
|
||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
#include <winioctl.h>
|
#include <winioctl.h>
|
||||||
|
|
||||||
#if defined(_UWP)
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <io.h>
|
|
||||||
#include <winrt/Windows.ApplicationModel.h>
|
|
||||||
#include <winrt/Windows.Devices.Enumeration.h>
|
|
||||||
#include <winrt/Windows.Foundation.Collections.h>
|
|
||||||
#include <winrt/Windows.Foundation.h>
|
|
||||||
#include <winrt/Windows.Storage.FileProperties.h>
|
|
||||||
#include <winrt/Windows.Storage.Search.h>
|
|
||||||
#include <winrt/Windows.Storage.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
@ -514,7 +501,7 @@ std::vector<std::string> FileSystem::GetRootDirectoryList()
|
||||||
{
|
{
|
||||||
std::vector<std::string> results;
|
std::vector<std::string> results;
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
char buf[256];
|
char buf[256];
|
||||||
const DWORD size = GetLogicalDriveStringsA(sizeof(buf), buf);
|
const DWORD size = GetLogicalDriveStringsA(sizeof(buf), buf);
|
||||||
if (size != 0 && size < (sizeof(buf) - 1))
|
if (size != 0 && size < (sizeof(buf) - 1))
|
||||||
|
@ -527,28 +514,6 @@ std::vector<std::string> FileSystem::GetRootDirectoryList()
|
||||||
ptr += len + 1u;
|
ptr += len + 1u;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined(_UWP)
|
|
||||||
if (const auto install_location = winrt::Windows::ApplicationModel::Package::Current().InstalledLocation();
|
|
||||||
install_location)
|
|
||||||
{
|
|
||||||
if (const auto path = install_location.Path(); !path.empty())
|
|
||||||
results.push_back(StringUtil::WideStringToUTF8String(path));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (const auto local_location = winrt::Windows::Storage::ApplicationData::Current().LocalFolder(); local_location)
|
|
||||||
{
|
|
||||||
if (const auto path = local_location.Path(); !path.empty())
|
|
||||||
results.push_back(StringUtil::WideStringToUTF8String(path));
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto devices = winrt::Windows::Storage::KnownFolders::RemovableDevices();
|
|
||||||
const auto folders_task(devices.GetFoldersAsync());
|
|
||||||
for (const auto& storage_folder : folders_task.get())
|
|
||||||
{
|
|
||||||
const auto path = storage_folder.Path();
|
|
||||||
if (!path.empty())
|
|
||||||
results.push_back(StringUtil::WideStringToUTF8String(path));
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
const char* home_path = std::getenv("HOME");
|
const char* home_path = std::getenv("HOME");
|
||||||
if (home_path)
|
if (home_path)
|
||||||
|
@ -588,127 +553,6 @@ std::string Path::Combine(const std::string_view& base, const std::string_view&
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _UWP
|
|
||||||
static std::FILE* OpenCFileUWP(const wchar_t* wfilename, const wchar_t* mode, FileSystem::FileShareMode share_mode)
|
|
||||||
{
|
|
||||||
DWORD access = 0;
|
|
||||||
DWORD share = 0;
|
|
||||||
DWORD disposition = 0;
|
|
||||||
|
|
||||||
switch (share_mode)
|
|
||||||
{
|
|
||||||
case FileSystem::FileShareMode::DenyNone:
|
|
||||||
share = FILE_SHARE_READ | FILE_SHARE_WRITE;
|
|
||||||
break;
|
|
||||||
case FileSystem::FileShareMode::DenyRead:
|
|
||||||
share = FILE_SHARE_WRITE;
|
|
||||||
break;
|
|
||||||
case FileSystem::FileShareMode::DenyWrite:
|
|
||||||
share = FILE_SHARE_READ;
|
|
||||||
break;
|
|
||||||
case FileSystem::FileShareMode::DenyReadWrite:
|
|
||||||
default:
|
|
||||||
share = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int flags = 0;
|
|
||||||
const wchar_t* tmode = mode;
|
|
||||||
while (*tmode)
|
|
||||||
{
|
|
||||||
if (*tmode == L'r' && *(tmode + 1) == L'+')
|
|
||||||
{
|
|
||||||
access = GENERIC_READ | GENERIC_WRITE;
|
|
||||||
disposition = OPEN_EXISTING;
|
|
||||||
flags |= _O_RDWR;
|
|
||||||
tmode += 2;
|
|
||||||
}
|
|
||||||
else if (*tmode == L'w' && *(tmode + 1) == L'+')
|
|
||||||
{
|
|
||||||
access = GENERIC_READ | GENERIC_WRITE;
|
|
||||||
disposition = CREATE_ALWAYS;
|
|
||||||
flags |= _O_RDWR | _O_CREAT | _O_TRUNC;
|
|
||||||
tmode += 2;
|
|
||||||
}
|
|
||||||
else if (*tmode == L'a' && *(tmode + 1) == L'+')
|
|
||||||
{
|
|
||||||
access = GENERIC_READ | GENERIC_WRITE;
|
|
||||||
disposition = CREATE_ALWAYS;
|
|
||||||
flags |= _O_RDWR | _O_APPEND | _O_CREAT | _O_TRUNC;
|
|
||||||
tmode += 2;
|
|
||||||
}
|
|
||||||
else if (*tmode == L'r')
|
|
||||||
{
|
|
||||||
access = GENERIC_READ;
|
|
||||||
disposition = OPEN_EXISTING;
|
|
||||||
flags |= _O_RDONLY;
|
|
||||||
tmode++;
|
|
||||||
}
|
|
||||||
else if (*tmode == L'w')
|
|
||||||
{
|
|
||||||
access = GENERIC_WRITE;
|
|
||||||
disposition = CREATE_ALWAYS;
|
|
||||||
flags |= _O_WRONLY | _O_CREAT | _O_TRUNC;
|
|
||||||
tmode++;
|
|
||||||
}
|
|
||||||
else if (*tmode == L'a')
|
|
||||||
{
|
|
||||||
access = GENERIC_READ | GENERIC_WRITE;
|
|
||||||
disposition = CREATE_ALWAYS;
|
|
||||||
flags |= _O_WRONLY | _O_APPEND | _O_CREAT | _O_TRUNC;
|
|
||||||
tmode++;
|
|
||||||
}
|
|
||||||
else if (*tmode == L'b')
|
|
||||||
{
|
|
||||||
flags |= _O_BINARY;
|
|
||||||
tmode++;
|
|
||||||
}
|
|
||||||
else if (*tmode == L'S')
|
|
||||||
{
|
|
||||||
flags |= _O_SEQUENTIAL;
|
|
||||||
tmode++;
|
|
||||||
}
|
|
||||||
else if (*tmode == L'R')
|
|
||||||
{
|
|
||||||
flags |= _O_RANDOM;
|
|
||||||
tmode++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Unknown mode flags: '%s'", StringUtil::WideStringToUTF8String(mode).c_str());
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HANDLE hFile = CreateFileFromAppW(wfilename, access, share, nullptr, disposition, 0, nullptr);
|
|
||||||
if (hFile == INVALID_HANDLE_VALUE)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
if (flags & _O_APPEND && !SetFilePointerEx(hFile, LARGE_INTEGER{}, nullptr, FILE_END))
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("SetFilePointerEx() failed: %08X", GetLastError());
|
|
||||||
CloseHandle(hFile);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fd = _open_osfhandle(reinterpret_cast<intptr_t>(hFile), flags);
|
|
||||||
if (fd < 0)
|
|
||||||
{
|
|
||||||
CloseHandle(hFile);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::FILE* fp = _wfdopen(fd, mode);
|
|
||||||
if (!fp)
|
|
||||||
{
|
|
||||||
_close(fd);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return fp;
|
|
||||||
}
|
|
||||||
#endif // _UWP
|
|
||||||
|
|
||||||
std::FILE* FileSystem::OpenCFile(const char* filename, const char* mode)
|
std::FILE* FileSystem::OpenCFile(const char* filename, const char* mode)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -718,13 +562,7 @@ std::FILE* FileSystem::OpenCFile(const char* filename, const char* mode)
|
||||||
{
|
{
|
||||||
std::FILE* fp;
|
std::FILE* fp;
|
||||||
if (_wfopen_s(&fp, wfilename.c_str(), wmode.c_str()) != 0)
|
if (_wfopen_s(&fp, wfilename.c_str(), wmode.c_str()) != 0)
|
||||||
{
|
|
||||||
#ifdef _UWP
|
|
||||||
return OpenCFileUWP(wfilename.c_str(), wmode.c_str(), FileShareMode::DenyReadWrite);
|
|
||||||
#else
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return fp;
|
return fp;
|
||||||
}
|
}
|
||||||
|
@ -744,10 +582,7 @@ int FileSystem::OpenFDFile(const char* filename, int flags, int mode)
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
const std::wstring wfilename(StringUtil::UTF8StringToWideString(filename));
|
const std::wstring wfilename(StringUtil::UTF8StringToWideString(filename));
|
||||||
if (!wfilename.empty())
|
if (!wfilename.empty())
|
||||||
{
|
|
||||||
// TODO: UWP
|
|
||||||
return _wopen(wfilename.c_str(), flags, mode);
|
return _wopen(wfilename.c_str(), flags, mode);
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
#else
|
#else
|
||||||
|
@ -792,11 +627,7 @@ std::FILE* FileSystem::OpenSharedCFile(const char* filename, const char* mode, F
|
||||||
if (fp)
|
if (fp)
|
||||||
return fp;
|
return fp;
|
||||||
|
|
||||||
#ifdef _UWP
|
|
||||||
return OpenCFileUWP(wfilename.c_str(), wmode.c_str(), share_mode);
|
|
||||||
#else
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
return std::fopen(filename, mode);
|
return std::fopen(filename, mode);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1023,19 +854,6 @@ static u32 TranslateWin32Attributes(u32 Win32Attributes)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD WrapGetFileAttributes(const wchar_t* path)
|
|
||||||
{
|
|
||||||
#ifndef _UWP
|
|
||||||
return GetFileAttributesW(path);
|
|
||||||
#else
|
|
||||||
WIN32_FILE_ATTRIBUTE_DATA fad;
|
|
||||||
if (!GetFileAttributesExFromAppW(path, GetFileExInfoStandard, &fad))
|
|
||||||
return INVALID_FILE_ATTRIBUTES;
|
|
||||||
|
|
||||||
return fad.dwFileAttributes;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static u32 RecursiveFindFiles(const char* origin_path, const char* parent_path, const char* path, const char* pattern,
|
static u32 RecursiveFindFiles(const char* origin_path, const char* parent_path, const char* path, const char* pattern,
|
||||||
u32 flags, FileSystem::FindResultsArray* results)
|
u32 flags, FileSystem::FindResultsArray* results)
|
||||||
{
|
{
|
||||||
|
@ -1057,12 +875,7 @@ static u32 RecursiveFindFiles(const char* origin_path, const char* parent_path,
|
||||||
std::string utf8_filename;
|
std::string utf8_filename;
|
||||||
utf8_filename.reserve((sizeof(wfd.cFileName) / sizeof(wfd.cFileName[0])) * 2);
|
utf8_filename.reserve((sizeof(wfd.cFileName) / sizeof(wfd.cFileName[0])) * 2);
|
||||||
|
|
||||||
#ifndef _UWP
|
|
||||||
HANDLE hFind = FindFirstFileW(StringUtil::UTF8StringToWideString(tempStr).c_str(), &wfd);
|
HANDLE hFind = FindFirstFileW(StringUtil::UTF8StringToWideString(tempStr).c_str(), &wfd);
|
||||||
#else
|
|
||||||
HANDLE hFind = FindFirstFileExFromAppW(StringUtil::UTF8StringToWideString(tempStr).c_str(), FindExInfoBasic, &wfd,
|
|
||||||
FindExSearchNameMatch, nullptr, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (hFind == INVALID_HANDLE_VALUE)
|
if (hFind == INVALID_HANDLE_VALUE)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1244,7 +1057,6 @@ bool FileSystem::StatFile(const char* path, FILESYSTEM_STAT_DATA* sd)
|
||||||
if (wpath.empty())
|
if (wpath.empty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#ifndef _UWP
|
|
||||||
// determine attributes for the path. if it's a directory, things have to be handled differently..
|
// determine attributes for the path. if it's a directory, things have to be handled differently..
|
||||||
DWORD fileAttributes = GetFileAttributesW(wpath.c_str());
|
DWORD fileAttributes = GetFileAttributesW(wpath.c_str());
|
||||||
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
|
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
|
||||||
|
@ -1284,17 +1096,6 @@ bool FileSystem::StatFile(const char* path, FILESYSTEM_STAT_DATA* sd)
|
||||||
sd->ModificationTime = ConvertFileTimeToUnixTime(bhfi.ftLastWriteTime);
|
sd->ModificationTime = ConvertFileTimeToUnixTime(bhfi.ftLastWriteTime);
|
||||||
sd->Size = static_cast<s64>(((u64)bhfi.nFileSizeHigh) << 32 | (u64)bhfi.nFileSizeLow);
|
sd->Size = static_cast<s64>(((u64)bhfi.nFileSizeHigh) << 32 | (u64)bhfi.nFileSizeLow);
|
||||||
return true;
|
return true;
|
||||||
#else
|
|
||||||
WIN32_FILE_ATTRIBUTE_DATA fad;
|
|
||||||
if (!GetFileAttributesExFromAppW(wpath.c_str(), GetFileExInfoStandard, &fad))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
sd->Attributes = TranslateWin32Attributes(fad.dwFileAttributes);
|
|
||||||
sd->CreationTime = ConvertFileTimeToUnixTime(fad.ftCreationTime);
|
|
||||||
sd->ModificationTime = ConvertFileTimeToUnixTime(fad.ftLastWriteTime);
|
|
||||||
sd->Size = static_cast<s64>(((u64)fad.nFileSizeHigh) << 32 | (u64)fad.nFileSizeLow);
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileSystem::StatFile(std::FILE* fp, FILESYSTEM_STAT_DATA* sd)
|
bool FileSystem::StatFile(std::FILE* fp, FILESYSTEM_STAT_DATA* sd)
|
||||||
|
@ -1335,7 +1136,7 @@ bool FileSystem::FileExists(const char* path)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// determine attributes for the path. if it's a directory, things have to be handled differently..
|
// determine attributes for the path. if it's a directory, things have to be handled differently..
|
||||||
DWORD fileAttributes = WrapGetFileAttributes(wpath.c_str());
|
DWORD fileAttributes = GetFileAttributesW(wpath.c_str());
|
||||||
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
|
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -1357,7 +1158,7 @@ bool FileSystem::DirectoryExists(const char* path)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// determine attributes for the path. if it's a directory, things have to be handled differently..
|
// determine attributes for the path. if it's a directory, things have to be handled differently..
|
||||||
DWORD fileAttributes = WrapGetFileAttributes(wpath.c_str());
|
DWORD fileAttributes = GetFileAttributesW(wpath.c_str());
|
||||||
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
|
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -1373,11 +1174,7 @@ bool FileSystem::DirectoryIsEmpty(const char* path)
|
||||||
wpath += L"\\*";
|
wpath += L"\\*";
|
||||||
|
|
||||||
WIN32_FIND_DATAW wfd;
|
WIN32_FIND_DATAW wfd;
|
||||||
#ifndef _UWP
|
|
||||||
HANDLE hFind = FindFirstFileW(wpath.c_str(), &wfd);
|
HANDLE hFind = FindFirstFileW(wpath.c_str(), &wfd);
|
||||||
#else
|
|
||||||
HANDLE hFind = FindFirstFileExFromAppW(wpath.c_str(), FindExInfoBasic, &wfd, FindExSearchNameMatch, nullptr, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (hFind == INVALID_HANDLE_VALUE)
|
if (hFind == INVALID_HANDLE_VALUE)
|
||||||
return true;
|
return true;
|
||||||
|
@ -1407,13 +1204,8 @@ bool FileSystem::CreateDirectory(const char* Path, bool Recursive)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// try just flat-out, might work if there's no other segments that have to be made
|
// try just flat-out, might work if there's no other segments that have to be made
|
||||||
#ifndef _UWP
|
|
||||||
if (CreateDirectoryW(wpath.c_str(), nullptr))
|
if (CreateDirectoryW(wpath.c_str(), nullptr))
|
||||||
return true;
|
return true;
|
||||||
#else
|
|
||||||
if (CreateDirectoryFromAppW(wpath.c_str(), nullptr))
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!Recursive)
|
if (!Recursive)
|
||||||
return false;
|
return false;
|
||||||
|
@ -1423,7 +1215,7 @@ bool FileSystem::CreateDirectory(const char* Path, bool Recursive)
|
||||||
if (lastError == ERROR_ALREADY_EXISTS)
|
if (lastError == ERROR_ALREADY_EXISTS)
|
||||||
{
|
{
|
||||||
// check the attributes
|
// check the attributes
|
||||||
u32 Attributes = WrapGetFileAttributes(wpath.c_str());
|
u32 Attributes = GetFileAttributesW(wpath.c_str());
|
||||||
if (Attributes != INVALID_FILE_ATTRIBUTES && Attributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (Attributes != INVALID_FILE_ATTRIBUTES && Attributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
|
@ -1442,11 +1234,7 @@ bool FileSystem::CreateDirectory(const char* Path, bool Recursive)
|
||||||
{
|
{
|
||||||
if (wpath[i] == L'\\' || wpath[i] == L'/')
|
if (wpath[i] == L'\\' || wpath[i] == L'/')
|
||||||
{
|
{
|
||||||
#ifndef _UWP
|
|
||||||
const BOOL result = CreateDirectoryW(tempPath.c_str(), nullptr);
|
const BOOL result = CreateDirectoryW(tempPath.c_str(), nullptr);
|
||||||
#else
|
|
||||||
const BOOL result = CreateDirectoryFromAppW(tempPath.c_str(), nullptr);
|
|
||||||
#endif
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
lastError = GetLastError();
|
lastError = GetLastError();
|
||||||
|
@ -1466,11 +1254,7 @@ bool FileSystem::CreateDirectory(const char* Path, bool Recursive)
|
||||||
// re-create the end if it's not a separator, check / as well because windows can interpret them
|
// re-create the end if it's not a separator, check / as well because windows can interpret them
|
||||||
if (wpath[pathLength - 1] != L'\\' && wpath[pathLength - 1] != L'/')
|
if (wpath[pathLength - 1] != L'\\' && wpath[pathLength - 1] != L'/')
|
||||||
{
|
{
|
||||||
#ifndef _UWP
|
|
||||||
const BOOL result = CreateDirectoryW(wpath.c_str(), nullptr);
|
const BOOL result = CreateDirectoryW(wpath.c_str(), nullptr);
|
||||||
#else
|
|
||||||
const BOOL result = CreateDirectoryFromAppW(wpath.c_str(), nullptr);
|
|
||||||
#endif
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
lastError = GetLastError();
|
lastError = GetLastError();
|
||||||
|
@ -1495,15 +1279,11 @@ bool FileSystem::DeleteFile(const char* path)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const std::wstring wpath(StringUtil::UTF8StringToWideString(path));
|
const std::wstring wpath(StringUtil::UTF8StringToWideString(path));
|
||||||
const DWORD fileAttributes = WrapGetFileAttributes(wpath.c_str());
|
const DWORD fileAttributes = GetFileAttributesW(wpath.c_str());
|
||||||
if (fileAttributes == INVALID_FILE_ATTRIBUTES || fileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (fileAttributes == INVALID_FILE_ATTRIBUTES || fileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#ifndef _UWP
|
|
||||||
return (DeleteFileW(wpath.c_str()) == TRUE);
|
return (DeleteFileW(wpath.c_str()) == TRUE);
|
||||||
#else
|
|
||||||
return (DeleteFileFromAppW(wpath.c_str()) == TRUE);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileSystem::RenamePath(const char* old_path, const char* new_path)
|
bool FileSystem::RenamePath(const char* old_path, const char* new_path)
|
||||||
|
@ -1511,29 +1291,11 @@ bool FileSystem::RenamePath(const char* old_path, const char* new_path)
|
||||||
const std::wstring old_wpath(StringUtil::UTF8StringToWideString(old_path));
|
const std::wstring old_wpath(StringUtil::UTF8StringToWideString(old_path));
|
||||||
const std::wstring new_wpath(StringUtil::UTF8StringToWideString(new_path));
|
const std::wstring new_wpath(StringUtil::UTF8StringToWideString(new_path));
|
||||||
|
|
||||||
#ifndef _UWP
|
|
||||||
if (!MoveFileExW(old_wpath.c_str(), new_wpath.c_str(), MOVEFILE_REPLACE_EXISTING))
|
if (!MoveFileExW(old_wpath.c_str(), new_wpath.c_str(), MOVEFILE_REPLACE_EXISTING))
|
||||||
{
|
{
|
||||||
Log_ErrorPrintf("MoveFileEx('%s', '%s') failed: %08X", old_path, new_path, GetLastError());
|
Log_ErrorPrintf("MoveFileEx('%s', '%s') failed: %08X", old_path, new_path, GetLastError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
// try moving if it doesn't exist, since ReplaceFile fails on non-existing destinations
|
|
||||||
if (WrapGetFileAttributes(new_wpath.c_str()) != INVALID_FILE_ATTRIBUTES)
|
|
||||||
{
|
|
||||||
if (!DeleteFileFromAppW(new_wpath.c_str()))
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("DeleteFileFromAppW('%s') failed: %08X", new_wpath.c_str(), GetLastError());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!MoveFileFromAppW(old_wpath.c_str(), new_wpath.c_str()))
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("MoveFileFromAppW('%s', '%s') failed: %08X", old_path, new_path, GetLastError());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1551,10 +1313,8 @@ std::string FileSystem::GetProgramPath()
|
||||||
|
|
||||||
// Fall back to the main module if this fails.
|
// Fall back to the main module if this fails.
|
||||||
HMODULE module = nullptr;
|
HMODULE module = nullptr;
|
||||||
#ifndef _UWP
|
|
||||||
GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
||||||
reinterpret_cast<LPCWSTR>(&GetProgramPath), &module);
|
reinterpret_cast<LPCWSTR>(&GetProgramPath), &module);
|
||||||
#endif
|
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
@ -1610,13 +1370,8 @@ bool FileSystem::SetPathCompression(const char* path, bool enable)
|
||||||
const bool isFile = !(attrs & FILE_ATTRIBUTE_DIRECTORY);
|
const bool isFile = !(attrs & FILE_ATTRIBUTE_DIRECTORY);
|
||||||
const DWORD flags = isFile ? FILE_ATTRIBUTE_NORMAL : (FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_DIRECTORY);
|
const DWORD flags = isFile ? FILE_ATTRIBUTE_NORMAL : (FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_DIRECTORY);
|
||||||
|
|
||||||
#ifndef _UWP
|
|
||||||
const HANDLE handle = CreateFileW(wpath.c_str(), FILE_GENERIC_WRITE | FILE_GENERIC_READ,
|
const HANDLE handle = CreateFileW(wpath.c_str(), FILE_GENERIC_WRITE | FILE_GENERIC_READ,
|
||||||
FILE_SHARE_READ | FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, flags, nullptr);
|
FILE_SHARE_READ | FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, flags, nullptr);
|
||||||
#else
|
|
||||||
const HANDLE handle = CreateFileFromAppW(wpath.c_str(), FILE_GENERIC_WRITE | FILE_GENERIC_READ,
|
|
||||||
FILE_SHARE_READ | FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, flags, nullptr);
|
|
||||||
#endif
|
|
||||||
if (handle == INVALID_HANDLE_VALUE)
|
if (handle == INVALID_HANDLE_VALUE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -1,165 +0,0 @@
|
||||||
#include "http_downloader_uwp.h"
|
|
||||||
#include "assert.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "string_util.h"
|
|
||||||
#include "timer.h"
|
|
||||||
#include <algorithm>
|
|
||||||
Log_SetChannel(HTTPDownloaderWinHttp);
|
|
||||||
|
|
||||||
#include <winrt/Windows.Foundation.h>
|
|
||||||
#include <winrt/Windows.Storage.Streams.h>
|
|
||||||
#include <winrt/Windows.Web.Http.Headers.h>
|
|
||||||
|
|
||||||
using namespace winrt::Windows::Foundation;
|
|
||||||
using namespace winrt::Windows::Web::Http;
|
|
||||||
|
|
||||||
namespace Common {
|
|
||||||
|
|
||||||
HTTPDownloaderUWP::HTTPDownloaderUWP(std::string user_agent) : HTTPDownloader(), m_user_agent(std::move(user_agent)) {}
|
|
||||||
|
|
||||||
HTTPDownloaderUWP::~HTTPDownloaderUWP() = default;
|
|
||||||
|
|
||||||
std::unique_ptr<HTTPDownloader> HTTPDownloader::Create(const char* user_agent)
|
|
||||||
{
|
|
||||||
std::string user_agent_str;
|
|
||||||
if (user_agent)
|
|
||||||
user_agent_str = user_agent;
|
|
||||||
|
|
||||||
return std::make_unique<HTTPDownloaderUWP>(user_agent ? std::string(user_agent) : std::string());
|
|
||||||
}
|
|
||||||
|
|
||||||
HTTPDownloader::Request* HTTPDownloaderUWP::InternalCreateRequest()
|
|
||||||
{
|
|
||||||
Request* req = new Request();
|
|
||||||
return req;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HTTPDownloaderUWP::InternalPollRequests()
|
|
||||||
{
|
|
||||||
// noop - uses async
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HTTPDownloaderUWP::StartRequest(HTTPDownloader::Request* request)
|
|
||||||
{
|
|
||||||
Request* req = static_cast<Request*>(request);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
const std::wstring url_wide(StringUtil::UTF8StringToWideString(req->url));
|
|
||||||
const Uri uri(url_wide);
|
|
||||||
|
|
||||||
if (!m_user_agent.empty() &&
|
|
||||||
!req->client.DefaultRequestHeaders().UserAgent().TryParseAdd(StringUtil::UTF8StringToWideString(m_user_agent)))
|
|
||||||
{
|
|
||||||
Log_WarningPrintf("Failed to set user agent to '%s'", m_user_agent.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req->type == Request::Type::Post)
|
|
||||||
{
|
|
||||||
const HttpStringContent post_content(StringUtil::UTF8StringToWideString(req->post_data),
|
|
||||||
winrt::Windows::Storage::Streams::UnicodeEncoding::Utf8,
|
|
||||||
L"application/x-www-form-urlencoded");
|
|
||||||
req->request_async = req->client.PostAsync(uri, post_content);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
req->request_async = req->client.GetAsync(uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
req->request_async.Completed(
|
|
||||||
[req](const IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress>& operation, AsyncStatus status) {
|
|
||||||
if (status == AsyncStatus::Completed)
|
|
||||||
{
|
|
||||||
Log_DevPrintf("Request for '%s' completed start portion", req->url.c_str());
|
|
||||||
try
|
|
||||||
{
|
|
||||||
req->state.store(Request::State::Receiving);
|
|
||||||
req->start_time = Common::Timer::GetCurrentValue();
|
|
||||||
|
|
||||||
const HttpResponseMessage response(req->request_async.get());
|
|
||||||
req->status_code = static_cast<s32>(response.StatusCode());
|
|
||||||
|
|
||||||
const IHttpContent content(response.Content());
|
|
||||||
req->receive_async = content.ReadAsBufferAsync();
|
|
||||||
req->receive_async.Completed(
|
|
||||||
[req](
|
|
||||||
const IAsyncOperationWithProgress<winrt::Windows::Storage::Streams::IBuffer, uint64_t>& inner_operation,
|
|
||||||
AsyncStatus inner_status) {
|
|
||||||
if (inner_status == AsyncStatus::Completed)
|
|
||||||
{
|
|
||||||
const winrt::Windows::Storage::Streams::IBuffer buffer(inner_operation.get());
|
|
||||||
if (buffer && buffer.Length() > 0)
|
|
||||||
{
|
|
||||||
req->data.resize(buffer.Length());
|
|
||||||
std::memcpy(req->data.data(), buffer.data(), req->data.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
Log_DevPrintf("End of request '%s', %zu bytes received", req->url.c_str(), req->data.size());
|
|
||||||
req->state.store(Request::State::Complete);
|
|
||||||
}
|
|
||||||
else if (inner_status == AsyncStatus::Canceled)
|
|
||||||
{
|
|
||||||
// don't do anything, the request has been freed
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Request for '%s' failed during recieve phase: %08X", req->url.c_str(),
|
|
||||||
inner_operation.ErrorCode().value);
|
|
||||||
req->status_code = -1;
|
|
||||||
req->state.store(Request::State::Complete);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (const winrt::hresult_error& err)
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Failed to receive HTTP request for '%s': %08X %s", req->url.c_str(), err.code(),
|
|
||||||
StringUtil::WideStringToUTF8String(err.message()).c_str());
|
|
||||||
req->status_code = -1;
|
|
||||||
req->state.store(Request::State::Complete);
|
|
||||||
}
|
|
||||||
|
|
||||||
req->receive_async = nullptr;
|
|
||||||
}
|
|
||||||
else if (status == AsyncStatus::Canceled)
|
|
||||||
{
|
|
||||||
// don't do anything, the request has been freed
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Request for '%s' failed during start phase: %08X", req->url.c_str(),
|
|
||||||
operation.ErrorCode().value);
|
|
||||||
req->status_code = -1;
|
|
||||||
req->state.store(Request::State::Complete);
|
|
||||||
}
|
|
||||||
|
|
||||||
req->request_async = nullptr;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (const winrt::hresult_error& err)
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Failed to start HTTP request for '%s': %08X %s", req->url.c_str(), err.code(),
|
|
||||||
StringUtil::WideStringToUTF8String(err.message()).c_str());
|
|
||||||
req->callback(-1, req->data);
|
|
||||||
delete req;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log_DevPrintf("Started HTTP request for '%s'", req->url.c_str());
|
|
||||||
req->state = Request::State::Started;
|
|
||||||
req->start_time = Common::Timer::GetCurrentValue();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HTTPDownloaderUWP::CloseRequest(HTTPDownloader::Request* request)
|
|
||||||
{
|
|
||||||
Request* req = static_cast<Request*>(request);
|
|
||||||
if (req->request_async)
|
|
||||||
req->request_async.Cancel();
|
|
||||||
if (req->receive_async)
|
|
||||||
req->receive_async.Cancel();
|
|
||||||
|
|
||||||
req->client.Close();
|
|
||||||
delete req;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace FrontendCommon
|
|
|
@ -1,38 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#pragma once
|
|
||||||
#include "http_downloader.h"
|
|
||||||
|
|
||||||
#include "common/windows_headers.h"
|
|
||||||
|
|
||||||
#include <winrt/windows.Web.Http.h>
|
|
||||||
|
|
||||||
namespace Common {
|
|
||||||
|
|
||||||
class HTTPDownloaderUWP final : public HTTPDownloader
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
HTTPDownloaderUWP(std::string user_agent);
|
|
||||||
~HTTPDownloaderUWP() override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Request* InternalCreateRequest() override;
|
|
||||||
void InternalPollRequests() override;
|
|
||||||
bool StartRequest(HTTPDownloader::Request* request) override;
|
|
||||||
void CloseRequest(HTTPDownloader::Request* request) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct Request : HTTPDownloader::Request
|
|
||||||
{
|
|
||||||
std::wstring object_name;
|
|
||||||
winrt::Windows::Web::Http::HttpClient client;
|
|
||||||
winrt::Windows::Foundation::IAsyncOperationWithProgress<winrt::Windows::Web::Http::HttpResponseMessage,
|
|
||||||
winrt::Windows::Web::Http::HttpProgress>
|
|
||||||
request_async{nullptr};
|
|
||||||
winrt::Windows::Foundation::IAsyncOperationWithProgress<winrt::Windows::Storage::Streams::IBuffer, uint64_t>
|
|
||||||
receive_async{};
|
|
||||||
};
|
|
||||||
|
|
||||||
std::string m_user_agent;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace FrontendCommon
|
|
|
@ -212,7 +212,7 @@ Threading::ThreadHandle& Threading::ThreadHandle::operator=(const ThreadHandle&
|
||||||
|
|
||||||
u64 Threading::ThreadHandle::GetCPUTime() const
|
u64 Threading::ThreadHandle::GetCPUTime() const
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP) && !defined(_M_ARM64)
|
#if defined(_WIN32) && !defined(_M_ARM64)
|
||||||
u64 ret = 0;
|
u64 ret = 0;
|
||||||
if (m_native_handle)
|
if (m_native_handle)
|
||||||
QueryThreadCycleTime((HANDLE)m_native_handle, &ret);
|
QueryThreadCycleTime((HANDLE)m_native_handle, &ret);
|
||||||
|
@ -459,7 +459,7 @@ Threading::ThreadHandle& Threading::Thread::operator=(Thread&& thread)
|
||||||
|
|
||||||
u64 Threading::GetThreadCpuTime()
|
u64 Threading::GetThreadCpuTime()
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP) && !defined(_M_ARM64)
|
#if defined(_WIN32) && !defined(_M_ARM64)
|
||||||
u64 ret = 0;
|
u64 ret = 0;
|
||||||
QueryThreadCycleTime(GetCurrentThread(), &ret);
|
QueryThreadCycleTime(GetCurrentThread(), &ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -477,7 +477,7 @@ u64 Threading::GetThreadCpuTime()
|
||||||
|
|
||||||
u64 Threading::GetThreadTicksPerSecond()
|
u64 Threading::GetThreadTicksPerSecond()
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP) && !defined(_M_ARM64)
|
#if defined(_WIN32) && !defined(_M_ARM64)
|
||||||
// On x86, despite what the MS documentation says, this basically appears to be rdtsc.
|
// On x86, despite what the MS documentation says, this basically appears to be rdtsc.
|
||||||
// So, the frequency is our base clock speed (and stable regardless of power management).
|
// So, the frequency is our base clock speed (and stable regardless of power management).
|
||||||
static u64 frequency = 0;
|
static u64 frequency = 0;
|
||||||
|
|
|
@ -113,7 +113,6 @@ void Timer::SleepUntil(Value value, bool exact)
|
||||||
if (diff <= 0)
|
if (diff <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifndef _UWP
|
|
||||||
HANDLE timer = GetSleepTimer();
|
HANDLE timer = GetSleepTimer();
|
||||||
if (timer)
|
if (timer)
|
||||||
{
|
{
|
||||||
|
@ -131,7 +130,6 @@ void Timer::SleepUntil(Value value, bool exact)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// falling back to sleep... bad.
|
// falling back to sleep... bad.
|
||||||
Sleep(static_cast<DWORD>(static_cast<std::uint64_t>(diff) / 1000000));
|
Sleep(static_cast<DWORD>(static_cast<std::uint64_t>(diff) / 1000000));
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "common/log.h"
|
#include "common/log.h"
|
||||||
Log_SetChannel(WindowInfo);
|
Log_SetChannel(WindowInfo);
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
|
|
||||||
#include "common/windows_headers.h"
|
#include "common/windows_headers.h"
|
||||||
#include <dwmapi.h>
|
#include <dwmapi.h>
|
||||||
|
|
|
@ -8,7 +8,6 @@ struct WindowInfo
|
||||||
{
|
{
|
||||||
Surfaceless,
|
Surfaceless,
|
||||||
Win32,
|
Win32,
|
||||||
WinRT,
|
|
||||||
X11,
|
X11,
|
||||||
Wayland,
|
Wayland,
|
||||||
MacOS,
|
MacOS,
|
||||||
|
|
|
@ -7,23 +7,14 @@
|
||||||
#define NOMINMAX 1
|
#define NOMINMAX 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// require vista+, but don't set it when compiling for UWP
|
// require vista+
|
||||||
#ifndef WINAPI_FAMILY
|
|
||||||
#ifdef _WIN32_WINNT
|
#ifdef _WIN32_WINNT
|
||||||
#undef _WIN32_WINNT
|
#undef _WIN32_WINNT
|
||||||
#endif
|
#endif
|
||||||
#define _WIN32_WINNT _WIN32_WINNT_VISTA
|
#define _WIN32_WINNT _WIN32_WINNT_VISTA
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
// hurr i'm windows, i like to conflict, fixme properly later please...
|
|
||||||
#if defined(FindTexture)
|
|
||||||
#undef FindTexture
|
|
||||||
#endif
|
|
||||||
#if defined(DrawText)
|
|
||||||
#undef DrawText
|
|
||||||
#endif
|
|
||||||
#if defined(CreateDirectory)
|
#if defined(CreateDirectory)
|
||||||
#undef CreateDirectory
|
#undef CreateDirectory
|
||||||
#endif
|
#endif
|
||||||
|
@ -33,12 +24,3 @@
|
||||||
#if defined(DeleteFile)
|
#if defined(DeleteFile)
|
||||||
#undef DeleteFile
|
#undef DeleteFile
|
||||||
#endif
|
#endif
|
||||||
#if defined(Yield)
|
|
||||||
#undef Yield
|
|
||||||
#endif
|
|
||||||
#if defined(LoadIcon)
|
|
||||||
#undef LoadIcon
|
|
||||||
#endif
|
|
||||||
#if defined(GetObject)
|
|
||||||
#undef GetObject
|
|
||||||
#endif
|
|
|
@ -4,14 +4,13 @@
|
||||||
|
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PreprocessorDefinitions>WITH_CHEEVOS=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_CHEEVOS=1;WITH_CUBEB=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(BuildingForUWP)'!='true'">WITH_CUBEB=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="('$(Platform)'!='ARM64')">WITH_RAINTEGRATION=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="('$(BuildingForUWP)'!='true' And '$(Platform)'!='ARM64')">WITH_RAINTEGRATION=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<PreprocessorDefinitions Condition="('$(Platform)'=='x64' Or '$(Platform)'=='ARM' Or '$(Platform)'=='ARM64')">WITH_RECOMPILER=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="('$(Platform)'=='x64' Or '$(Platform)'=='ARM' Or '$(Platform)'=='ARM64')">WITH_RECOMPILER=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="('$(Platform)'=='x64' Or '$(Platform)'=='ARM64') And ('$(BuildingForUWP)'!='true')">WITH_MMAP_FASTMEM=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="('$(Platform)'=='x64' Or '$(Platform)'=='ARM64')">WITH_MMAP_FASTMEM=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\tinyxml2\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\xxhash\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\rcheevos\include;$(SolutionDir)dep\rapidjson\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\tinyxml2\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\xxhash\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\rcheevos\include;$(SolutionDir)dep\rapidjson\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<AdditionalIncludeDirectories Condition="('$(BuildingForUWP)'!='true' And '$(Platform)'!='ARM64')">$(SolutionDir)dep\rainterface;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Platform)'!='ARM64'">$(SolutionDir)dep\rainterface;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
|
||||||
<AdditionalIncludeDirectories Condition="'$(Platform)'=='x64'">$(SolutionDir)dep\xbyak\xbyak;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Platform)'=='x64'">$(SolutionDir)dep\xbyak\xbyak;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<AdditionalIncludeDirectories Condition="'$(Platform)'=='ARM' Or '$(Platform)'=='ARM64'">$(SolutionDir)dep\vixl\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Platform)'=='ARM' Or '$(Platform)'=='ARM64'">$(SolutionDir)dep\vixl\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
@ -21,7 +20,7 @@
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<Lib>
|
<Lib>
|
||||||
<AdditionalDependencies>$(RootBuildDir)tinyxml2\tinyxml2.lib;$(RootBuildDir)rcheevos\rcheevos.lib;$(RootBuildDir)imgui\imgui.lib;$(RootBuildDir)stb\stb.lib;$(RootBuildDir)xxhash\xxhash.lib;$(RootBuildDir)zlib\zlib.lib;$(RootBuildDir)util\util.lib;$(RootBuildDir)common\common.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>$(RootBuildDir)tinyxml2\tinyxml2.lib;$(RootBuildDir)rcheevos\rcheevos.lib;$(RootBuildDir)imgui\imgui.lib;$(RootBuildDir)stb\stb.lib;$(RootBuildDir)xxhash\xxhash.lib;$(RootBuildDir)zlib\zlib.lib;$(RootBuildDir)util\util.lib;$(RootBuildDir)common\common.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalDependencies Condition="('$(BuildingForUWP)'!='true' And '$(Platform)'!='ARM64')">$(RootBuildDir)rainterface\rainterface.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies Condition="'$(Platform)'!='ARM64'">$(RootBuildDir)rainterface\rainterface.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalDependencies Condition="'$(Platform)'=='ARM64'">$(RootBuildDir)vixl\vixl.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies Condition="'$(Platform)'=='ARM64'">$(RootBuildDir)vixl\vixl.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Lib>
|
</Lib>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<ClCompile Include="gpu_hw_d3d12.cpp" />
|
<ClCompile Include="gpu_hw_d3d12.cpp" />
|
||||||
<ClCompile Include="gpu_hw_shadergen.cpp" />
|
<ClCompile Include="gpu_hw_shadergen.cpp" />
|
||||||
<ClCompile Include="gpu_hw_vulkan.cpp">
|
<ClCompile Include="gpu_hw_vulkan.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="gpu_sw.cpp" />
|
<ClCompile Include="gpu_sw.cpp" />
|
||||||
<ClCompile Include="gpu_sw_backend.cpp" />
|
<ClCompile Include="gpu_sw_backend.cpp" />
|
||||||
|
@ -49,7 +49,7 @@
|
||||||
<ClCompile Include="gpu.cpp" />
|
<ClCompile Include="gpu.cpp" />
|
||||||
<ClCompile Include="gpu_hw.cpp" />
|
<ClCompile Include="gpu_hw.cpp" />
|
||||||
<ClCompile Include="gpu_hw_opengl.cpp">
|
<ClCompile Include="gpu_hw_opengl.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="host.cpp" />
|
<ClCompile Include="host.cpp" />
|
||||||
<ClCompile Include="host_display.cpp" />
|
<ClCompile Include="host_display.cpp" />
|
||||||
|
@ -109,7 +109,7 @@
|
||||||
<ClInclude Include="gpu_hw_d3d12.h" />
|
<ClInclude Include="gpu_hw_d3d12.h" />
|
||||||
<ClInclude Include="gpu_hw_shadergen.h" />
|
<ClInclude Include="gpu_hw_shadergen.h" />
|
||||||
<ClInclude Include="gpu_hw_vulkan.h">
|
<ClInclude Include="gpu_hw_vulkan.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="gpu_sw.h" />
|
<ClInclude Include="gpu_sw.h" />
|
||||||
<ClInclude Include="gpu_sw_backend.h" />
|
<ClInclude Include="gpu_sw_backend.h" />
|
||||||
|
@ -121,7 +121,7 @@
|
||||||
<ClInclude Include="gpu.h" />
|
<ClInclude Include="gpu.h" />
|
||||||
<ClInclude Include="gpu_hw.h" />
|
<ClInclude Include="gpu_hw.h" />
|
||||||
<ClInclude Include="gpu_hw_opengl.h">
|
<ClInclude Include="gpu_hw_opengl.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="gte_types.h" />
|
<ClInclude Include="gte_types.h" />
|
||||||
<ClInclude Include="host.h" />
|
<ClInclude Include="host.h" />
|
||||||
|
|
|
@ -26,7 +26,7 @@ static constexpr u32 INVALIDATE_THRESHOLD_TO_DISABLE_LINKING = 10;
|
||||||
#ifdef WITH_RECOMPILER
|
#ifdef WITH_RECOMPILER
|
||||||
|
|
||||||
// Currently remapping the code buffer doesn't work in macOS or Haiku.
|
// Currently remapping the code buffer doesn't work in macOS or Haiku.
|
||||||
#if !defined(__HAIKU__) && !defined(__APPLE__) && !defined(_UWP)
|
#if !defined(__HAIKU__) && !defined(__APPLE__)
|
||||||
#define USE_STATIC_CODE_BUFFER 1
|
#define USE_STATIC_CODE_BUFFER 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1069,8 +1069,6 @@ bool InitializeFastmem()
|
||||||
Assert(mode != CPUFastmemMode::MMap);
|
Assert(mode != CPUFastmemMode::MMap);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
s_code_buffer.ReserveCode(Common::PageFaultHandler::GetHandlerCodeSize());
|
|
||||||
|
|
||||||
if (!Common::PageFaultHandler::InstallHandler(&s_host_code_map, s_code_buffer.GetCodePointer(),
|
if (!Common::PageFaultHandler::InstallHandler(&s_host_code_map, s_code_buffer.GetCodePointer(),
|
||||||
s_code_buffer.GetTotalSize(), handler))
|
s_code_buffer.GetTotalSize(), handler))
|
||||||
{
|
{
|
||||||
|
|
|
@ -55,10 +55,8 @@ Log_SetChannel(System);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include "common/windows_headers.h"
|
#include "common/windows_headers.h"
|
||||||
#ifndef _UWP
|
|
||||||
#include <mmsystem.h>
|
#include <mmsystem.h>
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
// #define PROFILE_MEMORY_SAVE_STATES 1
|
// #define PROFILE_MEMORY_SAVE_STATES 1
|
||||||
|
|
||||||
|
@ -4256,7 +4254,7 @@ void System::HostDisplayResized()
|
||||||
|
|
||||||
void System::SetTimerResolutionIncreased(bool enabled)
|
void System::SetTimerResolutionIncreased(bool enabled)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
static bool current_state = false;
|
static bool current_state = false;
|
||||||
if (current_state == enabled)
|
if (current_state == enabled)
|
||||||
return;
|
return;
|
||||||
|
|
6
src/duckstation-uwp/.gitignore
vendored
|
@ -1,6 +0,0 @@
|
||||||
database/
|
|
||||||
inputprofiles/
|
|
||||||
resources/
|
|
||||||
shaders/
|
|
||||||
BundleArtifacts/
|
|
||||||
duckstation-uwp.pfx
|
|
Before Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 9.3 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 6 KiB |
Before Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 725 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 725 B |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 529 B |
Before Width: | Height: | Size: 892 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 4 KiB |
Before Width: | Height: | Size: 5 KiB |
Before Width: | Height: | Size: 7 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 9.3 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 8.3 KiB |
|
@ -1,58 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
|
||||||
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
|
|
||||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
|
||||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
|
||||||
IgnorableNamespaces="uap mp">
|
|
||||||
<Identity
|
|
||||||
Name="57bcfd1f-31c1-4f8e-bf91-958732a81506"
|
|
||||||
Publisher="CN=Stenzek"
|
|
||||||
Version="1.0.0.0" />
|
|
||||||
<mp:PhoneIdentity PhoneProductId="57bcfd1f-31c1-4f8e-bf91-958732a81506" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
|
|
||||||
<Properties>
|
|
||||||
<DisplayName>DuckStation</DisplayName>
|
|
||||||
<PublisherDisplayName>Stenzek</PublisherDisplayName>
|
|
||||||
<Logo>Assets\StoreLogo.png</Logo>
|
|
||||||
</Properties>
|
|
||||||
<Dependencies>
|
|
||||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
|
|
||||||
</Dependencies>
|
|
||||||
<Resources>
|
|
||||||
<Resource Language="x-generate" />
|
|
||||||
</Resources>
|
|
||||||
<Applications>
|
|
||||||
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="DuckStation.App">
|
|
||||||
<uap:VisualElements DisplayName="DuckStation" Description="A project for a C++/WinRT Universal Windows Platform (UWP) app directly implementing CoreApplication"
|
|
||||||
Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" BackgroundColor="transparent">
|
|
||||||
<uap:SplashScreen Image="Assets\SplashScreen.png" />
|
|
||||||
<uap:DefaultTile Square71x71Logo="Assets\SmallTile.png" Wide310x150Logo="Assets\WideTile.png" Square310x310Logo="Assets\LargeTile.png"/>
|
|
||||||
</uap:VisualElements>
|
|
||||||
<Extensions>
|
|
||||||
<uap:Extension Category="windows.fileTypeAssociation">
|
|
||||||
<uap:FileTypeAssociation Name="duckstation-disc-images">
|
|
||||||
<uap:SupportedFileTypes>
|
|
||||||
<uap:FileType ContentType="application/x-cue">.cue</uap:FileType>
|
|
||||||
<uap:FileType ContentType="application/x-mame-chd">.chd</uap:FileType>
|
|
||||||
<uap:FileType ContentType="application/x-ecm">.ecm</uap:FileType>
|
|
||||||
<uap:FileType ContentType="application/x-iso9660-image">.iso</uap:FileType>
|
|
||||||
<uap:FileType ContentType="application/x-mds">.mds</uap:FileType>
|
|
||||||
<uap:FileType ContentType="application/x-psexe">.psexe</uap:FileType>
|
|
||||||
<uap:FileType ContentType="application/x-psf">.psf</uap:FileType>
|
|
||||||
<uap:FileType ContentType="application/x-psf">.minipsf</uap:FileType>
|
|
||||||
<uap:FileType ContentType="audio/x-mpegurl">.m3u</uap:FileType>
|
|
||||||
<uap:FileType ContentType="application/x-ps-memory-card">.mcd</uap:FileType>
|
|
||||||
</uap:SupportedFileTypes>
|
|
||||||
<uap:DisplayName>DuckStation Disc Image</uap:DisplayName>
|
|
||||||
<uap:Logo>Assets\duck_128.png</uap:Logo>
|
|
||||||
</uap:FileTypeAssociation>
|
|
||||||
</uap:Extension>
|
|
||||||
</Extensions>
|
|
||||||
</Application>
|
|
||||||
</Applications>
|
|
||||||
<Capabilities>
|
|
||||||
<Capability Name="internetClient" />
|
|
||||||
<Capability Name="codeGeneration"/>
|
|
||||||
<uap:Capability Name="removableStorage"/>
|
|
||||||
<rescap:Capability Name="expandedResources" />
|
|
||||||
</Capabilities>
|
|
||||||
</Package>
|
|
|
@ -1,16 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ImportGroup Label="PropertySheets" />
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<!--
|
|
||||||
To customize common C++/WinRT project properties:
|
|
||||||
* right-click the project node
|
|
||||||
* expand the Common Properties item
|
|
||||||
* select the C++/WinRT property page
|
|
||||||
|
|
||||||
For more advanced scenarios, and complete documentation, please see:
|
|
||||||
https://github.com/Microsoft/cppwinrt/tree/master/nuget
|
|
||||||
-->
|
|
||||||
<PropertyGroup />
|
|
||||||
<ItemDefinitionGroup />
|
|
||||||
</Project>
|
|
|
@ -1,212 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="..\..\dep\msvc\vsprops\Configurations.props" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<CppWinRTOptimized>true</CppWinRTOptimized>
|
|
||||||
<CppWinRTRootNamespaceAutoMerge>false</CppWinRTRootNamespaceAutoMerge>
|
|
||||||
<MinimalCoreWin>true</MinimalCoreWin>
|
|
||||||
<ProjectGuid>{e2a6cea9-9537-4c61-b637-81f1f17ef638}</ProjectGuid>
|
|
||||||
<ProjectName>duckstation-uwp</ProjectName>
|
|
||||||
<RootNamespace>DuckStationUWP</RootNamespace>
|
|
||||||
<DefaultLanguage>en-US</DefaultLanguage>
|
|
||||||
<MinimumVisualStudioVersion>15.0</MinimumVisualStudioVersion>
|
|
||||||
<AppContainerApplication>true</AppContainerApplication>
|
|
||||||
<ApplicationType>Windows Store</ApplicationType>
|
|
||||||
<ApplicationTypeRevision>10.0</ApplicationTypeRevision>
|
|
||||||
<WindowsTargetPlatformVersion Condition=" '$(WindowsTargetPlatformVersion)' == '' ">10.0.19041.0</WindowsTargetPlatformVersion>
|
|
||||||
<WindowsTargetPlatformMinVersion>10.0.17134.0</WindowsTargetPlatformMinVersion>
|
|
||||||
<CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>
|
|
||||||
<CppWinRTOptimized>true</CppWinRTOptimized>
|
|
||||||
<CppWinRTRootNamespaceAutoMerge>false</CppWinRTRootNamespaceAutoMerge>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<IntDir>$(SolutionDir)build\$(Configuration)-$(Platform)\$(ProjectName)\</IntDir>
|
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)-$(Platform)\$(ProjectName)\</OutDir>
|
|
||||||
<GenerateProjectSpecificOutputFolder>false</GenerateProjectSpecificOutputFolder>
|
|
||||||
<TargetName>$(ProjectName)</TargetName>
|
|
||||||
<GenerateAppInstallerFile>False</GenerateAppInstallerFile>
|
|
||||||
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
|
|
||||||
<PackageCertificateKeyFile>duckstation-uwp.pfx</PackageCertificateKeyFile>
|
|
||||||
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
|
|
||||||
<AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>
|
|
||||||
<AppxSymbolPackageEnabled>False</AppxSymbolPackageEnabled>
|
|
||||||
<GenerateTestArtifacts>True</GenerateTestArtifacts>
|
|
||||||
<AppxBundle>Always</AppxBundle>
|
|
||||||
<AppxBundlePlatforms>x64</AppxBundlePlatforms>
|
|
||||||
<HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="..\..\dep\msvc\vsprops\Toolkit.props" />
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="PropertySheets">
|
|
||||||
<Import Project="PropertySheet.props" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level4</WarningLevel>
|
|
||||||
<AdditionalOptions>%(AdditionalOptions) /bigobj</AdditionalOptions>
|
|
||||||
<DisableSpecificWarnings>
|
|
||||||
</DisableSpecificWarnings>
|
|
||||||
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;WINRT_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<GenerateWindowsMetadata>false</GenerateWindowsMetadata>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<Import Project="..\..\dep\msvc\vsprops\Base.props" />
|
|
||||||
<ItemGroup>
|
|
||||||
<AppxManifest Include="Package.appxmanifest">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</AppxManifest>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Image Include="Assets\duck_128.png" />
|
|
||||||
<Image Include="Assets\LargeTile.scale-100.png" />
|
|
||||||
<Image Include="Assets\LargeTile.scale-125.png" />
|
|
||||||
<Image Include="Assets\LargeTile.scale-150.png" />
|
|
||||||
<Image Include="Assets\LargeTile.scale-200.png" />
|
|
||||||
<Image Include="Assets\LargeTile.scale-400.png" />
|
|
||||||
<Image Include="Assets\LockScreenLogo.scale-200.png" />
|
|
||||||
<Image Include="Assets\SmallTile.scale-100.png" />
|
|
||||||
<Image Include="Assets\SmallTile.scale-125.png" />
|
|
||||||
<Image Include="Assets\SmallTile.scale-150.png" />
|
|
||||||
<Image Include="Assets\SmallTile.scale-200.png" />
|
|
||||||
<Image Include="Assets\SmallTile.scale-400.png" />
|
|
||||||
<Image Include="Assets\SplashScreen.scale-100.png" />
|
|
||||||
<Image Include="Assets\SplashScreen.scale-125.png" />
|
|
||||||
<Image Include="Assets\SplashScreen.scale-150.png" />
|
|
||||||
<Image Include="Assets\SplashScreen.scale-200.png" />
|
|
||||||
<Image Include="Assets\SplashScreen.scale-400.png" />
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-100.png" />
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-125.png" />
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-150.png" />
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-200.png" />
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-400.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-16.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-24.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-256.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-32.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-48.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-unplated_targetsize-16.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-unplated_targetsize-256.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-unplated_targetsize-32.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-unplated_targetsize-48.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-100.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-125.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-150.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-200.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-400.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-16.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-24.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-256.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-32.png" />
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-48.png" />
|
|
||||||
<Image Include="Assets\StoreLogo.scale-100.png" />
|
|
||||||
<Image Include="Assets\StoreLogo.scale-125.png" />
|
|
||||||
<Image Include="Assets\StoreLogo.scale-150.png" />
|
|
||||||
<Image Include="Assets\StoreLogo.scale-200.png" />
|
|
||||||
<Image Include="Assets\StoreLogo.scale-400.png" />
|
|
||||||
<Image Include="Assets\Wide310x150Logo.scale-200.png" />
|
|
||||||
<Image Include="Assets\WideTile.scale-100.png" />
|
|
||||||
<Image Include="Assets\WideTile.scale-125.png" />
|
|
||||||
<Image Include="Assets\WideTile.scale-150.png" />
|
|
||||||
<Image Include="Assets\WideTile.scale-200.png" />
|
|
||||||
<Image Include="Assets\WideTile.scale-400.png" />
|
|
||||||
<Image Include="resources\address-book-new.png" />
|
|
||||||
<Image Include="resources\applications-system.png" />
|
|
||||||
<Image Include="resources\duck.png" />
|
|
||||||
<Image Include="resources\flag-eu.png" />
|
|
||||||
<Image Include="resources\flag-jp.png" />
|
|
||||||
<Image Include="resources\flag-uc.png" />
|
|
||||||
<Image Include="resources\media-cdrom.png" />
|
|
||||||
<Image Include="resources\multimedia-player.png" />
|
|
||||||
<Image Include="resources\star-0.png" />
|
|
||||||
<Image Include="resources\star-1.png" />
|
|
||||||
<Image Include="resources\star-2.png" />
|
|
||||||
<Image Include="resources\star-3.png" />
|
|
||||||
<Image Include="resources\star-4.png" />
|
|
||||||
<Image Include="resources\star-5.png" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="uwp_host_interface.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="database\gamedb.json">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="database\gamesettings.ini">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="duckstation-uwp.pfx" />
|
|
||||||
<None Include="inputprofiles\DualShock 4.ini">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="inputprofiles\Keyboard (No Numpad).ini">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="inputprofiles\Keyboard.ini">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="inputprofiles\PlayStation Classic Controller.ini">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="inputprofiles\Xbox Controller.ini">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="packages.config" />
|
|
||||||
<None Include="PropertySheet.props" />
|
|
||||||
<None Include="shaders\Cccalibrator.glsl">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\dolphinfx\bloom.glsl">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\dolphinfx\celshading.glsl">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\dolphinfx\scanlines.glsl">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\simple-brightness.glsl">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\simple-gamma.glsl">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\simple-sharpen.glsl">
|
|
||||||
<DeploymentContent>true</DeploymentContent>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="uwp_host_interface.h" />
|
|
||||||
<ClInclude Include="uwp_key_map.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Font Include="resources\fa-solid-900.ttf" />
|
|
||||||
<Font Include="resources\roboto-regular.ttf" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Text Include="database\chtdb.txt" />
|
|
||||||
<Text Include="database\gamecontrollerdb.txt" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Xml Include="database\compatibility.xml" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<CommonDataFiles Include="$(SolutionDir)data\**\*.*">
|
|
||||||
<InProject>false</InProject>
|
|
||||||
</CommonDataFiles>
|
|
||||||
</ItemGroup>
|
|
||||||
<Target Name="CopyCommonDataFiles" BeforeTargets="PrepareForBuild" Inputs="@(CommonDataFiles)" Outputs="@(CommonDataFiles -> '$(ProjectDir)%(RecursiveDir)%(Filename)%(Extension)')">
|
|
||||||
<Message Text="Copying common data files" Importance="High" />
|
|
||||||
<Copy SourceFiles="@(CommonDataFiles)" DestinationFolder="$(ProjectDir)\%(RecursiveDir)" SkipUnchangedFiles="true" />
|
|
||||||
</Target>
|
|
||||||
<Import Project="..\frontend-common\frontend-common.props" />
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<Link>
|
|
||||||
<AdditionalDependencies>$(RootBuildDir)frontend-common\frontend-common.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<Import Project="..\..\dep\msvc\vsprops\Targets.props" />
|
|
||||||
</Project>
|
|
|
@ -1,307 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="uwp_host_interface.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Image Include="Assets\Wide310x150Logo.scale-200.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-200.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-200.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SplashScreen.scale-200.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\LockScreenLogo.scale-200.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\duck_128.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SmallTile.scale-100.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SmallTile.scale-125.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SmallTile.scale-150.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SmallTile.scale-200.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SmallTile.scale-400.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-100.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-125.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-150.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square150x150Logo.scale-400.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\WideTile.scale-100.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\WideTile.scale-125.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\WideTile.scale-150.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\WideTile.scale-200.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\WideTile.scale-400.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\LargeTile.scale-100.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\LargeTile.scale-125.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\LargeTile.scale-150.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\LargeTile.scale-200.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\LargeTile.scale-400.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-100.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-125.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-150.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.scale-400.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-16.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-24.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-32.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-48.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.targetsize-256.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-unplated_targetsize-16.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-unplated_targetsize-32.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-unplated_targetsize-48.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-unplated_targetsize-256.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-16.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-24.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-32.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-48.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\Square44x44Logo.altform-lightunplated_targetsize-256.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SplashScreen.scale-100.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SplashScreen.scale-125.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SplashScreen.scale-150.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\SplashScreen.scale-400.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\StoreLogo.scale-100.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\StoreLogo.scale-125.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\StoreLogo.scale-150.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\StoreLogo.scale-200.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="Assets\StoreLogo.scale-400.png">
|
|
||||||
<Filter>Assets</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\address-book-new.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\applications-system.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\duck.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\flag-eu.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\flag-jp.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\flag-uc.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\media-cdrom.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\multimedia-player.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\star-0.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\star-1.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\star-2.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\star-3.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\star-4.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
<Image Include="resources\star-5.png">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Image>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<AppxManifest Include="Package.appxmanifest" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Assets">
|
|
||||||
<UniqueIdentifier>{db9086fe-bacc-4437-8272-1aa6642082db}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Data">
|
|
||||||
<UniqueIdentifier>{fa7724ab-a364-49f2-9cdb-11307aa3f63e}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Data\resources">
|
|
||||||
<UniqueIdentifier>{8eda719e-58c6-484f-b00f-90ee69cd6cb5}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Data\shaders">
|
|
||||||
<UniqueIdentifier>{1d471d6d-942e-4e06-9b74-36c5620c9d43}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Data\inputprofiles">
|
|
||||||
<UniqueIdentifier>{bf7c6843-57df-4e82-bf4e-7ffea724e92d}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Data\database">
|
|
||||||
<UniqueIdentifier>{26b9c7e0-8acd-44be-848e-7da8e32238fa}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Data\shaders\dolphinfx">
|
|
||||||
<UniqueIdentifier>{1c1f164b-4184-422c-8d95-9c4cbb6a21eb}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="PropertySheet.props" />
|
|
||||||
<None Include="packages.config" />
|
|
||||||
<None Include="database\gamedb.json">
|
|
||||||
<Filter>Data\database</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="database\gamesettings.ini">
|
|
||||||
<Filter>Data\database</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\Cccalibrator.glsl">
|
|
||||||
<Filter>Data\shaders</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\simple-brightness.glsl">
|
|
||||||
<Filter>Data\shaders</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\simple-gamma.glsl">
|
|
||||||
<Filter>Data\shaders</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\simple-sharpen.glsl">
|
|
||||||
<Filter>Data\shaders</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\dolphinfx\bloom.glsl">
|
|
||||||
<Filter>Data\shaders\dolphinfx</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\dolphinfx\celshading.glsl">
|
|
||||||
<Filter>Data\shaders\dolphinfx</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="shaders\dolphinfx\scanlines.glsl">
|
|
||||||
<Filter>Data\shaders\dolphinfx</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="inputprofiles\Keyboard.ini">
|
|
||||||
<Filter>Data\inputprofiles</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="inputprofiles\PlayStation Classic Controller.ini">
|
|
||||||
<Filter>Data\inputprofiles</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="inputprofiles\Xbox Controller.ini">
|
|
||||||
<Filter>Data\inputprofiles</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="inputprofiles\DualShock 4.ini">
|
|
||||||
<Filter>Data\inputprofiles</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="inputprofiles\Keyboard (No Numpad).ini">
|
|
||||||
<Filter>Data\inputprofiles</Filter>
|
|
||||||
</None>
|
|
||||||
<None Include="duckstation-uwp.pfx" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="uwp_host_interface.h" />
|
|
||||||
<ClInclude Include="uwp_key_map.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Font Include="resources\fa-solid-900.ttf">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Font>
|
|
||||||
<Font Include="resources\roboto-regular.ttf">
|
|
||||||
<Filter>Data\resources</Filter>
|
|
||||||
</Font>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Text Include="database\gamecontrollerdb.txt">
|
|
||||||
<Filter>Data\database</Filter>
|
|
||||||
</Text>
|
|
||||||
<Text Include="database\chtdb.txt">
|
|
||||||
<Filter>Data\database</Filter>
|
|
||||||
</Text>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Xml Include="database\compatibility.xml">
|
|
||||||
<Filter>Data\database</Filter>
|
|
||||||
</Xml>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,4 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="Microsoft.Windows.CppWinRT" version="2.0.210505.3" targetFramework="native" />
|
|
||||||
</packages>
|
|
|
@ -1,764 +0,0 @@
|
||||||
#include "uwp_host_interface.h"
|
|
||||||
#include "common/assert.h"
|
|
||||||
#include "common/byte_stream.h"
|
|
||||||
#include "common/file_system.h"
|
|
||||||
#include "common/log.h"
|
|
||||||
#include "common/string_util.h"
|
|
||||||
#include "core/controller.h"
|
|
||||||
#include "core/gpu.h"
|
|
||||||
#include "core/host_display.h"
|
|
||||||
#include "core/imgui_fullscreen.h"
|
|
||||||
#include "core/imgui_styles.h"
|
|
||||||
#include "core/system.h"
|
|
||||||
#include "frontend-common/controller_interface.h"
|
|
||||||
#include "frontend-common/d3d11_host_display.h"
|
|
||||||
#include "frontend-common/d3d12_host_display.h"
|
|
||||||
#include "frontend-common/fullscreen_ui.h"
|
|
||||||
#include "frontend-common/icon.h"
|
|
||||||
#include "frontend-common/ini_settings_interface.h"
|
|
||||||
#include "imgui.h"
|
|
||||||
#include "imgui_internal.h"
|
|
||||||
#include "imgui_stdlib.h"
|
|
||||||
#include "uwp_key_map.h"
|
|
||||||
#include <cinttypes>
|
|
||||||
#include <cmath>
|
|
||||||
Log_SetChannel(UWPHostInterface);
|
|
||||||
|
|
||||||
#include <gamingdeviceinformation.h>
|
|
||||||
#include <winrt/Windows.Graphics.Display.Core.h>
|
|
||||||
#include <winrt/Windows.Graphics.Display.h>
|
|
||||||
#include <winrt/Windows.Storage.h>
|
|
||||||
#include <winrt/Windows.System.Profile.h>
|
|
||||||
|
|
||||||
static bool IsRunningOnXbox()
|
|
||||||
{
|
|
||||||
const auto version_info = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo();
|
|
||||||
const auto device_family = version_info.DeviceFamily();
|
|
||||||
return (device_family == L"Windows.Xbox");
|
|
||||||
}
|
|
||||||
|
|
||||||
UWPHostInterface::UWPHostInterface() = default;
|
|
||||||
|
|
||||||
UWPHostInterface::~UWPHostInterface() = default;
|
|
||||||
|
|
||||||
winrt::Windows::ApplicationModel::Core::IFrameworkView UWPHostInterface::CreateView()
|
|
||||||
{
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::Initialize(const winrt::Windows::ApplicationModel::Core::CoreApplicationView& a)
|
|
||||||
{
|
|
||||||
winrt::Windows::ApplicationModel::Core::CoreApplication::Suspending({this, &UWPHostInterface::OnSuspending});
|
|
||||||
winrt::Windows::ApplicationModel::Core::CoreApplication::Resuming({this, &UWPHostInterface::OnResuming});
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::Load(const winrt::hstring&) {}
|
|
||||||
|
|
||||||
void UWPHostInterface::Uninitialize() {}
|
|
||||||
|
|
||||||
const char* UWPHostInterface::GetFrontendName() const
|
|
||||||
{
|
|
||||||
return "DuckStation UWP Frontend";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UWPHostInterface::Initialize()
|
|
||||||
{
|
|
||||||
Log::SetDebugOutputParams(true, nullptr, LOGLEVEL_DEBUG);
|
|
||||||
if (!SetDirectories())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
m_settings_interface = std::make_unique<INISettingsInterface>(GetSettingsFileName());
|
|
||||||
m_flags.force_fullscreen_ui = true;
|
|
||||||
m_fullscreen_ui_enabled = true;
|
|
||||||
|
|
||||||
if (!CommonHostInterface::Initialize())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
SetImGuiKeyMap();
|
|
||||||
|
|
||||||
const bool start_fullscreen = m_flags.start_fullscreen || g_settings.start_fullscreen;
|
|
||||||
if (!CreateDisplay(start_fullscreen))
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Failed to create host display");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::Shutdown()
|
|
||||||
{
|
|
||||||
DestroyDisplay();
|
|
||||||
|
|
||||||
CommonHostInterface::Shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::SetDefaultSettings(SettingsInterface& si)
|
|
||||||
{
|
|
||||||
CommonHostInterface::SetDefaultSettings(si);
|
|
||||||
|
|
||||||
si.SetStringValue("CPU", "FastmemMode", "LUT");
|
|
||||||
si.SetStringValue("Main", "ControllerBackend", "XInput");
|
|
||||||
si.AddToStringList("GameList", "RecursivePaths", GetUserDirectoryRelativePath("games").c_str());
|
|
||||||
|
|
||||||
// TODO: Maybe we should bind this to F1 in the future.
|
|
||||||
si.SetStringValue("Hotkeys", "OpenQuickMenu", "Keyboard/Escape");
|
|
||||||
|
|
||||||
if (IsRunningOnXbox())
|
|
||||||
SetDefaultSettingsForXbox(si);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UWPHostInterface::CreateDisplay(bool fullscreen)
|
|
||||||
{
|
|
||||||
Assert(!m_display);
|
|
||||||
|
|
||||||
m_appview = winrt::Windows::UI::ViewManagement::ApplicationView::GetForCurrentView();
|
|
||||||
m_appview.PreferredLaunchWindowingMode(
|
|
||||||
fullscreen ? winrt::Windows::UI::ViewManagement::ApplicationViewWindowingMode::FullScreen :
|
|
||||||
winrt::Windows::UI::ViewManagement::ApplicationViewWindowingMode::Auto);
|
|
||||||
|
|
||||||
m_window.Activate();
|
|
||||||
|
|
||||||
const auto di = winrt::Windows::Graphics::Display::DisplayInformation::GetForCurrentView();
|
|
||||||
const auto hdi = winrt::Windows::Graphics::Display::Core::HdmiDisplayInformation::GetForCurrentView();
|
|
||||||
const s32 resolution_scale = static_cast<s32>(di.ResolutionScale());
|
|
||||||
|
|
||||||
WindowInfo wi;
|
|
||||||
wi.type = WindowInfo::Type::WinRT;
|
|
||||||
wi.window_handle = winrt::get_unknown(m_window);
|
|
||||||
wi.surface_scale = static_cast<float>(resolution_scale) / 100.0f;
|
|
||||||
wi.surface_width = static_cast<u32>(m_window.Bounds().Width * wi.surface_scale);
|
|
||||||
wi.surface_height = static_cast<s32>(m_window.Bounds().Height * wi.surface_scale);
|
|
||||||
if (hdi)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
const auto dm = hdi.GetCurrentDisplayMode();
|
|
||||||
const u32 hdmi_width = dm.ResolutionWidthInRawPixels();
|
|
||||||
const u32 hdmi_height = dm.ResolutionHeightInRawPixels();
|
|
||||||
wi.surface_refresh_rate = static_cast<float>(dm.RefreshRate());
|
|
||||||
Log_InfoPrintf("HDMI mode: %ux%u @ %.2f hz", hdmi_width, hdmi_height, wi.surface_refresh_rate);
|
|
||||||
|
|
||||||
// If we're running on Xbox, use the HDMI mode instead of the CoreWindow size.
|
|
||||||
// In UWP, the CoreWindow is always 1920x1080, even when running at 4K.
|
|
||||||
if (IsRunningOnXbox())
|
|
||||||
{
|
|
||||||
GAMING_DEVICE_MODEL_INFORMATION gdinfo = {};
|
|
||||||
if (SUCCEEDED(GetGamingDeviceModelInformation(&gdinfo)) && gdinfo.vendorId == GAMING_DEVICE_VENDOR_ID_MICROSOFT)
|
|
||||||
{
|
|
||||||
Log_InfoPrintf("Overriding core window size %ux%u with HDMI size %ux%u", wi.surface_width, wi.surface_height,
|
|
||||||
hdmi_width, hdmi_height);
|
|
||||||
wi.surface_scale *= static_cast<float>(hdmi_width) / static_cast<float>(wi.surface_width);
|
|
||||||
wi.surface_width = hdmi_width;
|
|
||||||
wi.surface_height = hdmi_height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (const winrt::hresult_error&)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_settings.gpu_renderer == GPURenderer::HardwareD3D12)
|
|
||||||
m_display = std::make_unique<FrontendCommon::D3D12HostDisplay>();
|
|
||||||
else
|
|
||||||
m_display = std::make_unique<FrontendCommon::D3D11HostDisplay>();
|
|
||||||
|
|
||||||
if (!m_display->CreateRenderDevice(wi, g_settings.gpu_adapter, g_settings.gpu_use_debug_device,
|
|
||||||
g_settings.gpu_threaded_presentation) ||
|
|
||||||
!m_display->InitializeRenderDevice(GetShaderCacheBasePath(), g_settings.gpu_use_debug_device,
|
|
||||||
g_settings.gpu_threaded_presentation) ||
|
|
||||||
!CreateHostDisplayResources())
|
|
||||||
{
|
|
||||||
m_display->DestroyRenderDevice();
|
|
||||||
m_display.reset();
|
|
||||||
ReportError("Failed to create/initialize display render device");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!CreateHostDisplayResources())
|
|
||||||
Log_WarningPrint("Failed to create host display resources");
|
|
||||||
|
|
||||||
Log_InfoPrintf("Host display initialized at %ux%u resolution", m_display->GetWindowWidth(),
|
|
||||||
m_display->GetWindowHeight());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::DestroyDisplay()
|
|
||||||
{
|
|
||||||
ReleaseHostDisplayResources();
|
|
||||||
|
|
||||||
if (m_display)
|
|
||||||
m_display->DestroyRenderDevice();
|
|
||||||
|
|
||||||
m_display.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UWPHostInterface::AcquireHostDisplay()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::ReleaseHostDisplay()
|
|
||||||
{
|
|
||||||
// restore vsync, since we don't want to burn cycles at the menu
|
|
||||||
m_display->SetVSync(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::PollAndUpdate()
|
|
||||||
{
|
|
||||||
CommonHostInterface::PollAndUpdate();
|
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
if (m_text_input_requested != io.WantTextInput)
|
|
||||||
{
|
|
||||||
const bool activate = io.WantTextInput;
|
|
||||||
Log_InfoPrintf("%s input pane...", activate ? "showing" : "hiding");
|
|
||||||
|
|
||||||
m_text_input_requested = activate;
|
|
||||||
m_dispatcher.RunAsync(winrt::Windows::UI::Core::CoreDispatcherPriority::Normal, [this, activate]() {
|
|
||||||
const auto input_pane = winrt::Windows::UI::ViewManagement::InputPane::GetForCurrentView();
|
|
||||||
if (input_pane)
|
|
||||||
{
|
|
||||||
if (activate)
|
|
||||||
input_pane.TryShow();
|
|
||||||
else
|
|
||||||
input_pane.TryHide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::RequestExit()
|
|
||||||
{
|
|
||||||
m_shutdown_flag.store(true);
|
|
||||||
m_dispatcher.RunAsync(winrt::Windows::UI::Core::CoreDispatcherPriority::Normal,
|
|
||||||
[this]() { winrt::Windows::ApplicationModel::Core::CoreApplication::Exit(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::SetMouseMode(bool relative, bool hide_cursor) {}
|
|
||||||
|
|
||||||
void UWPHostInterface::Run()
|
|
||||||
{
|
|
||||||
if (!Initialize())
|
|
||||||
{
|
|
||||||
Shutdown();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_emulation_thread = std::thread(&UWPHostInterface::EmulationThreadEntryPoint, this);
|
|
||||||
|
|
||||||
m_dispatcher.ProcessEvents(winrt::Windows::UI::Core::CoreProcessEventsOption::ProcessUntilQuit);
|
|
||||||
m_shutdown_flag.store(true);
|
|
||||||
m_emulation_thread.join();
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::EmulationThreadEntryPoint()
|
|
||||||
{
|
|
||||||
if (m_fullscreen_ui_enabled)
|
|
||||||
{
|
|
||||||
FullscreenUI::SetDebugMenuAllowed(true);
|
|
||||||
FullscreenUI::QueueGameListRefresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
// process events to pick up controllers before updating input map
|
|
||||||
PollAndUpdate();
|
|
||||||
UpdateInputMap();
|
|
||||||
|
|
||||||
if (m_was_running_on_suspend && ShouldSaveResumeState())
|
|
||||||
ResumeSystemFromMostRecentState();
|
|
||||||
|
|
||||||
while (!m_shutdown_flag.load())
|
|
||||||
{
|
|
||||||
RunCallbacks();
|
|
||||||
PollAndUpdate();
|
|
||||||
|
|
||||||
ImGui::NewFrame();
|
|
||||||
|
|
||||||
if (System::IsRunning())
|
|
||||||
{
|
|
||||||
if (m_display_all_frames)
|
|
||||||
System::RunFrame();
|
|
||||||
else
|
|
||||||
System::RunFrames();
|
|
||||||
|
|
||||||
UpdateControllerMetaState();
|
|
||||||
if (m_frame_step_request)
|
|
||||||
{
|
|
||||||
m_frame_step_request = false;
|
|
||||||
PauseSystem(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// rendering
|
|
||||||
{
|
|
||||||
DrawImGuiWindows();
|
|
||||||
ImGui::Render();
|
|
||||||
ImGui::EndFrame();
|
|
||||||
|
|
||||||
m_display->Render();
|
|
||||||
|
|
||||||
if (System::IsRunning())
|
|
||||||
{
|
|
||||||
System::UpdatePerformanceCounters();
|
|
||||||
|
|
||||||
if (m_throttler_enabled)
|
|
||||||
System::Throttle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save state on exit so it can be resumed
|
|
||||||
if (!System::IsShutdown())
|
|
||||||
PowerOffSystem(ShouldSaveResumeState());
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::ReportMessage(const char* message)
|
|
||||||
{
|
|
||||||
Log_InfoPrint(message);
|
|
||||||
AddOSDMessage(message, 10.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::ReportError(const char* message)
|
|
||||||
{
|
|
||||||
Log_ErrorPrint(message);
|
|
||||||
|
|
||||||
if (!m_display)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const bool was_in_frame = GImGui->FrameCount != GImGui->FrameCountEnded;
|
|
||||||
if (was_in_frame)
|
|
||||||
ImGui::EndFrame();
|
|
||||||
|
|
||||||
bool done = false;
|
|
||||||
while (!done)
|
|
||||||
{
|
|
||||||
RunCallbacks();
|
|
||||||
PollAndUpdate();
|
|
||||||
if (m_fullscreen_ui_enabled)
|
|
||||||
FullscreenUI::SetImGuiNavInputs();
|
|
||||||
|
|
||||||
ImGui::NewFrame();
|
|
||||||
done = FullscreenUI::DrawErrorWindow(message);
|
|
||||||
ImGui::EndFrame();
|
|
||||||
m_display->Render();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (was_in_frame)
|
|
||||||
ImGui::NewFrame();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UWPHostInterface::ConfirmMessage(const char* message)
|
|
||||||
{
|
|
||||||
Log_InfoPrintf("Confirm: %s", message);
|
|
||||||
|
|
||||||
if (!m_display)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
const bool was_in_frame = GImGui->FrameCount != GImGui->FrameCountEnded;
|
|
||||||
if (was_in_frame)
|
|
||||||
ImGui::EndFrame();
|
|
||||||
|
|
||||||
bool done = false;
|
|
||||||
bool result = true;
|
|
||||||
while (!done)
|
|
||||||
{
|
|
||||||
RunCallbacks();
|
|
||||||
PollAndUpdate();
|
|
||||||
if (m_fullscreen_ui_enabled)
|
|
||||||
FullscreenUI::SetImGuiNavInputs();
|
|
||||||
|
|
||||||
ImGui::NewFrame();
|
|
||||||
done = FullscreenUI::DrawConfirmWindow(message, &result);
|
|
||||||
ImGui::EndFrame();
|
|
||||||
m_display->Render();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (was_in_frame)
|
|
||||||
ImGui::NewFrame();
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::RunLater(std::function<void()> callback)
|
|
||||||
{
|
|
||||||
std::unique_lock<std::mutex> lock(m_queued_callbacks_lock);
|
|
||||||
m_queued_callbacks.push_back(std::move(callback));
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnDisplayInvalidated() {}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnSystemPerformanceCountersUpdated() {}
|
|
||||||
|
|
||||||
bool UWPHostInterface::IsFullscreen() const
|
|
||||||
{
|
|
||||||
return m_appview.IsFullScreenMode();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UWPHostInterface::SetFullscreen(bool enabled)
|
|
||||||
{
|
|
||||||
m_dispatcher.RunAsync(winrt::Windows::UI::Core::CoreDispatcherPriority::Normal, [this, enabled]() {
|
|
||||||
if (enabled)
|
|
||||||
m_appview.TryEnterFullScreenMode();
|
|
||||||
else
|
|
||||||
m_appview.ExitFullScreenMode();
|
|
||||||
});
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::RunCallbacks()
|
|
||||||
{
|
|
||||||
std::unique_lock<std::mutex> lock(m_queued_callbacks_lock);
|
|
||||||
|
|
||||||
while (!m_queued_callbacks.empty())
|
|
||||||
{
|
|
||||||
auto callback = std::move(m_queued_callbacks.front());
|
|
||||||
m_queued_callbacks.pop_front();
|
|
||||||
lock.unlock();
|
|
||||||
callback();
|
|
||||||
lock.lock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::SetWindow(const winrt::Windows::UI::Core::CoreWindow& window)
|
|
||||||
{
|
|
||||||
m_window = window;
|
|
||||||
m_dispatcher = m_window.Dispatcher();
|
|
||||||
|
|
||||||
window.Closed({this, &UWPHostInterface::OnClosed});
|
|
||||||
window.SizeChanged({this, &UWPHostInterface::OnSizeChanged});
|
|
||||||
window.KeyDown({this, &UWPHostInterface::OnKeyDown});
|
|
||||||
window.KeyUp({this, &UWPHostInterface::OnKeyUp});
|
|
||||||
window.CharacterReceived({this, &UWPHostInterface::OnCharacterReceived});
|
|
||||||
window.PointerPressed({this, &UWPHostInterface::OnPointerPressed});
|
|
||||||
window.PointerReleased({this, &UWPHostInterface::OnPointerPressed});
|
|
||||||
window.PointerMoved({this, &UWPHostInterface::OnPointerMoved});
|
|
||||||
window.PointerWheelChanged({this, &UWPHostInterface::OnPointerWheelChanged});
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UWPHostInterface::SetDirectories()
|
|
||||||
{
|
|
||||||
const auto install_location = winrt::Windows::ApplicationModel::Package::Current().InstalledLocation();
|
|
||||||
m_program_directory = StringUtil::WideStringToUTF8String(install_location.Path());
|
|
||||||
if (m_program_directory.empty())
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Failed to get install location");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log_InfoPrintf("Program directory: %s", m_program_directory.c_str());
|
|
||||||
|
|
||||||
const auto local_location = winrt::Windows::Storage::ApplicationData::Current().LocalFolder();
|
|
||||||
m_user_directory = StringUtil::WideStringToUTF8String(local_location.Path());
|
|
||||||
if (m_user_directory.empty())
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Failed to get user directory");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log_InfoPrintf("User directory: %s", m_user_directory.c_str());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnSuspending(const IInspectable&,
|
|
||||||
const winrt::Windows::ApplicationModel::SuspendingEventArgs& args)
|
|
||||||
{
|
|
||||||
if (IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
RunLater([this]() {
|
|
||||||
if (ShouldSaveResumeState())
|
|
||||||
SaveResumeSaveState();
|
|
||||||
|
|
||||||
m_was_running_on_suspend.store(System::IsRunning());
|
|
||||||
PauseSystem(true);
|
|
||||||
m_suspend_sync_event.Signal();
|
|
||||||
});
|
|
||||||
|
|
||||||
m_suspend_sync_event.Wait();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnResuming(const IInspectable&, const IInspectable&)
|
|
||||||
{
|
|
||||||
if (IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
if (m_was_running_on_suspend.load())
|
|
||||||
RunLater([this]() { PauseSystem(false); });
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RunLater([this]() {
|
|
||||||
if (ShouldSaveResumeState())
|
|
||||||
ResumeSystemFromMostRecentState();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnClosed(const IInspectable&, const winrt::Windows::UI::Core::CoreWindowEventArgs& args)
|
|
||||||
{
|
|
||||||
if (IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
m_shutdown_flag.store(true);
|
|
||||||
m_emulation_thread.join();
|
|
||||||
}
|
|
||||||
args.Handled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnSizeChanged(const IInspectable&,
|
|
||||||
const winrt::Windows::UI::Core::WindowSizeChangedEventArgs& args)
|
|
||||||
{
|
|
||||||
if (IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
const auto size = args.Size();
|
|
||||||
const float width = size.Width;
|
|
||||||
const float height = size.Height;
|
|
||||||
RunLater([this, width, height]() {
|
|
||||||
if (!m_display)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_display->ResizeRenderWindow(static_cast<s32>(width * m_display->GetWindowScale()),
|
|
||||||
static_cast<s32>(height * m_display->GetWindowScale()));
|
|
||||||
OnHostDisplayResized();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
args.Handled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnKeyDown(const IInspectable&, const winrt::Windows::UI::Core::KeyEventArgs& args)
|
|
||||||
{
|
|
||||||
const auto status = args.KeyStatus();
|
|
||||||
if (!status.WasKeyDown && !status.IsKeyReleased && IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
const HostKeyCode code = static_cast<HostKeyCode>(args.VirtualKey());
|
|
||||||
RunLater([this, code]() {
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
if (code < countof(io.KeysDown))
|
|
||||||
io.KeysDown[code] = true;
|
|
||||||
|
|
||||||
if (!io.WantCaptureKeyboard)
|
|
||||||
HandleHostKeyEvent(code, 0, true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
args.Handled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnKeyUp(const IInspectable&, const winrt::Windows::UI::Core::KeyEventArgs& args)
|
|
||||||
{
|
|
||||||
const auto status = args.KeyStatus();
|
|
||||||
if (status.WasKeyDown && status.IsKeyReleased && IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
const HostKeyCode code = static_cast<HostKeyCode>(args.VirtualKey());
|
|
||||||
RunLater([this, code]() {
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
if (code < countof(io.KeysDown))
|
|
||||||
io.KeysDown[code] = false;
|
|
||||||
|
|
||||||
if (!io.WantCaptureKeyboard)
|
|
||||||
HandleHostKeyEvent(code, 0, false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
args.Handled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnCharacterReceived(const IInspectable&,
|
|
||||||
const winrt::Windows::UI::Core::CharacterReceivedEventArgs& args)
|
|
||||||
{
|
|
||||||
if (IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
const u32 code = args.KeyCode();
|
|
||||||
RunLater([this, code]() { ImGui::GetIO().AddInputCharacter(code); });
|
|
||||||
}
|
|
||||||
|
|
||||||
args.Handled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnPointerPressed(const IInspectable&, const winrt::Windows::UI::Core::PointerEventArgs& args)
|
|
||||||
{
|
|
||||||
const auto pointer = args.CurrentPoint();
|
|
||||||
if (pointer.PointerDevice().PointerDeviceType() == winrt::Windows::Devices::Input::PointerDeviceType::Mouse)
|
|
||||||
UpdateMouseButtonState(pointer);
|
|
||||||
|
|
||||||
args.Handled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnPointerReleased(const IInspectable&, const winrt::Windows::UI::Core::PointerEventArgs& args)
|
|
||||||
{
|
|
||||||
const auto pointer = args.CurrentPoint();
|
|
||||||
if (pointer.PointerDevice().PointerDeviceType() == winrt::Windows::Devices::Input::PointerDeviceType::Mouse)
|
|
||||||
UpdateMouseButtonState(pointer);
|
|
||||||
|
|
||||||
args.Handled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnPointerMoved(const IInspectable&, const winrt::Windows::UI::Core::PointerEventArgs& args)
|
|
||||||
{
|
|
||||||
const auto pointer = args.CurrentPoint();
|
|
||||||
if (pointer.PointerDevice().PointerDeviceType() == winrt::Windows::Devices::Input::PointerDeviceType::Mouse)
|
|
||||||
{
|
|
||||||
const auto pos = pointer.Position();
|
|
||||||
const float x = pos.X * m_display->GetWindowScale();
|
|
||||||
const float y = pos.Y * m_display->GetWindowScale();
|
|
||||||
|
|
||||||
if (IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
RunLater([this, x, y]() {
|
|
||||||
m_display->SetMousePosition(static_cast<s32>(x), static_cast<s32>(y));
|
|
||||||
|
|
||||||
if (ImGui::GetCurrentContext())
|
|
||||||
{
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
io.MousePos.x = x;
|
|
||||||
io.MousePos.y = y;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateMouseButtonState(pointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
args.Handled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::OnPointerWheelChanged(const IInspectable&,
|
|
||||||
const winrt::Windows::UI::Core::PointerEventArgs& args)
|
|
||||||
{
|
|
||||||
const auto pointer = args.CurrentPoint();
|
|
||||||
const auto properties = pointer.Properties();
|
|
||||||
const s32 delta = properties.MouseWheelDelta();
|
|
||||||
const bool horizontal = properties.IsHorizontalMouseWheel();
|
|
||||||
|
|
||||||
if (IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
RunLater([this, delta, horizontal]() {
|
|
||||||
if (ImGui::GetCurrentContext())
|
|
||||||
{
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
const float dw = static_cast<float>(std::clamp<s32>(delta, -1, 1));
|
|
||||||
if (horizontal)
|
|
||||||
io.MouseWheelH = dw;
|
|
||||||
else
|
|
||||||
io.MouseWheel = dw;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
args.Handled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::UpdateMouseButtonState(const winrt::Windows::UI::Input::PointerPoint& point)
|
|
||||||
{
|
|
||||||
const auto properties = point.Properties();
|
|
||||||
const bool states[3] = {properties.IsLeftButtonPressed(), properties.IsRightButtonPressed(),
|
|
||||||
properties.IsMiddleButtonPressed()};
|
|
||||||
|
|
||||||
if (IsEmulationThreadRunning())
|
|
||||||
{
|
|
||||||
RunLater([this, states]() {
|
|
||||||
if (!ImGui::GetCurrentContext())
|
|
||||||
return;
|
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
for (u32 i = 0; i < countof(states); i++)
|
|
||||||
{
|
|
||||||
if (io.MouseDown[i] == states[i])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
io.MouseDown[i] = states[i];
|
|
||||||
HandleHostMouseEvent(static_cast<HostMouseButton>(i + 1u), states[i]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<CommonHostInterface::HostKeyCode> UWPHostInterface::GetHostKeyCode(const std::string_view key_code) const
|
|
||||||
{
|
|
||||||
for (const auto& it : s_key_map)
|
|
||||||
{
|
|
||||||
if (key_code.compare(it.second) == 0)
|
|
||||||
return static_cast<HostKeyCode>(it.first);
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* UWPHostInterface::GetKeyCodeName(int key_code)
|
|
||||||
{
|
|
||||||
const auto it = s_key_map.find(key_code);
|
|
||||||
return (it != s_key_map.end()) ? it->second : nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::SetImGuiKeyMap()
|
|
||||||
{
|
|
||||||
using namespace winrt::Windows::System;
|
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
io.KeyMap[ImGuiKey_Tab] = static_cast<int>(VirtualKey::Tab);
|
|
||||||
io.KeyMap[ImGuiKey_LeftArrow] = static_cast<int>(VirtualKey::Left);
|
|
||||||
io.KeyMap[ImGuiKey_RightArrow] = static_cast<int>(VirtualKey::Right);
|
|
||||||
io.KeyMap[ImGuiKey_UpArrow] = static_cast<int>(VirtualKey::Up);
|
|
||||||
io.KeyMap[ImGuiKey_DownArrow] = static_cast<int>(VirtualKey::Down);
|
|
||||||
io.KeyMap[ImGuiKey_PageUp] = static_cast<int>(VirtualKey::PageUp);
|
|
||||||
io.KeyMap[ImGuiKey_PageDown] = static_cast<int>(VirtualKey::PageDown);
|
|
||||||
io.KeyMap[ImGuiKey_Home] = static_cast<int>(VirtualKey::Home);
|
|
||||||
io.KeyMap[ImGuiKey_End] = static_cast<int>(VirtualKey::End);
|
|
||||||
io.KeyMap[ImGuiKey_Insert] = static_cast<int>(VirtualKey::Insert);
|
|
||||||
io.KeyMap[ImGuiKey_Delete] = static_cast<int>(VirtualKey::Delete);
|
|
||||||
io.KeyMap[ImGuiKey_Backspace] = static_cast<int>(VirtualKey::Back);
|
|
||||||
io.KeyMap[ImGuiKey_Space] = static_cast<int>(VirtualKey::Space);
|
|
||||||
io.KeyMap[ImGuiKey_Enter] = static_cast<int>(VirtualKey::Enter);
|
|
||||||
io.KeyMap[ImGuiKey_Escape] = static_cast<int>(VirtualKey::Escape);
|
|
||||||
io.KeyMap[ImGuiKey_A] = static_cast<int>(VirtualKey::A);
|
|
||||||
io.KeyMap[ImGuiKey_C] = static_cast<int>(VirtualKey::C);
|
|
||||||
io.KeyMap[ImGuiKey_V] = static_cast<int>(VirtualKey::V);
|
|
||||||
io.KeyMap[ImGuiKey_X] = static_cast<int>(VirtualKey::X);
|
|
||||||
io.KeyMap[ImGuiKey_Y] = static_cast<int>(VirtualKey::Y);
|
|
||||||
io.KeyMap[ImGuiKey_Z] = static_cast<int>(VirtualKey::Z);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UWPHostInterface::SetDefaultSettingsForXbox(SettingsInterface& si)
|
|
||||||
{
|
|
||||||
si.SetStringValue("GPU", "Renderer", "D3D12");
|
|
||||||
|
|
||||||
si.SetBoolValue("Main", "SyncToHostRefreshRate", true);
|
|
||||||
si.SetBoolValue("Display", "VSync", true);
|
|
||||||
si.SetBoolValue("Display", "DisplayAllFrames", true);
|
|
||||||
si.SetFloatValue("Display", "MaxFPS", 60.0f);
|
|
||||||
|
|
||||||
// Set up an analog controller in port 1.
|
|
||||||
si.SetStringValue("Controller1", "Type", "AnalogController");
|
|
||||||
si.SetStringValue("Controller1", "ButtonUp", "Controller0/Button11");
|
|
||||||
si.SetStringValue("Controller1", "ButtonDown", "Controller0/Button12");
|
|
||||||
si.SetStringValue("Controller1", "ButtonLeft", "Controller0/Button13");
|
|
||||||
si.SetStringValue("Controller1", "ButtonRight", "Controller0/Button14");
|
|
||||||
si.SetStringValue("Controller1", "ButtonStart", "Controller0/Button6");
|
|
||||||
si.SetStringValue("Controller1", "ButtonTriangle", "Controller0/Button3");
|
|
||||||
si.SetStringValue("Controller1", "ButtonCross", "Controller0/Button0");
|
|
||||||
si.SetStringValue("Controller1", "ButtonCircle", "Controller0/Button1");
|
|
||||||
si.SetStringValue("Controller1", "ButtonSquare", "Controller0/Button2");
|
|
||||||
si.SetStringValue("Controller1", "ButtonL1", "Controller0/Button9");
|
|
||||||
si.SetStringValue("Controller1", "ButtonL2", "Controller0/+Axis4");
|
|
||||||
si.SetStringValue("Controller1", "ButtonR1", "Controller0/Button10");
|
|
||||||
si.SetStringValue("Controller1", "ButtonR2", "Controller0/+Axis5");
|
|
||||||
si.SetStringValue("Controller1", "ButtonL3", "Controller0/Button7");
|
|
||||||
si.SetStringValue("Controller1", "ButtonR3", "Controller0/Button8");
|
|
||||||
si.SetStringValue("Controller1", "AxisLeftX", "Controller0/Axis0");
|
|
||||||
si.SetStringValue("Controller1", "AxisLeftY", "Controller0/Axis1");
|
|
||||||
si.SetStringValue("Controller1", "AxisRightX", "Controller0/Axis2");
|
|
||||||
si.SetStringValue("Controller1", "AxisRightY", "Controller0/Axis3");
|
|
||||||
si.SetStringValue("Controller1", "Rumble", "Controller0");
|
|
||||||
si.SetStringValue("Controller1", "ForceAnalogOnReset", "true");
|
|
||||||
si.SetStringValue("Controller1", "AnalogDPadInDigitalMode", "true");
|
|
||||||
|
|
||||||
// Repurpose the select button to open the menu.
|
|
||||||
// Not ideal, but all we can do until we have chords.
|
|
||||||
si.SetStringValue("Hotkeys", "OpenQuickMenu", "Controller0/Button4");
|
|
||||||
}
|
|
||||||
|
|
||||||
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
|
|
||||||
{
|
|
||||||
winrt::Windows::ApplicationModel::Core::CoreApplication::Run(winrt::make<UWPHostInterface>());
|
|
||||||
}
|
|
|
@ -1,122 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include "common/event.h"
|
|
||||||
#include "common/window_info.h"
|
|
||||||
#include "common/windows_headers.h"
|
|
||||||
#include "core/host_display.h"
|
|
||||||
#include "core/host_interface.h"
|
|
||||||
#include "frontend-common/common_host.h"
|
|
||||||
#include <Unknwn.h>
|
|
||||||
#include <array>
|
|
||||||
#include <deque>
|
|
||||||
#include <functional>
|
|
||||||
#include <map>
|
|
||||||
#include <memory>
|
|
||||||
#include <mutex>
|
|
||||||
#include <string>
|
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
#include <winrt/Windows.ApplicationModel.Core.h>
|
|
||||||
#include <winrt/Windows.Devices.Input.h>
|
|
||||||
#include <winrt/Windows.Foundation.Collections.h>
|
|
||||||
#include <winrt/Windows.Foundation.h>
|
|
||||||
#include <winrt/Windows.UI.Composition.h>
|
|
||||||
#include <winrt/Windows.UI.Core.h>
|
|
||||||
#include <winrt/Windows.UI.Input.h>
|
|
||||||
#include <winrt/Windows.UI.ViewManagement.Core.h>
|
|
||||||
#include <winrt/Windows.UI.ViewManagement.h>
|
|
||||||
#include <winrt/base.h>
|
|
||||||
|
|
||||||
class INISettingsInterface;
|
|
||||||
|
|
||||||
class UWPHostInterface
|
|
||||||
: public CommonHostInterface,
|
|
||||||
public winrt::implements<UWPHostInterface, winrt::Windows::ApplicationModel::Core::IFrameworkViewSource,
|
|
||||||
winrt::Windows::ApplicationModel::Core::IFrameworkView>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
UWPHostInterface();
|
|
||||||
~UWPHostInterface();
|
|
||||||
|
|
||||||
const char* GetFrontendName() const override;
|
|
||||||
bool Initialize() override;
|
|
||||||
void Shutdown() override;
|
|
||||||
|
|
||||||
void ReportMessage(const char* message) override;
|
|
||||||
void ReportError(const char* message) override;
|
|
||||||
bool ConfirmMessage(const char* message) override;
|
|
||||||
|
|
||||||
void RunLater(std::function<void()> callback) override;
|
|
||||||
|
|
||||||
void OnDisplayInvalidated() override;
|
|
||||||
void OnSystemPerformanceCountersUpdated() override;
|
|
||||||
|
|
||||||
bool IsFullscreen() const override;
|
|
||||||
bool SetFullscreen(bool enabled) override;
|
|
||||||
|
|
||||||
winrt::Windows::ApplicationModel::Core::IFrameworkView CreateView();
|
|
||||||
void Initialize(const winrt::Windows::ApplicationModel::Core::CoreApplicationView&);
|
|
||||||
void Load(const winrt::hstring&);
|
|
||||||
void Uninitialize();
|
|
||||||
void Run();
|
|
||||||
void SetWindow(const winrt::Windows::UI::Core::CoreWindow& window);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
enum : u32
|
|
||||||
{
|
|
||||||
DEFAULT_WINDOW_WIDTH = 1280,
|
|
||||||
DEFAULT_WINDOW_HEIGHT = 720
|
|
||||||
};
|
|
||||||
|
|
||||||
ALWAYS_INLINE bool IsEmulationThreadRunning() const { return m_emulation_thread.joinable(); }
|
|
||||||
|
|
||||||
void SetDefaultSettings(SettingsInterface& si) override;
|
|
||||||
|
|
||||||
bool AcquireHostDisplay() override;
|
|
||||||
void ReleaseHostDisplay() override;
|
|
||||||
|
|
||||||
void PollAndUpdate() override;
|
|
||||||
void RequestExit() override;
|
|
||||||
|
|
||||||
void SetMouseMode(bool relative, bool hide_cursor) override;
|
|
||||||
|
|
||||||
bool CreateDisplay(bool fullscreen);
|
|
||||||
void DestroyDisplay();
|
|
||||||
void RunCallbacks();
|
|
||||||
void EmulationThreadEntryPoint();
|
|
||||||
|
|
||||||
bool SetDirectories();
|
|
||||||
void OnSuspending(const IInspectable&, const winrt::Windows::ApplicationModel::SuspendingEventArgs& args);
|
|
||||||
void OnResuming(const IInspectable&, const IInspectable&);
|
|
||||||
void OnClosed(const IInspectable&, const winrt::Windows::UI::Core::CoreWindowEventArgs& args);
|
|
||||||
void OnSizeChanged(const IInspectable&, const winrt::Windows::UI::Core::WindowSizeChangedEventArgs& args);
|
|
||||||
void OnKeyDown(const IInspectable&, const winrt::Windows::UI::Core::KeyEventArgs& args);
|
|
||||||
void OnKeyUp(const IInspectable&, const winrt::Windows::UI::Core::KeyEventArgs& args);
|
|
||||||
void OnCharacterReceived(const IInspectable&, const winrt::Windows::UI::Core::CharacterReceivedEventArgs& args);
|
|
||||||
void OnPointerPressed(const IInspectable&, const winrt::Windows::UI::Core::PointerEventArgs& args);
|
|
||||||
void OnPointerReleased(const IInspectable&, const winrt::Windows::UI::Core::PointerEventArgs& args);
|
|
||||||
void OnPointerMoved(const IInspectable&, const winrt::Windows::UI::Core::PointerEventArgs& args);
|
|
||||||
void OnPointerWheelChanged(const IInspectable&, const winrt::Windows::UI::Core::PointerEventArgs& args);
|
|
||||||
void UpdateMouseButtonState(const winrt::Windows::UI::Input::PointerPoint& point);
|
|
||||||
|
|
||||||
std::optional<HostKeyCode> GetHostKeyCode(const std::string_view key_code) const override;
|
|
||||||
const char* GetKeyCodeName(int key_code);
|
|
||||||
void SetImGuiKeyMap();
|
|
||||||
|
|
||||||
void SetDefaultSettingsForXbox(SettingsInterface& si);
|
|
||||||
|
|
||||||
std::deque<std::function<void()>> m_queued_callbacks;
|
|
||||||
std::mutex m_queued_callbacks_lock;
|
|
||||||
|
|
||||||
winrt::Windows::UI::Core::CoreWindow m_window{nullptr};
|
|
||||||
winrt::Windows::UI::Core::CoreDispatcher m_dispatcher{nullptr};
|
|
||||||
winrt::Windows::UI::ViewManagement::ApplicationView m_appview{nullptr};
|
|
||||||
|
|
||||||
std::thread m_emulation_thread;
|
|
||||||
std::atomic_bool m_shutdown_flag{false};
|
|
||||||
|
|
||||||
bool m_text_input_requested = false;
|
|
||||||
|
|
||||||
Common::Event m_suspend_sync_event;
|
|
||||||
std::atomic_bool m_was_running_on_suspend{false};
|
|
||||||
std::atomic_bool m_was_running_on_background{false};
|
|
||||||
};
|
|
|
@ -1,149 +0,0 @@
|
||||||
#include <map>
|
|
||||||
#include <winrt/Windows.System.h>
|
|
||||||
|
|
||||||
static const std::map<int, const char*> s_key_map = {
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::LeftButton), "LeftButton"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::RightButton), "RightButton"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Cancel), "Cancel"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::MiddleButton), "MiddleButton"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::XButton1), "XButton1"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::XButton2), "XButton2"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Back), "Back"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Tab), "Tab"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Clear), "Clear"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Enter), "Return"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Shift), "Shift"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Control), "Control"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Menu), "Menu"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Pause), "Pause"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::CapitalLock), "CapitalLock"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Kana), "Kana"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Hangul), "Hangul"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Junja), "Junja"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Final), "Final"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Hanja), "Hanja"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Kanji), "Kanji"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Escape), "Escape"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Convert), "Convert"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NonConvert), "NonConvert"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Accept), "Accept"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::ModeChange), "ModeChange"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Space), "Space"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::PageUp), "PageUp"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::PageDown), "PageDown"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::End), "End"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Home), "Home"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Left), "Left"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Up), "Up"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Right), "Right"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Down), "Down"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Select), "Select"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Print), "Print"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Execute), "Execute"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Snapshot), "Snapshot"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Insert), "Insert"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Delete), "Delete"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Help), "Help"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number0), "Number0"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number1), "Number1"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number2), "Number2"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number3), "Number3"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number4), "Number4"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number5), "Number5"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number6), "Number6"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number7), "Number7"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number8), "Number8"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Number9), "Number9"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::A), "A"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::B), "B"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::C), "C"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::D), "D"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::E), "E"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F), "F"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::G), "G"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::H), "H"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::I), "I"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::J), "J"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::K), "K"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::L), "L"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::M), "M"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::N), "N"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::O), "O"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::P), "P"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Q), "Q"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::R), "R"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::S), "S"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::T), "T"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::U), "U"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::V), "V"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::W), "W"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::X), "X"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Y), "Y"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Z), "Z"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::LeftWindows), "LeftWindows"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::RightWindows), "RightWindows"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Application), "Application"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Sleep), "Sleep"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad0), "Keypad+0"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad1), "Keypad+1"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad2), "Keypad+2"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad3), "Keypad+3"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad4), "Keypad+4"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad5), "Keypad+5"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad6), "Keypad+6"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad7), "Keypad+7"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad8), "Keypad+8"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberPad9), "Keypad+9"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Multiply), "Multiply"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Add), "Add"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Separator), "Separator"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Subtract), "Subtract"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Decimal), "Decimal"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Divide), "Divide"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F1), "F1"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F2), "F2"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F3), "F3"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F4), "F4"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F5), "F5"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F6), "F6"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F7), "F7"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F8), "F8"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F9), "F9"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F10), "F10"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F11), "F11"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F12), "F12"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F13), "F13"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F14), "F14"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F15), "F15"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F16), "F16"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F17), "F17"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F18), "F18"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F19), "F19"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F20), "F20"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F21), "F21"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F22), "F22"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F23), "F23"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::F24), "F24"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NavigationView), "NavigationView"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NavigationMenu), "NavigationMenu"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NavigationUp), "NavigationUp"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NavigationDown), "NavigationDown"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NavigationLeft), "NavigationLeft"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NavigationRight), "NavigationRight"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NavigationAccept), "NavigationAccept"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NavigationCancel), "NavigationCancel"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::NumberKeyLock), "NumberKeyLock"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Scroll), "Scroll"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::LeftShift), "LeftShift"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::RightShift), "RightShift"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::LeftControl), "LeftControl"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::RightControl), "RightControl"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::LeftMenu), "LeftMenu"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::RightMenu), "RightMenu"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::GoBack), "GoBack"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::GoForward), "GoForward"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Refresh), "Refresh"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Stop), "Stop"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Search), "Search"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::Favorites), "Favorites"},
|
|
||||||
{static_cast<int>(winrt::Windows::System::VirtualKey::GoHome), "GoHome"}};
|
|
|
@ -11,7 +11,7 @@
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
||||||
<ItemDefinitionGroup Condition="'$(BuildingForUWP)'!='true'">
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PreprocessorDefinitions>WITH_SDL2=1;WITH_DINPUT=1;WITH_DISCORD_PRESENCE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_SDL2=1;WITH_DINPUT=1;WITH_DISCORD_PRESENCE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\discord-rpc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\discord-rpc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
@ -21,5 +21,5 @@
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|
||||||
<Import Project="..\..\dep\msvc\vsprops\SDL2Compile.props" Condition="'$(BuildingForUWP)'!='true'" />
|
<Import Project="..\..\dep\msvc\vsprops\SDL2Compile.props" />
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -4,9 +4,7 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="achievements.cpp" />
|
<ClCompile Include="achievements.cpp" />
|
||||||
<ClCompile Include="common_host.cpp" />
|
<ClCompile Include="common_host.cpp" />
|
||||||
<ClCompile Include="cubeb_audio_stream.cpp">
|
<ClCompile Include="cubeb_audio_stream.cpp" />
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="d3d11_host_display.cpp" />
|
<ClCompile Include="d3d11_host_display.cpp" />
|
||||||
<ClCompile Include="dinput_source.cpp" />
|
<ClCompile Include="dinput_source.cpp" />
|
||||||
<ClCompile Include="fullscreen_ui.cpp" />
|
<ClCompile Include="fullscreen_ui.cpp" />
|
||||||
|
@ -18,10 +16,10 @@
|
||||||
<ClCompile Include="imgui_impl_dx11.cpp" />
|
<ClCompile Include="imgui_impl_dx11.cpp" />
|
||||||
<ClCompile Include="imgui_impl_dx12.cpp" />
|
<ClCompile Include="imgui_impl_dx12.cpp" />
|
||||||
<ClCompile Include="imgui_impl_opengl3.cpp">
|
<ClCompile Include="imgui_impl_opengl3.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="imgui_impl_vulkan.cpp">
|
<ClCompile Include="imgui_impl_vulkan.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="imgui_manager.cpp" />
|
<ClCompile Include="imgui_manager.cpp" />
|
||||||
<ClCompile Include="imgui_overlays.cpp" />
|
<ClCompile Include="imgui_overlays.cpp" />
|
||||||
|
@ -29,14 +27,14 @@
|
||||||
<ClCompile Include="input_manager.cpp" />
|
<ClCompile Include="input_manager.cpp" />
|
||||||
<ClCompile Include="input_source.cpp" />
|
<ClCompile Include="input_source.cpp" />
|
||||||
<ClCompile Include="opengl_host_display.cpp">
|
<ClCompile Include="opengl_host_display.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="postprocessing_chain.cpp" />
|
<ClCompile Include="postprocessing_chain.cpp" />
|
||||||
<ClCompile Include="postprocessing_shader.cpp" />
|
<ClCompile Include="postprocessing_shader.cpp" />
|
||||||
<ClCompile Include="postprocessing_shadergen.cpp" />
|
<ClCompile Include="postprocessing_shadergen.cpp" />
|
||||||
<ClCompile Include="sdl_input_source.cpp" />
|
<ClCompile Include="sdl_input_source.cpp" />
|
||||||
<ClCompile Include="vulkan_host_display.cpp">
|
<ClCompile Include="vulkan_host_display.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="win32_raw_input_source.cpp" />
|
<ClCompile Include="win32_raw_input_source.cpp" />
|
||||||
<ClCompile Include="xaudio2_audio_stream.cpp" />
|
<ClCompile Include="xaudio2_audio_stream.cpp" />
|
||||||
|
@ -45,9 +43,7 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="achievements.h" />
|
<ClInclude Include="achievements.h" />
|
||||||
<ClInclude Include="common_host.h" />
|
<ClInclude Include="common_host.h" />
|
||||||
<ClInclude Include="cubeb_audio_stream.h">
|
<ClInclude Include="cubeb_audio_stream.h" />
|
||||||
<ExcludedFromBuild Condition="'$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="d3d11_host_display.h" />
|
<ClInclude Include="d3d11_host_display.h" />
|
||||||
<ClInclude Include="dinput_source.h" />
|
<ClInclude Include="dinput_source.h" />
|
||||||
<ClInclude Include="fullscreen_ui.h" />
|
<ClInclude Include="fullscreen_ui.h" />
|
||||||
|
@ -58,10 +54,10 @@
|
||||||
<ClInclude Include="imgui_impl_dx11.h" />
|
<ClInclude Include="imgui_impl_dx11.h" />
|
||||||
<ClInclude Include="imgui_impl_dx12.h" />
|
<ClInclude Include="imgui_impl_dx12.h" />
|
||||||
<ClInclude Include="imgui_impl_opengl3.h">
|
<ClInclude Include="imgui_impl_opengl3.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="imgui_impl_vulkan.h">
|
<ClInclude Include="imgui_impl_vulkan.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="imgui_manager.h" />
|
<ClInclude Include="imgui_manager.h" />
|
||||||
<ClInclude Include="imgui_overlays.h" />
|
<ClInclude Include="imgui_overlays.h" />
|
||||||
|
@ -69,14 +65,14 @@
|
||||||
<ClInclude Include="input_manager.h" />
|
<ClInclude Include="input_manager.h" />
|
||||||
<ClInclude Include="input_source.h" />
|
<ClInclude Include="input_source.h" />
|
||||||
<ClInclude Include="opengl_host_display.h">
|
<ClInclude Include="opengl_host_display.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="postprocessing_chain.h" />
|
<ClInclude Include="postprocessing_chain.h" />
|
||||||
<ClInclude Include="postprocessing_shader.h" />
|
<ClInclude Include="postprocessing_shader.h" />
|
||||||
<ClInclude Include="postprocessing_shadergen.h" />
|
<ClInclude Include="postprocessing_shadergen.h" />
|
||||||
<ClInclude Include="sdl_input_source.h" />
|
<ClInclude Include="sdl_input_source.h" />
|
||||||
<ClInclude Include="vulkan_host_display.h">
|
<ClInclude Include="vulkan_host_display.h">
|
||||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64' Or '$(BuildingForUWP)'=='true'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="win32_raw_input_source.h" />
|
<ClInclude Include="win32_raw_input_source.h" />
|
||||||
<ClInclude Include="xaudio2_audio_stream.h" />
|
<ClInclude Include="xaudio2_audio_stream.h" />
|
||||||
|
|
|
@ -2884,7 +2884,6 @@ void FullscreenUI::DrawDisplaySettingsPage()
|
||||||
fullscreen_mode_set = true;
|
fullscreen_mode_set = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _UWP
|
|
||||||
if (MenuButtonWithValue("Fullscreen Resolution", "Selects the resolution to use in fullscreen modes.",
|
if (MenuButtonWithValue("Fullscreen Resolution", "Selects the resolution to use in fullscreen modes.",
|
||||||
fullscreen_mode.empty() ? "Borderless Fullscreen" : fullscreen_mode.c_str()))
|
fullscreen_mode.empty() ? "Borderless Fullscreen" : fullscreen_mode.c_str()))
|
||||||
{
|
{
|
||||||
|
@ -2911,7 +2910,6 @@ void FullscreenUI::DrawDisplaySettingsPage()
|
||||||
};
|
};
|
||||||
OpenChoiceDialog(ICON_FA_TV " Fullscreen Resolution", false, std::move(options), std::move(callback));
|
OpenChoiceDialog(ICON_FA_TV " Fullscreen Resolution", false, std::move(options), std::move(callback));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const GPURenderer renderer =
|
const GPURenderer renderer =
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
Log_SetChannel(FrontendCommon);
|
Log_SetChannel(FrontendCommon);
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
#include "common/windows_headers.h"
|
#include "common/windows_headers.h"
|
||||||
|
|
||||||
static bool SetScreensaverInhibitWin32(bool inhibit, const WindowInfo& wi)
|
static bool SetScreensaverInhibitWin32(bool inhibit, const WindowInfo& wi)
|
||||||
|
@ -93,7 +93,7 @@ static bool SetScreensaverInhibit(bool inhibit, const WindowInfo& wi)
|
||||||
{
|
{
|
||||||
switch (wi.type)
|
switch (wi.type)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
case WindowInfo::Type::Win32:
|
case WindowInfo::Type::Win32:
|
||||||
return SetScreensaverInhibitWin32(inhibit, wi);
|
return SetScreensaverInhibitWin32(inhibit, wi);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -870,7 +870,7 @@ void InputManager::UpdatePointerRelativeDelta(u32 index, InputPointerAxis axis,
|
||||||
|
|
||||||
bool InputManager::IsUsingRawInput()
|
bool InputManager::IsUsingRawInput()
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
return static_cast<bool>(s_input_sources[static_cast<u32>(InputSourceType::RawInput)]);
|
return static_cast<bool>(s_input_sources[static_cast<u32>(InputSourceType::RawInput)]);
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -53,7 +53,7 @@ static void DeinterleaveSubcode(const u8* subcode_in, u8* subcode_out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP)
|
#if defined(_WIN32)
|
||||||
|
|
||||||
// The include order here is critical.
|
// The include order here is critical.
|
||||||
// clang-format off
|
// clang-format off
|
||||||
|
|
|
@ -22,33 +22,12 @@ static std::string GetTemporaryFileName(const std::string& original_filename)
|
||||||
{
|
{
|
||||||
std::string temporary_filename;
|
std::string temporary_filename;
|
||||||
temporary_filename.reserve(original_filename.length() + 8);
|
temporary_filename.reserve(original_filename.length() + 8);
|
||||||
|
temporary_filename.append(original_filename);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// On UWP, preserve the extension, as it affects permissions.
|
|
||||||
#ifdef _UWP
|
|
||||||
const std::string_view original_view(original_filename);
|
|
||||||
const std::string_view extension(Path::GetExtension(original_view));
|
|
||||||
if (extension.length() < original_filename.length())
|
|
||||||
{
|
|
||||||
temporary_filename.append(original_view.substr(0, original_filename.length() - extension.length() - 1));
|
|
||||||
temporary_filename.append("_XXXXXX");
|
|
||||||
_mktemp_s(temporary_filename.data(), temporary_filename.length() + 1);
|
|
||||||
temporary_filename += '.';
|
|
||||||
temporary_filename.append(extension);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
temporary_filename.append(original_filename);
|
|
||||||
temporary_filename.append(".XXXXXXX");
|
temporary_filename.append(".XXXXXXX");
|
||||||
_mktemp_s(temporary_filename.data(), temporary_filename.length() + 1);
|
_mktemp_s(temporary_filename.data(), temporary_filename.length() + 1);
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
temporary_filename.append(original_filename);
|
|
||||||
temporary_filename.append(".XXXXXXX");
|
|
||||||
_mktemp_s(temporary_filename.data(), temporary_filename.length() + 1);
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
temporary_filename.append(original_filename);
|
|
||||||
temporary_filename.append(".XXXXXX");
|
temporary_filename.append(".XXXXXX");
|
||||||
#if defined(__linux__) || defined(__ANDROID__) || defined(__APPLE__)
|
#if defined(__linux__) || defined(__ANDROID__) || defined(__APPLE__)
|
||||||
mkstemp(temporary_filename.data());
|
mkstemp(temporary_filename.data());
|
||||||
|
|
|
@ -44,21 +44,7 @@ bool JitCodeBuffer::Allocate(u32 size /* = 64 * 1024 * 1024 */, u32 far_code_siz
|
||||||
m_total_size = size + far_code_size;
|
m_total_size = size + far_code_size;
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#if !defined(_UWP)
|
|
||||||
m_code_ptr = static_cast<u8*>(VirtualAlloc(nullptr, m_total_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE));
|
m_code_ptr = static_cast<u8*>(VirtualAlloc(nullptr, m_total_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE));
|
||||||
#else
|
|
||||||
m_code_ptr = static_cast<u8*>(
|
|
||||||
VirtualAlloc2FromApp(GetCurrentProcess(), nullptr, m_total_size, MEM_COMMIT, PAGE_READWRITE, nullptr, 0));
|
|
||||||
if (m_code_ptr)
|
|
||||||
{
|
|
||||||
ULONG old_protection;
|
|
||||||
if (!VirtualProtectFromApp(m_code_ptr, m_total_size, PAGE_EXECUTE_READWRITE, &old_protection))
|
|
||||||
{
|
|
||||||
VirtualFree(m_code_ptr, m_total_size, MEM_RELEASE);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (!m_code_ptr)
|
if (!m_code_ptr)
|
||||||
{
|
{
|
||||||
Log_ErrorPrintf("VirtualAlloc(RWX, %u) for internal buffer failed: %u", m_total_size, GetLastError());
|
Log_ErrorPrintf("VirtualAlloc(RWX, %u) for internal buffer failed: %u", m_total_size, GetLastError());
|
||||||
|
|
|
@ -127,13 +127,8 @@ bool MemoryArena::Create(size_t size, bool writable, bool executable)
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
const DWORD protect = (writable ? (executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE) : PAGE_READONLY);
|
const DWORD protect = (writable ? (executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE) : PAGE_READONLY);
|
||||||
#ifndef _UWP
|
|
||||||
m_file_handle = CreateFileMappingA(INVALID_HANDLE_VALUE, nullptr, protect, Truncate32(size >> 32), Truncate32(size),
|
m_file_handle = CreateFileMappingA(INVALID_HANDLE_VALUE, nullptr, protect, Truncate32(size >> 32), Truncate32(size),
|
||||||
file_mapping_name.c_str());
|
file_mapping_name.c_str());
|
||||||
#else
|
|
||||||
m_file_handle = CreateFileMappingFromApp(INVALID_HANDLE_VALUE, nullptr, protect, size,
|
|
||||||
StringUtil::UTF8StringToWideString(file_mapping_name).c_str());
|
|
||||||
#endif
|
|
||||||
if (!m_file_handle)
|
if (!m_file_handle)
|
||||||
{
|
{
|
||||||
Log_ErrorPrintf("CreateFileMapping failed: %u", GetLastError());
|
Log_ErrorPrintf("CreateFileMapping failed: %u", GetLastError());
|
||||||
|
@ -254,16 +249,8 @@ void* MemoryArena::CreateViewPtr(size_t offset, size_t size, bool writable, bool
|
||||||
void* base_pointer;
|
void* base_pointer;
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
const DWORD desired_access = FILE_MAP_READ | (writable ? FILE_MAP_WRITE : 0) | (executable ? FILE_MAP_EXECUTE : 0);
|
const DWORD desired_access = FILE_MAP_READ | (writable ? FILE_MAP_WRITE : 0) | (executable ? FILE_MAP_EXECUTE : 0);
|
||||||
#ifndef _UWP
|
|
||||||
base_pointer =
|
base_pointer =
|
||||||
MapViewOfFileEx(m_file_handle, desired_access, Truncate32(offset >> 32), Truncate32(offset), size, fixed_address);
|
MapViewOfFileEx(m_file_handle, desired_access, Truncate32(offset >> 32), Truncate32(offset), size, fixed_address);
|
||||||
#else
|
|
||||||
// UWP does not support fixed mappings.
|
|
||||||
if (!fixed_address)
|
|
||||||
base_pointer = MapViewOfFileFromApp(m_file_handle, desired_access, offset, size);
|
|
||||||
else
|
|
||||||
base_pointer = nullptr;
|
|
||||||
#endif
|
|
||||||
if (!base_pointer)
|
if (!base_pointer)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
|
#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
|
||||||
|
|
|
@ -80,7 +80,7 @@ static bool IsStoreInstruction(const void* ptr)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_UWP) && (defined(CPU_X64) || defined(CPU_AARCH64))
|
#if defined(_WIN32) && (defined(CPU_X64) || defined(CPU_AARCH64))
|
||||||
static PVOID s_veh_handle;
|
static PVOID s_veh_handle;
|
||||||
|
|
||||||
static LONG ExceptionHandler(PEXCEPTION_POINTERS exi)
|
static LONG ExceptionHandler(PEXCEPTION_POINTERS exi)
|
||||||
|
@ -116,145 +116,6 @@ static LONG ExceptionHandler(PEXCEPTION_POINTERS exi)
|
||||||
return EXCEPTION_CONTINUE_SEARCH;
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 GetHandlerCodeSize()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(_UWP)
|
|
||||||
|
|
||||||
// https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-160
|
|
||||||
struct UNWIND_INFO
|
|
||||||
{
|
|
||||||
BYTE version : 3;
|
|
||||||
BYTE flags : 5;
|
|
||||||
BYTE size_of_prologue;
|
|
||||||
BYTE count_of_unwind_codes;
|
|
||||||
BYTE frame_register : 4;
|
|
||||||
BYTE frame_offset_scaled : 4;
|
|
||||||
ULONG exception_handler_address;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct UnwindHandler
|
|
||||||
{
|
|
||||||
RUNTIME_FUNCTION runtime_function;
|
|
||||||
UNWIND_INFO unwind_info;
|
|
||||||
uint8_t exception_handler_code[32];
|
|
||||||
};
|
|
||||||
|
|
||||||
static constexpr size_t UNWIND_HANDLER_ALLOC_SIZE = 4096;
|
|
||||||
static_assert(sizeof(UnwindHandler) <= UNWIND_HANDLER_ALLOC_SIZE);
|
|
||||||
|
|
||||||
static EXCEPTION_DISPOSITION UnwindExceptionHandler(PEXCEPTION_RECORD ExceptionRecord, ULONG64 EstablisherFrame,
|
|
||||||
PCONTEXT ContextRecord, PDISPATCHER_CONTEXT DispatcherContext)
|
|
||||||
{
|
|
||||||
if (s_in_handler)
|
|
||||||
return ExceptionContinueSearch;
|
|
||||||
|
|
||||||
s_in_handler = true;
|
|
||||||
|
|
||||||
void* const exception_pc = reinterpret_cast<void*>(DispatcherContext->ControlPc);
|
|
||||||
void* const exception_address = reinterpret_cast<void*>(ExceptionRecord->ExceptionInformation[1]);
|
|
||||||
bool const is_write = ExceptionRecord->ExceptionInformation[0] == 1;
|
|
||||||
|
|
||||||
std::lock_guard<std::mutex> guard(m_handler_lock);
|
|
||||||
for (const RegisteredHandler& rh : m_handlers)
|
|
||||||
{
|
|
||||||
if (static_cast<const u8*>(exception_pc) >= static_cast<const u8*>(rh.start_pc) &&
|
|
||||||
static_cast<const u8*>(exception_pc) <= (static_cast<const u8*>(rh.start_pc) + rh.code_size))
|
|
||||||
{
|
|
||||||
if (rh.callback(exception_pc, exception_address, is_write) == HandlerResult::ContinueExecution)
|
|
||||||
{
|
|
||||||
s_in_handler = false;
|
|
||||||
return ExceptionContinueExecution;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
s_in_handler = false;
|
|
||||||
return ExceptionContinueSearch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PRUNTIME_FUNCTION GetRuntimeFunctionCallback(DWORD64 ControlPc, PVOID Context)
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> guard(m_handler_lock);
|
|
||||||
for (const RegisteredHandler& rh : m_handlers)
|
|
||||||
{
|
|
||||||
if (ControlPc >= reinterpret_cast<DWORD64>(rh.start_pc) &&
|
|
||||||
ControlPc <= (reinterpret_cast<DWORD64>(rh.start_pc) + rh.code_size))
|
|
||||||
{
|
|
||||||
return reinterpret_cast<PRUNTIME_FUNCTION>(rh.start_pc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool InstallFunctionTableCallback(const void* owner, void* start_pc, u32 code_size)
|
|
||||||
{
|
|
||||||
if (code_size < UNWIND_HANDLER_ALLOC_SIZE)
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Invalid code size: %u @ %p", code_size, UNWIND_HANDLER_ALLOC_SIZE);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!RtlInstallFunctionTableCallback(reinterpret_cast<DWORD64>(owner) | 0x3, reinterpret_cast<DWORD64>(start_pc),
|
|
||||||
static_cast<DWORD>(code_size), &GetRuntimeFunctionCallback, nullptr, nullptr))
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("RtlInstallFunctionTableCallback() failed: %08X", GetLastError());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is only valid on x86 for now.
|
|
||||||
#ifndef CPU_X64
|
|
||||||
Log_ErrorPrint("Exception unwind codegen not implemented");
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
UnwindHandler* uh = static_cast<UnwindHandler*>(start_pc);
|
|
||||||
ULONG old_protection;
|
|
||||||
if (!VirtualProtectFromApp(uh, UNWIND_HANDLER_ALLOC_SIZE, PAGE_READWRITE, &old_protection))
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("VirtualProtectFromApp(RW) for exception handler failed: %08X", GetLastError());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
uh->runtime_function.BeginAddress = UNWIND_HANDLER_ALLOC_SIZE;
|
|
||||||
uh->runtime_function.EndAddress = code_size;
|
|
||||||
uh->runtime_function.UnwindInfoAddress = offsetof(UnwindHandler, unwind_info);
|
|
||||||
|
|
||||||
uh->unwind_info.version = 1;
|
|
||||||
uh->unwind_info.flags = UNW_FLAG_EHANDLER;
|
|
||||||
uh->unwind_info.size_of_prologue = 0;
|
|
||||||
uh->unwind_info.count_of_unwind_codes = 0;
|
|
||||||
uh->unwind_info.frame_register = 0;
|
|
||||||
uh->unwind_info.frame_offset_scaled = 0;
|
|
||||||
uh->unwind_info.exception_handler_address = offsetof(UnwindHandler, exception_handler_code);
|
|
||||||
|
|
||||||
// mov rax, handler
|
|
||||||
const void* handler = UnwindExceptionHandler;
|
|
||||||
uh->exception_handler_code[0] = 0x48;
|
|
||||||
uh->exception_handler_code[1] = 0xb8;
|
|
||||||
std::memcpy(&uh->exception_handler_code[2], &handler, sizeof(handler));
|
|
||||||
|
|
||||||
// jmp rax
|
|
||||||
uh->exception_handler_code[10] = 0xff;
|
|
||||||
uh->exception_handler_code[11] = 0xe0;
|
|
||||||
|
|
||||||
if (!VirtualProtectFromApp(uh, UNWIND_HANDLER_ALLOC_SIZE, PAGE_EXECUTE_READ, &old_protection))
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("VirtualProtectFromApp(RX) for exception handler failed: %08X", GetLastError());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 GetHandlerCodeSize()
|
|
||||||
{
|
|
||||||
return UNWIND_HANDLER_ALLOC_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(USE_SIGSEGV)
|
#elif defined(USE_SIGSEGV)
|
||||||
|
|
||||||
static struct sigaction s_old_sigsegv_action;
|
static struct sigaction s_old_sigsegv_action;
|
||||||
|
@ -345,18 +206,6 @@ static void SIGSEGVHandler(int sig, siginfo_t* info, void* ctx)
|
||||||
sa.sa_handler(sig);
|
sa.sa_handler(sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 GetHandlerCodeSize()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
u32 GetHandlerCodeSize()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool InstallHandler(const void* owner, void* start_pc, u32 code_size, Callback callback)
|
bool InstallHandler(const void* owner, void* start_pc, u32 code_size, Callback callback)
|
||||||
|
@ -375,19 +224,13 @@ bool InstallHandler(const void* owner, void* start_pc, u32 code_size, Callback c
|
||||||
|
|
||||||
if (was_empty)
|
if (was_empty)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP) && (defined(CPU_X64) || defined(CPU_AARCH64))
|
#if defined(_WIN32) && (defined(CPU_X64) || defined(CPU_AARCH64))
|
||||||
s_veh_handle = AddVectoredExceptionHandler(1, ExceptionHandler);
|
s_veh_handle = AddVectoredExceptionHandler(1, ExceptionHandler);
|
||||||
if (!s_veh_handle)
|
if (!s_veh_handle)
|
||||||
{
|
{
|
||||||
Log_ErrorPrint("Failed to add vectored exception handler");
|
Log_ErrorPrint("Failed to add vectored exception handler");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#elif defined(_UWP)
|
|
||||||
if (!InstallFunctionTableCallback(owner, start_pc, code_size))
|
|
||||||
{
|
|
||||||
Log_ErrorPrint("Failed to install function table callback");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#elif defined(USE_SIGSEGV)
|
#elif defined(USE_SIGSEGV)
|
||||||
struct sigaction sa = {};
|
struct sigaction sa = {};
|
||||||
sa.sa_sigaction = SIGSEGVHandler;
|
sa.sa_sigaction = SIGSEGVHandler;
|
||||||
|
@ -427,11 +270,9 @@ bool RemoveHandler(const void* owner)
|
||||||
|
|
||||||
if (m_handlers.empty())
|
if (m_handlers.empty())
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) && !defined(_UWP) && (defined(CPU_X64) || defined(CPU_AARCH64))
|
#if defined(_WIN32) && (defined(CPU_X64) || defined(CPU_AARCH64))
|
||||||
RemoveVectoredExceptionHandler(s_veh_handle);
|
RemoveVectoredExceptionHandler(s_veh_handle);
|
||||||
s_veh_handle = nullptr;
|
s_veh_handle = nullptr;
|
||||||
#elif defined(_UWP)
|
|
||||||
// nothing to do here, any unregistered regions will be ignored
|
|
||||||
#elif defined(USE_SIGSEGV)
|
#elif defined(USE_SIGSEGV)
|
||||||
// restore old signal handler
|
// restore old signal handler
|
||||||
#if defined(__APPLE__) || defined(__aarch64__)
|
#if defined(__APPLE__) || defined(__aarch64__)
|
||||||
|
|
|
@ -11,8 +11,6 @@ enum class HandlerResult
|
||||||
using Callback = HandlerResult (*)(void* exception_pc, void* fault_address, bool is_write);
|
using Callback = HandlerResult (*)(void* exception_pc, void* fault_address, bool is_write);
|
||||||
using Handle = void*;
|
using Handle = void*;
|
||||||
|
|
||||||
u32 GetHandlerCodeSize();
|
|
||||||
|
|
||||||
bool InstallHandler(const void* owner, void* start_pc, u32 code_size, Callback callback);
|
bool InstallHandler(const void* owner, void* start_pc, u32 code_size, Callback callback);
|
||||||
bool RemoveHandler(const void* owner);
|
bool RemoveHandler(const void* owner);
|
||||||
|
|
||||||
|
|