Compile fixes for Android
This commit is contained in:
parent
457743e109
commit
f11d357ab9
|
@ -29,7 +29,9 @@ endif()
|
||||||
|
|
||||||
|
|
||||||
# Required libraries.
|
# Required libraries.
|
||||||
|
if(NOT ANDROID)
|
||||||
find_package(SDL2 REQUIRED)
|
find_package(SDL2 REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# Set _DEBUG macro for Debug builds.
|
# Set _DEBUG macro for Debug builds.
|
||||||
|
@ -72,7 +74,10 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
||||||
endif()
|
endif()
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-switch")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-switch")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-switch -Wno-class-memaccess -Wno-invalid-offsetof")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-switch")
|
||||||
|
if(NOT ANDROID)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-class-memaccess -Wno-invalid-offsetof")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,7 +96,7 @@ elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86" OR ${CMAKE_SYSTEM_PROCESSOR} STR
|
||||||
set(CPU_ARCH "x86")
|
set(CPU_ARCH "x86")
|
||||||
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
|
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
|
||||||
set(CPU_ARCH "aarch64")
|
set(CPU_ARCH "aarch64")
|
||||||
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm")
|
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7-a")
|
||||||
set(CPU_ARCH "arm")
|
set(CPU_ARCH "arm")
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "Unknown system processor: " ${CMAKE_SYSTEM_PROCESSOR})
|
message(FATAL_ERROR "Unknown system processor: " ${CMAKE_SYSTEM_PROCESSOR})
|
||||||
|
@ -107,3 +112,7 @@ find_package(Threads REQUIRED)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
add_subdirectory(dep)
|
add_subdirectory(dep)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
|
if(ANDROID)
|
||||||
|
add_subdirectory(android/app/src/cpp)
|
||||||
|
endif()
|
|
@ -1,16 +1,20 @@
|
||||||
add_subdirectory(glad)
|
add_subdirectory(glad)
|
||||||
add_subdirectory(imgui)
|
add_subdirectory(imgui)
|
||||||
add_subdirectory(libcue)
|
add_subdirectory(libcue)
|
||||||
add_subdirectory(nativefiledialog)
|
|
||||||
add_subdirectory(simpleini)
|
add_subdirectory(simpleini)
|
||||||
add_subdirectory(stb)
|
add_subdirectory(stb)
|
||||||
|
|
||||||
|
if(NOT ANDROID)
|
||||||
|
add_subdirectory(nativefiledialog)
|
||||||
|
endif()
|
||||||
|
|
||||||
###################### YBaseLib ############################
|
###################### YBaseLib ############################
|
||||||
|
|
||||||
set(YBASELIB_SRC_BASE ${CMAKE_SOURCE_DIR}/dep/YBaseLib/Source)
|
set(YBASELIB_SRC_BASE ${CMAKE_SOURCE_DIR}/dep/YBaseLib/Source)
|
||||||
set(YBASELIB_INCLUDES ${CMAKE_SOURCE_DIR}/dep/YBaseLib/Include)
|
set(YBASELIB_INCLUDES ${CMAKE_SOURCE_DIR}/dep/YBaseLib/Include)
|
||||||
set(YBASELIB_SRC_FILES
|
set(YBASELIB_SRC_FILES
|
||||||
${YBASELIB_SRC_BASE}/YBaseLib/Android
|
${YBASELIB_SRC_BASE}/YBaseLib/Android
|
||||||
|
${YBASELIB_SRC_BASE}/YBaseLib/Android/AndroidBarrier.cpp
|
||||||
${YBASELIB_SRC_BASE}/YBaseLib/Android/AndroidConditionVariable.cpp
|
${YBASELIB_SRC_BASE}/YBaseLib/Android/AndroidConditionVariable.cpp
|
||||||
${YBASELIB_SRC_BASE}/YBaseLib/Android/AndroidEvent.cpp
|
${YBASELIB_SRC_BASE}/YBaseLib/Android/AndroidEvent.cpp
|
||||||
${YBASELIB_SRC_BASE}/YBaseLib/Android/AndroidFileSystem.cpp
|
${YBASELIB_SRC_BASE}/YBaseLib/Android/AndroidFileSystem.cpp
|
||||||
|
@ -86,4 +90,8 @@ set(YBASELIB_SRC_FILES
|
||||||
add_library(YBaseLib STATIC ${YBASELIB_SRC_FILES})
|
add_library(YBaseLib STATIC ${YBASELIB_SRC_FILES})
|
||||||
target_include_directories(YBaseLib PRIVATE ${YBASELIB_INCLUDES} ${YBASELIB_SRC_BASE})
|
target_include_directories(YBaseLib PRIVATE ${YBASELIB_INCLUDES} ${YBASELIB_SRC_BASE})
|
||||||
target_include_directories(YBaseLib PUBLIC ${YBASELIB_INCLUDES})
|
target_include_directories(YBaseLib PUBLIC ${YBASELIB_INCLUDES})
|
||||||
target_link_libraries(YBaseLib Threads::Threads)
|
target_link_libraries(YBaseLib PUBLIC Threads::Threads)
|
||||||
|
|
||||||
|
if(ANDROID)
|
||||||
|
target_link_libraries(YBaseLib PRIVATE log)
|
||||||
|
endif()
|
|
@ -1 +1 @@
|
||||||
Subproject commit 9c5869b61158382ac8d4254961f33b1e9a6d2091
|
Subproject commit 7004a8b562373915bb56ea73171c4f3b43fafdea
|
|
@ -1,3 +1,6 @@
|
||||||
add_subdirectory(common)
|
add_subdirectory(common)
|
||||||
add_subdirectory(core)
|
add_subdirectory(core)
|
||||||
|
|
||||||
|
if(NOT ANDROID)
|
||||||
add_subdirectory(duckstation)
|
add_subdirectory(duckstation)
|
||||||
|
endif()
|
||||||
|
|
|
@ -20,7 +20,7 @@ public:
|
||||||
|
|
||||||
HeapArray(const this_type& copy)
|
HeapArray(const this_type& copy)
|
||||||
{
|
{
|
||||||
m_data = new T[size];
|
m_data = new T[SIZE];
|
||||||
std::copy(copy.cbegin(), copy.cend(), begin());
|
std::copy(copy.cbegin(), copy.cend(), begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -176,7 +176,7 @@ ALWAYS_INLINE constexpr bool ConvertToBool(TValue value)
|
||||||
|
|
||||||
// Unsafe integer to boolean
|
// Unsafe integer to boolean
|
||||||
template<typename TValue>
|
template<typename TValue>
|
||||||
ALWAYS_INLINE constexpr bool ConvertToBoolUnchecked(TValue value)
|
ALWAYS_INLINE bool ConvertToBoolUnchecked(TValue value)
|
||||||
{
|
{
|
||||||
// static_assert(sizeof(uint8) == sizeof(bool));
|
// static_assert(sizeof(uint8) == sizeof(bool));
|
||||||
bool ret;
|
bool ret;
|
||||||
|
|
|
@ -13,14 +13,6 @@ add_library(core
|
||||||
cpu_core.inl
|
cpu_core.inl
|
||||||
cpu_disasm.cpp
|
cpu_disasm.cpp
|
||||||
cpu_disasm.h
|
cpu_disasm.h
|
||||||
cpu_recompiler_code_generator.cpp
|
|
||||||
cpu_recompiler_code_generator.h
|
|
||||||
cpu_recompiler_code_generator_generic.cpp
|
|
||||||
cpu_recompiler_register_cache.cpp
|
|
||||||
cpu_recompiler_register_cache.h
|
|
||||||
cpu_recompiler_thunks.cpp
|
|
||||||
cpu_recompiler_thunks.h
|
|
||||||
cpu_recompiler_types.h
|
|
||||||
cpu_types.cpp
|
cpu_types.cpp
|
||||||
cpu_types.h
|
cpu_types.h
|
||||||
digital_controller.cpp
|
digital_controller.cpp
|
||||||
|
@ -66,9 +58,21 @@ add_library(core
|
||||||
types.h
|
types.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set(RECOMPILER_SRCS
|
||||||
|
cpu_recompiler_code_generator.cpp
|
||||||
|
cpu_recompiler_code_generator.h
|
||||||
|
cpu_recompiler_code_generator_generic.cpp
|
||||||
|
cpu_recompiler_register_cache.cpp
|
||||||
|
cpu_recompiler_register_cache.h
|
||||||
|
cpu_recompiler_thunks.cpp
|
||||||
|
cpu_recompiler_thunks.h
|
||||||
|
cpu_recompiler_types.h
|
||||||
|
)
|
||||||
|
|
||||||
target_include_directories(core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
target_include_directories(core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
||||||
target_include_directories(core PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
target_include_directories(core PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
||||||
target_link_libraries(core PRIVATE Threads::Threads YBaseLib common imgui glad simpleini stb)
|
target_link_libraries(core PUBLIC Threads::Threads YBaseLib common imgui)
|
||||||
|
target_link_libraries(core PRIVATE glad simpleini stb)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_sources(core PRIVATE
|
target_sources(core PRIVATE
|
||||||
|
@ -79,7 +83,10 @@ endif()
|
||||||
|
|
||||||
if(${CPU_ARCH} STREQUAL "x64")
|
if(${CPU_ARCH} STREQUAL "x64")
|
||||||
target_include_directories(core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../dep/xbyak/xbyak")
|
target_include_directories(core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../dep/xbyak/xbyak")
|
||||||
target_sources(core PRIVATE cpu_recompiler_code_generator_x64.cpp)
|
target_compile_definitions(core PRIVATE "WITH_RECOMPILER=1")
|
||||||
|
target_sources(core PRIVATE ${RECOMPILER_SRCS}
|
||||||
|
cpu_recompiler_code_generator_x64.cpp
|
||||||
|
)
|
||||||
message("Building x64 recompiler")
|
message("Building x64 recompiler")
|
||||||
else()
|
else()
|
||||||
message("Not building recompiler")
|
message("Not building recompiler")
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
class StateWrapper;
|
class StateWrapper;
|
||||||
|
|
||||||
|
|
|
@ -260,7 +260,7 @@
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<WarningLevel>Level4</WarningLevel>
|
<WarningLevel>Level4</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>ENABLE_VOODOO=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_RECOMPILER=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
@ -282,7 +282,7 @@
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<WarningLevel>Level4</WarningLevel>
|
<WarningLevel>Level4</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>ENABLE_VOODOO=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_RECOMPILER=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
@ -304,7 +304,7 @@
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<WarningLevel>Level4</WarningLevel>
|
<WarningLevel>Level4</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>ENABLE_VOODOO=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_RECOMPILER=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
@ -329,7 +329,7 @@
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<WarningLevel>Level4</WarningLevel>
|
<WarningLevel>Level4</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>ENABLE_VOODOO=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_RECOMPILER=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
@ -355,7 +355,7 @@
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>ENABLE_VOODOO=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_RECOMPILER=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
@ -378,7 +378,7 @@
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>ENABLE_VOODOO=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_RECOMPILER=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
@ -402,7 +402,7 @@
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>ENABLE_VOODOO=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_RECOMPILER=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
@ -425,7 +425,7 @@
|
||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>ENABLE_VOODOO=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WITH_RECOMPILER=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\msvc\include;$(SolutionDir)dep\YBaseLib\Include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\xbyak\xbyak;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
|
|
@ -2,11 +2,14 @@
|
||||||
#include "YBaseLib/Log.h"
|
#include "YBaseLib/Log.h"
|
||||||
#include "cpu_core.h"
|
#include "cpu_core.h"
|
||||||
#include "cpu_disasm.h"
|
#include "cpu_disasm.h"
|
||||||
#include "cpu_recompiler_code_generator.h"
|
|
||||||
#include "cpu_recompiler_thunks.h"
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
Log_SetChannel(CPU::CodeCache);
|
Log_SetChannel(CPU::CodeCache);
|
||||||
|
|
||||||
|
#ifdef WITH_RECOMPILER
|
||||||
|
#include "cpu_recompiler_code_generator.h"
|
||||||
|
#include "cpu_recompiler_thunks.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace CPU {
|
namespace CPU {
|
||||||
|
|
||||||
constexpr bool USE_BLOCK_LINKING = true;
|
constexpr bool USE_BLOCK_LINKING = true;
|
||||||
|
@ -23,11 +26,15 @@ void CodeCache::Initialize(System* system, Core* core, Bus* bus, bool use_recomp
|
||||||
m_system = system;
|
m_system = system;
|
||||||
m_core = core;
|
m_core = core;
|
||||||
m_bus = bus;
|
m_bus = bus;
|
||||||
m_use_recompiler = use_recompiler;
|
|
||||||
|
|
||||||
|
#ifdef WITH_RECOMPILER
|
||||||
|
m_use_recompiler = use_recompiler;
|
||||||
m_code_buffer = std::make_unique<JitCodeBuffer>(RECOMPILER_CODE_CACHE_SIZE, RECOMPILER_FAR_CODE_CACHE_SIZE);
|
m_code_buffer = std::make_unique<JitCodeBuffer>(RECOMPILER_CODE_CACHE_SIZE, RECOMPILER_FAR_CODE_CACHE_SIZE);
|
||||||
m_asm_functions = std::make_unique<Recompiler::ASMFunctions>();
|
m_asm_functions = std::make_unique<Recompiler::ASMFunctions>();
|
||||||
m_asm_functions->Generate(m_code_buffer.get());
|
m_asm_functions->Generate(m_code_buffer.get());
|
||||||
|
#else
|
||||||
|
m_use_recompiler = false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeCache::Execute()
|
void CodeCache::Execute()
|
||||||
|
@ -120,11 +127,13 @@ void CodeCache::Execute()
|
||||||
|
|
||||||
void CodeCache::SetUseRecompiler(bool enable)
|
void CodeCache::SetUseRecompiler(bool enable)
|
||||||
{
|
{
|
||||||
|
#ifdef WITH_RECOMPILER
|
||||||
if (m_use_recompiler == enable)
|
if (m_use_recompiler == enable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_use_recompiler = enable;
|
m_use_recompiler = enable;
|
||||||
Flush();
|
Flush();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeCache::Flush()
|
void CodeCache::Flush()
|
||||||
|
@ -134,7 +143,9 @@ void CodeCache::Flush()
|
||||||
it.clear();
|
it.clear();
|
||||||
|
|
||||||
m_blocks.clear();
|
m_blocks.clear();
|
||||||
|
#ifdef WITH_RECOMPILER
|
||||||
m_code_buffer->Reset();
|
m_code_buffer->Reset();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeCache::LogCurrentState()
|
void CodeCache::LogCurrentState()
|
||||||
|
@ -297,6 +308,7 @@ bool CodeCache::CompileBlock(CodeBlock* block)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_RECOMPILER
|
||||||
if (m_use_recompiler)
|
if (m_use_recompiler)
|
||||||
{
|
{
|
||||||
// Ensure we're not going to run out of space while compiling this block.
|
// Ensure we're not going to run out of space while compiling this block.
|
||||||
|
@ -316,6 +328,7 @@ bool CodeCache::CompileBlock(CodeBlock* block)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,69 @@ namespace Recompiler {
|
||||||
class ASMFunctions;
|
class ASMFunctions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
union CodeBlockKey
|
||||||
|
{
|
||||||
|
u32 bits;
|
||||||
|
|
||||||
|
BitField<u32, bool, 0, 1> user_mode;
|
||||||
|
BitField<u32, u32, 2, 30> aligned_pc;
|
||||||
|
|
||||||
|
ALWAYS_INLINE u32 GetPC() const { return aligned_pc << 2; }
|
||||||
|
ALWAYS_INLINE void SetPC(u32 pc) { aligned_pc = pc >> 2; }
|
||||||
|
|
||||||
|
ALWAYS_INLINE CodeBlockKey& operator=(const CodeBlockKey& rhs)
|
||||||
|
{
|
||||||
|
bits = rhs.bits;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALWAYS_INLINE bool operator==(const CodeBlockKey& rhs) const { return bits == rhs.bits; }
|
||||||
|
ALWAYS_INLINE bool operator!=(const CodeBlockKey& rhs) const { return bits != rhs.bits; }
|
||||||
|
ALWAYS_INLINE bool operator<(const CodeBlockKey& rhs) const { return bits < rhs.bits; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CodeBlockInstruction
|
||||||
|
{
|
||||||
|
Instruction instruction;
|
||||||
|
u32 pc;
|
||||||
|
|
||||||
|
bool is_branch_instruction : 1;
|
||||||
|
bool is_branch_delay_slot : 1;
|
||||||
|
bool is_load_instruction : 1;
|
||||||
|
bool is_store_instruction : 1;
|
||||||
|
bool is_load_delay_slot : 1;
|
||||||
|
bool is_last_instruction : 1;
|
||||||
|
bool has_load_delay : 1;
|
||||||
|
bool can_trap : 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CodeBlock
|
||||||
|
{
|
||||||
|
using HostCodePointer = void (*)(Core*);
|
||||||
|
|
||||||
|
CodeBlock(const CodeBlockKey key_) : key(key_) {}
|
||||||
|
|
||||||
|
CodeBlockKey key;
|
||||||
|
u32 host_code_size = 0;
|
||||||
|
HostCodePointer host_code = nullptr;
|
||||||
|
|
||||||
|
std::vector<CodeBlockInstruction> instructions;
|
||||||
|
std::vector<CodeBlock*> link_predecessors;
|
||||||
|
std::vector<CodeBlock*> link_successors;
|
||||||
|
|
||||||
|
bool invalidated = false;
|
||||||
|
|
||||||
|
const u32 GetPC() const { return key.GetPC(); }
|
||||||
|
const u32 GetSizeInBytes() const { return static_cast<u32>(instructions.size()) * sizeof(Instruction); }
|
||||||
|
const u32 GetStartPageIndex() const { return (key.GetPC() / CPU_CODE_CACHE_PAGE_SIZE); }
|
||||||
|
const u32 GetEndPageIndex() const { return ((key.GetPC() + GetSizeInBytes()) / CPU_CODE_CACHE_PAGE_SIZE); }
|
||||||
|
bool IsInRAM() const
|
||||||
|
{
|
||||||
|
// TODO: Constant
|
||||||
|
return key.GetPC() < 0x200000;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class CodeCache
|
class CodeCache
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -69,8 +132,10 @@ private:
|
||||||
Core* m_core;
|
Core* m_core;
|
||||||
Bus* m_bus;
|
Bus* m_bus;
|
||||||
|
|
||||||
|
#ifdef WITH_RECOMPILER
|
||||||
std::unique_ptr<JitCodeBuffer> m_code_buffer;
|
std::unique_ptr<JitCodeBuffer> m_code_buffer;
|
||||||
std::unique_ptr<Recompiler::ASMFunctions> m_asm_functions;
|
std::unique_ptr<Recompiler::ASMFunctions> m_asm_functions;
|
||||||
|
#endif
|
||||||
|
|
||||||
BlockMap m_blocks;
|
BlockMap m_blocks;
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include "common/jit_code_buffer.h"
|
#include "common/jit_code_buffer.h"
|
||||||
|
|
||||||
|
#include "cpu_code_cache.h"
|
||||||
#include "cpu_recompiler_register_cache.h"
|
#include "cpu_recompiler_register_cache.h"
|
||||||
#include "cpu_recompiler_thunks.h"
|
#include "cpu_recompiler_thunks.h"
|
||||||
#include "cpu_recompiler_types.h"
|
#include "cpu_recompiler_types.h"
|
||||||
|
|
|
@ -46,6 +46,7 @@ enum class Condition : u8
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(Y_CPU_X64)
|
#if defined(Y_CPU_X64)
|
||||||
|
|
||||||
using HostReg = Xbyak::Operand::Code;
|
using HostReg = Xbyak::Operand::Code;
|
||||||
using CodeEmitter = Xbyak::CodeGenerator;
|
using CodeEmitter = Xbyak::CodeGenerator;
|
||||||
enum : u32
|
enum : u32
|
||||||
|
@ -63,15 +64,22 @@ constexpr u32 MAX_FAR_HOST_BYTES_PER_INSTRUCTION = 128;
|
||||||
constexpr bool SHIFTS_ARE_IMPLICITLY_MASKED = true;
|
constexpr bool SHIFTS_ARE_IMPLICITLY_MASKED = true;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
using HostReg = void;
|
|
||||||
using CodeEmitter = void;
|
using HostReg = int;
|
||||||
|
|
||||||
|
class CodeEmitter
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
enum : u32
|
enum : u32
|
||||||
{
|
{
|
||||||
HostReg_Count = 0
|
HostReg_Count = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr HostReg HostReg_Invalid = static_cast<HostReg>(HostReg_Count);
|
constexpr HostReg HostReg_Invalid = static_cast<HostReg>(HostReg_Count);
|
||||||
constexpr OperandSize HostPointerSize = OperandSize_64;
|
constexpr RegSize HostPointerSize = RegSize_64;
|
||||||
constexpr bool SHIFTS_ARE_IMPLICITLY_MASKED = false;
|
constexpr bool SHIFTS_ARE_IMPLICITLY_MASKED = false;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace Recompiler
|
} // namespace Recompiler
|
||||||
|
|
|
@ -380,67 +380,4 @@ struct Cop0Registers
|
||||||
} dcic;
|
} dcic;
|
||||||
};
|
};
|
||||||
|
|
||||||
union CodeBlockKey
|
|
||||||
{
|
|
||||||
u32 bits;
|
|
||||||
|
|
||||||
BitField<u32, bool, 0, 1> user_mode;
|
|
||||||
BitField<u32, u32, 2, 30> aligned_pc;
|
|
||||||
|
|
||||||
ALWAYS_INLINE u32 GetPC() const { return aligned_pc << 2; }
|
|
||||||
ALWAYS_INLINE void SetPC(u32 pc) { aligned_pc = pc >> 2; }
|
|
||||||
|
|
||||||
ALWAYS_INLINE CodeBlockKey& operator=(const CodeBlockKey& rhs)
|
|
||||||
{
|
|
||||||
bits = rhs.bits;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
ALWAYS_INLINE bool operator==(const CodeBlockKey& rhs) const { return bits == rhs.bits; }
|
|
||||||
ALWAYS_INLINE bool operator!=(const CodeBlockKey& rhs) const { return bits != rhs.bits; }
|
|
||||||
ALWAYS_INLINE bool operator<(const CodeBlockKey& rhs) const { return bits < rhs.bits; }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CodeBlockInstruction
|
|
||||||
{
|
|
||||||
Instruction instruction;
|
|
||||||
u32 pc;
|
|
||||||
|
|
||||||
bool is_branch_instruction : 1;
|
|
||||||
bool is_branch_delay_slot : 1;
|
|
||||||
bool is_load_instruction : 1;
|
|
||||||
bool is_store_instruction : 1;
|
|
||||||
bool is_load_delay_slot : 1;
|
|
||||||
bool is_last_instruction : 1;
|
|
||||||
bool has_load_delay : 1;
|
|
||||||
bool can_trap : 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CodeBlock
|
|
||||||
{
|
|
||||||
using HostCodePointer = void (*)(Core*);
|
|
||||||
|
|
||||||
CodeBlock(const CodeBlockKey key_) : key(key_) {}
|
|
||||||
|
|
||||||
CodeBlockKey key;
|
|
||||||
u32 host_code_size = 0;
|
|
||||||
HostCodePointer host_code = nullptr;
|
|
||||||
|
|
||||||
std::vector<CodeBlockInstruction> instructions;
|
|
||||||
std::vector<CodeBlock*> link_predecessors;
|
|
||||||
std::vector<CodeBlock*> link_successors;
|
|
||||||
|
|
||||||
bool invalidated = false;
|
|
||||||
|
|
||||||
const u32 GetPC() const { return key.GetPC(); }
|
|
||||||
const u32 GetSizeInBytes() const { return static_cast<u32>(instructions.size()) * sizeof(Instruction); }
|
|
||||||
const u32 GetStartPageIndex() const { return (key.GetPC() / CPU_CODE_CACHE_PAGE_SIZE); }
|
|
||||||
const u32 GetEndPageIndex() const { return ((key.GetPC() + GetSizeInBytes()) / CPU_CODE_CACHE_PAGE_SIZE); }
|
|
||||||
bool IsInRAM() const
|
|
||||||
{
|
|
||||||
// TODO: Constant
|
|
||||||
return key.GetPC() < 0x200000;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace CPU
|
} // namespace CPU
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "common/bitfield.h"
|
#include "common/bitfield.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
class StateWrapper;
|
class StateWrapper;
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,33 @@ Log_SetChannel(HostInterface);
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
static std::string GetRelativePath(const std::string& path, const char* new_filename)
|
||||||
|
{
|
||||||
|
const char* last = std::strrchr(path.c_str(), '/');
|
||||||
|
if (!last)
|
||||||
|
return new_filename;
|
||||||
|
|
||||||
|
std::string new_path(path.c_str(), last - path.c_str() + 1);
|
||||||
|
new_path += new_filename;
|
||||||
|
return new_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
static std::string GetRelativePath(const std::string& path, const char* new_filename)
|
||||||
|
{
|
||||||
|
return std::filesystem::path(path).replace_filename(new_filename).string();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
HostInterface::HostInterface()
|
HostInterface::HostInterface()
|
||||||
{
|
{
|
||||||
m_settings.SetDefaults();
|
m_settings.SetDefaults();
|
||||||
|
@ -83,8 +110,6 @@ std::optional<std::vector<u8>> HostInterface::GetBIOSImage(ConsoleRegion region)
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define RELATIVE_PATH(filename) std::filesystem::path(m_settings.bios_path).replace_filename(filename).string()
|
|
||||||
|
|
||||||
// Try the configured image.
|
// Try the configured image.
|
||||||
TRY_FILENAME(m_settings.bios_path);
|
TRY_FILENAME(m_settings.bios_path);
|
||||||
|
|
||||||
|
@ -92,18 +117,18 @@ std::optional<std::vector<u8>> HostInterface::GetBIOSImage(ConsoleRegion region)
|
||||||
switch (region)
|
switch (region)
|
||||||
{
|
{
|
||||||
case ConsoleRegion::NTSC_J:
|
case ConsoleRegion::NTSC_J:
|
||||||
TRY_FILENAME(RELATIVE_PATH("scph1000.bin"));
|
TRY_FILENAME(GetRelativePath(m_settings.bios_path, "scph1000.bin"));
|
||||||
TRY_FILENAME(RELATIVE_PATH("scph5500.bin"));
|
TRY_FILENAME(GetRelativePath(m_settings.bios_path, "scph5500.bin"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ConsoleRegion::NTSC_U:
|
case ConsoleRegion::NTSC_U:
|
||||||
TRY_FILENAME(RELATIVE_PATH("scph1001.bin"));
|
TRY_FILENAME(GetRelativePath(m_settings.bios_path, "scph1001.bin"));
|
||||||
TRY_FILENAME(RELATIVE_PATH("scph5501.bin"));
|
TRY_FILENAME(GetRelativePath(m_settings.bios_path, "scph5501.bin"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ConsoleRegion::PAL:
|
case ConsoleRegion::PAL:
|
||||||
TRY_FILENAME(RELATIVE_PATH("scph1002.bin"));
|
TRY_FILENAME(GetRelativePath(m_settings.bios_path, "scph1002.bin"));
|
||||||
TRY_FILENAME(RELATIVE_PATH("scph5502.bin"));
|
TRY_FILENAME(GetRelativePath(m_settings.bios_path, "scph5502.bin"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
struct Settings
|
struct Settings
|
||||||
{
|
{
|
||||||
|
|
|
@ -1054,7 +1054,7 @@ void SPU::DrawDebugStateWindow()
|
||||||
ImGui::SameLine(offsets[2]);
|
ImGui::SameLine(offsets[2]);
|
||||||
ImGui::TextColored(m_SPUCNT.external_audio_enable ? active_color : inactive_color, "External Audio");
|
ImGui::TextColored(m_SPUCNT.external_audio_enable ? active_color : inactive_color, "External Audio");
|
||||||
ImGui::SameLine(offsets[3]);
|
ImGui::SameLine(offsets[3]);
|
||||||
ImGui::TextColored(m_SPUCNT.ram_transfer_mode != RAMTransferMode::Stopped ? active_color : inactive_color,
|
ImGui::TextColored(m_SPUCNT.ram_transfer_mode != RAMTransferMode::Stopped ? active_color : inactive_color, "%s",
|
||||||
transfer_modes[static_cast<u8>(m_SPUCNT.ram_transfer_mode.GetValue())]);
|
transfer_modes[static_cast<u8>(m_SPUCNT.ram_transfer_mode.GetValue())]);
|
||||||
|
|
||||||
ImGui::Text("Status: ");
|
ImGui::Text("Status: ");
|
||||||
|
@ -1138,7 +1138,7 @@ void SPU::DrawDebugStateWindow()
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
ImGui::TextColored(color, "%08X", v.regs.adsr.bits);
|
ImGui::TextColored(color, "%08X", v.regs.adsr.bits);
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
ImGui::TextColored(color, adsr_phases[static_cast<u8>(v.adsr_phase)]);
|
ImGui::TextColored(color, "%s", adsr_phases[static_cast<u8>(v.adsr_phase)]);
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
ImGui::TextColored(color, "%d", ZeroExtend32(v.regs.adsr_volume));
|
ImGui::TextColored(color, "%d", ZeroExtend32(v.regs.adsr_volume));
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
|
|
Loading…
Reference in New Issue