mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-29 00:59:44 -06:00
Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
2879cbd2b5 | |||
8a887a6fea | |||
d8fd449745 | |||
331db09aa4 | |||
219d45299f | |||
957f4dbdda | |||
6f2e3369b0 | |||
9b70863dd6 | |||
8c22d34f90 | |||
e137e3711e | |||
25c52b0b69 | |||
09e3b5e3ca | |||
4f36c2f7fa | |||
e19fb50ae8 | |||
76e3a6dbd5 | |||
4e43ecb28d |
@ -752,17 +752,17 @@ endif(NOT DISABLE_WX AND NOT ANDROID)
|
||||
########################################
|
||||
# Pre-build events: Define configuration variables and write SCM info header
|
||||
#
|
||||
if(DOLPHIN_WC_BRANCH STREQUAL "master")
|
||||
set(DOLPHIN_WC_IS_MASTER "1")
|
||||
if(DOLPHIN_WC_BRANCH STREQUAL "master" OR DOLPHIN_WC_BRANCH STREQUAL "stable")
|
||||
set(DOLPHIN_WC_IS_STABLE "1")
|
||||
else()
|
||||
set(DOLPHIN_WC_IS_MASTER "0")
|
||||
set(DOLPHIN_WC_IS_STABLE "0")
|
||||
endif()
|
||||
|
||||
file(WRITE ${PROJECT_BINARY_DIR}/Source/Core/Common/Src/scmrev.h
|
||||
"#define SCM_REV_STR \"" ${DOLPHIN_WC_REVISION} "\"\n"
|
||||
"#define SCM_DESC_STR \"" ${DOLPHIN_WC_DESCRIBE} "\"\n"
|
||||
"#define SCM_BRANCH_STR \"" ${DOLPHIN_WC_BRANCH} "\"\n"
|
||||
"#define SCM_IS_MASTER " ${DOLPHIN_WC_IS_MASTER} "\n"
|
||||
"#define SCM_IS_MASTER " ${DOLPHIN_WC_IS_STABLE} "\n"
|
||||
)
|
||||
include_directories("${PROJECT_BINARY_DIR}/Source/Core/Common/Src")
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
[EmuState]
|
||||
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||
EmulationStateId = 3
|
||||
EmulationIssues = Gfx glitches.
|
||||
EmulationIssues =
|
||||
|
||||
[OnLoad]
|
||||
# Add memory patches to be loaded once on boot here.
|
||||
@ -18,12 +18,12 @@ EmulationIssues = Gfx glitches.
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 1
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 0
|
||||
PH_ZNear =
|
||||
PH_ZFar = 1.99998
|
||||
PH_ZFar =
|
||||
|
||||
[Video_Settings]
|
||||
SafeTextureCacheColorSamples = 512
|
||||
|
@ -6,7 +6,7 @@
|
||||
[EmuState]
|
||||
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||
EmulationStateId = 3
|
||||
EmulationIssues = Gfx glitches.
|
||||
EmulationIssues =
|
||||
|
||||
[OnLoad]
|
||||
# Add memory patches to be loaded once on boot here.
|
||||
@ -18,12 +18,12 @@ EmulationIssues = Gfx glitches.
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 1
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 0
|
||||
PH_ZNear =
|
||||
PH_ZFar = 1.99998
|
||||
PH_ZFar =
|
||||
|
||||
[Video_Settings]
|
||||
SafeTextureCacheColorSamples = 512
|
||||
|
@ -18,7 +18,7 @@ EmulationStateId = 4
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 1
|
||||
@ -28,3 +28,5 @@ PH_ZFar =
|
||||
[Video_Settings]
|
||||
SafeTextureCacheColorSamples = 512
|
||||
|
||||
[Video_Hacks]
|
||||
EFBEmulateFormatChanges = True
|
||||
|
@ -18,7 +18,7 @@ EmulationStateId = 4
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 1
|
||||
@ -28,3 +28,5 @@ PH_ZFar =
|
||||
[Video_Settings]
|
||||
SafeTextureCacheColorSamples = 512
|
||||
|
||||
[Video_Hacks]
|
||||
EFBEmulateFormatChanges = True
|
||||
|
@ -18,7 +18,7 @@ EmulationStateId = 4
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 1
|
||||
@ -28,3 +28,5 @@ PH_ZFar =
|
||||
[Video_Settings]
|
||||
SafeTextureCacheColorSamples = 512
|
||||
|
||||
[Video_Hacks]
|
||||
EFBEmulateFormatChanges = True
|
||||
|
@ -18,13 +18,12 @@ EmulationIssues =
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
PH_SZNear = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 0
|
||||
PH_ZNear = 0. 01
|
||||
PH_ZNear =
|
||||
PH_ZFar =
|
||||
|
||||
[Video_Enhancements]
|
||||
MaxAnisotropy = 0
|
||||
|
||||
|
@ -18,11 +18,11 @@ EmulationIssues =
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
PH_SZNear = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 0
|
||||
PH_ZNear = 0. 01
|
||||
PH_ZNear =
|
||||
PH_ZFar =
|
||||
|
||||
[Video_Enhancements]
|
||||
|
@ -18,13 +18,12 @@ EmulationIssues =
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
PH_SZNear = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 0
|
||||
PH_ZNear = 0. 01
|
||||
PH_ZNear =
|
||||
PH_ZFar =
|
||||
|
||||
[Video_Enhancements]
|
||||
MaxAnisotropy = 0
|
||||
|
||||
|
@ -18,13 +18,14 @@ EmulationIssues =
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
PH_SZNear = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 0
|
||||
PH_ZNear = 0. 01
|
||||
PH_ZNear =
|
||||
PH_ZFar =
|
||||
|
||||
[Video_Enhancements]
|
||||
MaxAnisotropy = 0
|
||||
|
||||
|
||||
|
@ -18,13 +18,12 @@ EmulationIssues =
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
PH_SZNear = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 0
|
||||
PH_ZNear = 0. 01
|
||||
PH_ZNear =
|
||||
PH_ZFar =
|
||||
|
||||
[Video_Enhancements]
|
||||
MaxAnisotropy = 0
|
||||
|
||||
|
@ -18,13 +18,12 @@ EmulationIssues =
|
||||
# Add action replay cheats here.
|
||||
|
||||
[Video]
|
||||
ProjectionHack = 1
|
||||
PH_SZNear = 1
|
||||
ProjectionHack = 0
|
||||
PH_SZNear = 0
|
||||
PH_SZFar = 0
|
||||
PH_ExtraParam = 0
|
||||
PH_ZNear = 0. 01
|
||||
PH_ZNear =
|
||||
PH_ZFar =
|
||||
|
||||
[Video_Enhancements]
|
||||
MaxAnisotropy = 0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
!define PRODUCT_VERSION 4.0
|
||||
!define PRODUCT_VERSION 4.0.2
|
||||
|
||||
!define BASE_DIR "..\Binary\${DOLPHIN_ARCH}"
|
||||
|
||||
@ -26,8 +26,6 @@ SetCompressor /SOLID lzma
|
||||
|
||||
; License page
|
||||
!insertmacro MUI_PAGE_LICENSE "..\License.txt"
|
||||
; Components page
|
||||
!insertmacro MUI_PAGE_COMPONENTS
|
||||
; Directory page
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
; Instfiles page
|
||||
@ -102,7 +100,7 @@ SetCompressor /SOLID lzma
|
||||
|
||||
; MUI end ------
|
||||
|
||||
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
|
||||
Name "${PRODUCT_NAME}"
|
||||
!define UN_NAME "Uninstall $(^Name)"
|
||||
OutFile "dolphin-${DOLPHIN_ARCH}-${PRODUCT_VERSION}.exe"
|
||||
InstallDir "${BASE_INSTALL_DIR}\$(^Name)"
|
||||
@ -138,6 +136,7 @@ Section "Base" SEC01
|
||||
SectionEnd
|
||||
|
||||
Section "DirectX Runtime" SEC02
|
||||
SectionIn RO
|
||||
DetailPrint "Running DirectX runtime setup..."
|
||||
ExecWait '"$TEMP\dxredist\DXSETUP.exe" /silent'
|
||||
DetailPrint "Finished DirectX runtime setup"
|
||||
@ -158,12 +157,6 @@ Section -Post
|
||||
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
|
||||
SectionEnd
|
||||
|
||||
; Section descriptions
|
||||
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "Installs all files required to run the Dolphin Emulator."
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${SEC02} "Installs the recommended DirectX runtime libraries that are needed by Dolphin."
|
||||
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
||||
|
||||
Section Uninstall
|
||||
SetShellVarContext all
|
||||
; Only uninstall what we put there; all $INSTDIR\User is left as is
|
||||
|
BIN
Installer/dxredist/Jun2010_D3DCompiler_43_x64.cab
Normal file
BIN
Installer/dxredist/Jun2010_D3DCompiler_43_x64.cab
Normal file
Binary file not shown.
BIN
Installer/dxredist/Jun2010_D3DCompiler_43_x86.cab
Normal file
BIN
Installer/dxredist/Jun2010_D3DCompiler_43_x86.cab
Normal file
Binary file not shown.
BIN
Installer/dxredist/Jun2010_XAudio_x64.cab
Normal file
BIN
Installer/dxredist/Jun2010_XAudio_x64.cab
Normal file
Binary file not shown.
BIN
Installer/dxredist/Jun2010_XAudio_x86.cab
Normal file
BIN
Installer/dxredist/Jun2010_XAudio_x86.cab
Normal file
Binary file not shown.
BIN
Installer/dxredist/Jun2010_d3dx10_43_x64.cab
Normal file
BIN
Installer/dxredist/Jun2010_d3dx10_43_x64.cab
Normal file
Binary file not shown.
BIN
Installer/dxredist/Jun2010_d3dx10_43_x86.cab
Normal file
BIN
Installer/dxredist/Jun2010_d3dx10_43_x86.cab
Normal file
Binary file not shown.
BIN
Installer/dxredist/Jun2010_d3dx11_43_x64.cab
Normal file
BIN
Installer/dxredist/Jun2010_d3dx11_43_x64.cab
Normal file
Binary file not shown.
BIN
Installer/dxredist/Jun2010_d3dx11_43_x86.cab
Normal file
BIN
Installer/dxredist/Jun2010_d3dx11_43_x86.cab
Normal file
Binary file not shown.
BIN
Installer/dxredist/Jun2010_d3dx9_43_x64.cab
Normal file
BIN
Installer/dxredist/Jun2010_d3dx9_43_x64.cab
Normal file
Binary file not shown.
BIN
Installer/dxredist/Jun2010_d3dx9_43_x86.cab
Normal file
BIN
Installer/dxredist/Jun2010_d3dx9_43_x86.cab
Normal file
Binary file not shown.
@ -241,7 +241,11 @@ bool Rename(const std::string &srcFilename, const std::string &destFilename)
|
||||
{
|
||||
INFO_LOG(COMMON, "Rename: %s --> %s",
|
||||
srcFilename.c_str(), destFilename.c_str());
|
||||
#ifdef _WIN32
|
||||
if (_trename(UTF8ToTStr(srcFilename).c_str(), UTF8ToTStr(destFilename).c_str()) == 0)
|
||||
#else
|
||||
if (rename(srcFilename.c_str(), destFilename.c_str()) == 0)
|
||||
#endif
|
||||
return true;
|
||||
ERROR_LOG(COMMON, "Rename: failed %s --> %s: %s",
|
||||
srcFilename.c_str(), destFilename.c_str(), GetLastErrorMsg());
|
||||
|
@ -15,9 +15,9 @@ unsigned int XEmitter::ABI_GetAlignedFrameSize(unsigned int frameSize, bool noPr
|
||||
// the stack pointer is 4/8 bytes less than a multiple of 16; however, the
|
||||
// function prolog immediately subtracts an appropriate amount to align
|
||||
// it, so no alignment is required around a call.
|
||||
// In the functions generated by ThunkManager::ProtectFunction, we add the
|
||||
// necessary subtraction (and 0x20 bytes shadow space for Win64) into this
|
||||
// rather than having a separate prolog.
|
||||
// In the functions generated by ThunkManager::ProtectFunction and some
|
||||
// others, we add the necessary subtraction (and 0x20 bytes shadow space
|
||||
// for Win64) into this rather than having a separate prolog.
|
||||
// On Windows 32-bit, the required alignment is only 4 bytes, so we just
|
||||
// ensure that the frame size isn't misaligned.
|
||||
#ifdef _M_X64
|
||||
@ -142,13 +142,13 @@ void XEmitter::ABI_CallFunctionR(void *func, X64Reg reg1) {
|
||||
}
|
||||
|
||||
// Pass two registers as parameters.
|
||||
void XEmitter::ABI_CallFunctionRR(void *func, Gen::X64Reg reg1, Gen::X64Reg reg2)
|
||||
void XEmitter::ABI_CallFunctionRR(void *func, Gen::X64Reg reg1, Gen::X64Reg reg2, bool noProlog)
|
||||
{
|
||||
ABI_AlignStack(2 * 4);
|
||||
ABI_AlignStack(2 * 4, noProlog);
|
||||
PUSH(32, R(reg2));
|
||||
PUSH(32, R(reg1));
|
||||
CALL(func);
|
||||
ABI_RestoreStack(2 * 4);
|
||||
ABI_RestoreStack(2 * 4, noProlog);
|
||||
}
|
||||
|
||||
void XEmitter::ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2)
|
||||
@ -351,8 +351,8 @@ void XEmitter::ABI_CallFunctionR(void *func, X64Reg reg1) {
|
||||
}
|
||||
|
||||
// Pass two registers as parameters.
|
||||
void XEmitter::ABI_CallFunctionRR(void *func, X64Reg reg1, X64Reg reg2) {
|
||||
ABI_AlignStack(0);
|
||||
void XEmitter::ABI_CallFunctionRR(void *func, X64Reg reg1, X64Reg reg2, bool noProlog) {
|
||||
ABI_AlignStack(0, noProlog);
|
||||
if (reg2 != ABI_PARAM1) {
|
||||
if (reg1 != ABI_PARAM1)
|
||||
MOV(64, R(ABI_PARAM1), R(reg1));
|
||||
@ -373,7 +373,7 @@ void XEmitter::ABI_CallFunctionRR(void *func, X64Reg reg1, X64Reg reg2) {
|
||||
} else {
|
||||
CALL(func);
|
||||
}
|
||||
ABI_RestoreStack(0);
|
||||
ABI_RestoreStack(0, noProlog);
|
||||
}
|
||||
|
||||
void XEmitter::ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2)
|
||||
|
@ -639,7 +639,7 @@ public:
|
||||
|
||||
// Pass a register as a parameter.
|
||||
void ABI_CallFunctionR(void *func, Gen::X64Reg reg1);
|
||||
void ABI_CallFunctionRR(void *func, Gen::X64Reg reg1, Gen::X64Reg reg2);
|
||||
void ABI_CallFunctionRR(void *func, Gen::X64Reg reg1, Gen::X64Reg reg2, bool noProlog = false);
|
||||
|
||||
// A function that doesn't have any control over what it will do to regs,
|
||||
// such as the dispatcher, should be surrounded by these.
|
||||
|
@ -105,9 +105,12 @@ void *ThunkManager::ProtectFunction(void *function, int num_params)
|
||||
// trickery : we simply re-push the parameters. might not be optimal, but that doesn't really
|
||||
// matter.
|
||||
ABI_AlignStack(num_params * 4, true);
|
||||
unsigned int alignedSize = ABI_GetAlignedFrameSize(num_params * 4);
|
||||
unsigned int alignedSize = ABI_GetAlignedFrameSize(num_params * 4, true);
|
||||
for (int i = 0; i < num_params; i++) {
|
||||
// ESP is changing, so we do not need i
|
||||
// dst-arg1 dst-arg2 | dst-arg3 padding return-addr orig-arg1 | orig-arg2 orig-arg3
|
||||
// ^ ESP ^ target
|
||||
// The offset is just alignedSize (return address makes up for the
|
||||
// missing argument).
|
||||
PUSH(32, MDisp(ESP, alignedSize));
|
||||
}
|
||||
CALL(function);
|
||||
|
@ -56,7 +56,7 @@ var gitexe = GetGitExe();
|
||||
var revision = GetFirstStdOutLine(gitexe + cmd_revision);
|
||||
var describe = GetFirstStdOutLine(gitexe + cmd_describe);
|
||||
var branch = GetFirstStdOutLine(gitexe + cmd_branch);
|
||||
var isMaster = +("master" == branch);
|
||||
var isStable = +("master" == branch || "stable" == branch);
|
||||
|
||||
// remove hash (and trailing "-0" if needed) from description
|
||||
describe = describe.replace(/(-0)?-[^-]+(-dirty)?$/, '$2');
|
||||
@ -65,7 +65,7 @@ var out_contents =
|
||||
"#define SCM_REV_STR \"" + revision + "\"\n" +
|
||||
"#define SCM_DESC_STR \"" + describe + "\"\n" +
|
||||
"#define SCM_BRANCH_STR \"" + branch + "\"\n" +
|
||||
"#define SCM_IS_MASTER " + isMaster + "\n";
|
||||
"#define SCM_IS_MASTER " + isStable + "\n";
|
||||
|
||||
// check if file needs updating
|
||||
if (out_contents == GetFileContents(outfile))
|
||||
|
@ -45,8 +45,8 @@ namespace BootManager
|
||||
struct ConfigCache
|
||||
{
|
||||
bool valid, bCPUThread, bSkipIdle, bEnableFPRF, bMMU, bDCBZOFF, m_EnableJIT, bDSPThread,
|
||||
bVBeamSpeedHack, bSyncGPU, bFastDiscSpeed, bMergeBlocks, bDSPHLE, bHLE_BS2;
|
||||
int iTLBHack, iCPUCore;
|
||||
bVBeamSpeedHack, bSyncGPU, bFastDiscSpeed, bMergeBlocks, bDSPHLE, bHLE_BS2, bTLBHack;
|
||||
int iCPUCore;
|
||||
TEXIDevices m_EXIDevice[2];
|
||||
std::string strBackend;
|
||||
};
|
||||
@ -91,7 +91,7 @@ bool BootCore(const std::string& _rFilename)
|
||||
config_cache.bEnableFPRF = StartUp.bEnableFPRF;
|
||||
config_cache.bMMU = StartUp.bMMU;
|
||||
config_cache.bDCBZOFF = StartUp.bDCBZOFF;
|
||||
config_cache.iTLBHack = StartUp.iTLBHack;
|
||||
config_cache.bTLBHack = StartUp.bTLBHack;
|
||||
config_cache.bVBeamSpeedHack = StartUp.bVBeamSpeedHack;
|
||||
config_cache.bSyncGPU = StartUp.bSyncGPU;
|
||||
config_cache.bFastDiscSpeed = StartUp.bFastDiscSpeed;
|
||||
@ -109,7 +109,7 @@ bool BootCore(const std::string& _rFilename)
|
||||
game_ini.Get("Core", "SkipIdle", &StartUp.bSkipIdle, StartUp.bSkipIdle);
|
||||
game_ini.Get("Core", "EnableFPRF", &StartUp.bEnableFPRF, StartUp.bEnableFPRF);
|
||||
game_ini.Get("Core", "MMU", &StartUp.bMMU, StartUp.bMMU);
|
||||
game_ini.Get("Core", "TLBHack", &StartUp.iTLBHack, StartUp.iTLBHack);
|
||||
game_ini.Get("Core", "TLBHack", &StartUp.bTLBHack, StartUp.bTLBHack);
|
||||
game_ini.Get("Core", "DCBZ", &StartUp.bDCBZOFF, StartUp.bDCBZOFF);
|
||||
game_ini.Get("Core", "VBeam", &StartUp.bVBeamSpeedHack, StartUp.bVBeamSpeedHack);
|
||||
game_ini.Get("Core", "SyncGPU", &StartUp.bSyncGPU, StartUp.bSyncGPU);
|
||||
@ -184,7 +184,7 @@ void Stop()
|
||||
StartUp.bEnableFPRF = config_cache.bEnableFPRF;
|
||||
StartUp.bMMU = config_cache.bMMU;
|
||||
StartUp.bDCBZOFF = config_cache.bDCBZOFF;
|
||||
StartUp.iTLBHack = config_cache.iTLBHack;
|
||||
StartUp.bTLBHack = config_cache.bTLBHack;
|
||||
StartUp.bVBeamSpeedHack = config_cache.bVBeamSpeedHack;
|
||||
StartUp.bSyncGPU = config_cache.bSyncGPU;
|
||||
StartUp.bFastDiscSpeed = config_cache.bFastDiscSpeed;
|
||||
|
@ -426,7 +426,7 @@ void SConfig::LoadSettings()
|
||||
ini.Get("Core", "RunCompareServer", &m_LocalCoreStartupParameter.bRunCompareServer, false);
|
||||
ini.Get("Core", "RunCompareClient", &m_LocalCoreStartupParameter.bRunCompareClient, false);
|
||||
ini.Get("Core", "MMU", &m_LocalCoreStartupParameter.bMMU, false);
|
||||
ini.Get("Core", "TLBHack", &m_LocalCoreStartupParameter.iTLBHack, 0);
|
||||
ini.Get("Core", "TLBHack", &m_LocalCoreStartupParameter.bTLBHack, false);
|
||||
ini.Get("Core", "BBDumpPort", &m_LocalCoreStartupParameter.iBBDumpPort, -1);
|
||||
ini.Get("Core", "VBeam", &m_LocalCoreStartupParameter.bVBeamSpeedHack, false);
|
||||
ini.Get("Core", "SyncGPU", &m_LocalCoreStartupParameter.bSyncGPU, false);
|
||||
|
@ -37,7 +37,7 @@ SCoreStartupParameter::SCoreStartupParameter()
|
||||
bMergeBlocks(false), bEnableMemcardSaving(true),
|
||||
bDPL2Decoder(false), iLatency(14),
|
||||
bRunCompareServer(false), bRunCompareClient(false),
|
||||
bMMU(false), bDCBZOFF(false), iTLBHack(0), iBBDumpPort(0), bVBeamSpeedHack(false),
|
||||
bMMU(false), bDCBZOFF(false), bTLBHack(false), iBBDumpPort(0), bVBeamSpeedHack(false),
|
||||
bSyncGPU(false), bFastDiscSpeed(false),
|
||||
SelectedLanguage(0), bWii(false),
|
||||
bConfirmStop(false), bHideCursor(false),
|
||||
@ -73,7 +73,7 @@ void SCoreStartupParameter::LoadDefaults()
|
||||
bEnableFPRF = false;
|
||||
bMMU = false;
|
||||
bDCBZOFF = false;
|
||||
iTLBHack = 0;
|
||||
bTLBHack = false;
|
||||
iBBDumpPort = -1;
|
||||
bVBeamSpeedHack = false;
|
||||
bSyncGPU = false;
|
||||
|
@ -137,7 +137,7 @@ struct SCoreStartupParameter
|
||||
|
||||
bool bMMU;
|
||||
bool bDCBZOFF;
|
||||
int iTLBHack;
|
||||
bool bTLBHack;
|
||||
int iBBDumpPort;
|
||||
bool bVBeamSpeedHack;
|
||||
bool bSyncGPU;
|
||||
|
@ -19,7 +19,10 @@
|
||||
#include "../Movie.h"
|
||||
|
||||
// Disc transfer rate measured in bytes per second
|
||||
static const u32 DISC_TRANSFER_RATE_GC = 4 * 1024 * 1024;
|
||||
static const u32 DISC_TRANSFER_RATE_GC = 5 * 1024 * 1024;
|
||||
|
||||
// Disc access time measured in milliseconds
|
||||
static const u32 DISC_ACCESS_TIME_MS = 1;
|
||||
|
||||
namespace DVDInterface
|
||||
{
|
||||
@ -492,7 +495,8 @@ void Write32(const u32 _iValue, const u32 _iAddress)
|
||||
if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bFastDiscSpeed)
|
||||
{
|
||||
u64 ticksUntilTC = m_DILENGTH.Length *
|
||||
(SystemTimers::GetTicksPerSecond() / (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 1 : DISC_TRANSFER_RATE_GC));
|
||||
(SystemTimers::GetTicksPerSecond() / (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 1 : DISC_TRANSFER_RATE_GC)) +
|
||||
(SystemTimers::GetTicksPerSecond() * DISC_ACCESS_TIME_MS / 1000);
|
||||
CoreTiming::ScheduleEvent((int)ticksUntilTC, tc);
|
||||
}
|
||||
else
|
||||
|
@ -340,7 +340,7 @@ static const int num_views = sizeof(views) / sizeof(MemoryView);
|
||||
void Init()
|
||||
{
|
||||
bool wii = SConfig::GetInstance().m_LocalCoreStartupParameter.bWii;
|
||||
bFakeVMEM = SConfig::GetInstance().m_LocalCoreStartupParameter.iTLBHack == 1;
|
||||
bFakeVMEM = SConfig::GetInstance().m_LocalCoreStartupParameter.bTLBHack == true;
|
||||
bMMU = SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU;
|
||||
|
||||
u32 flags = 0;
|
||||
|
@ -328,7 +328,7 @@ u32 Read_Opcode(u32 _Address)
|
||||
}
|
||||
|
||||
if (Core::g_CoreStartupParameter.bMMU &&
|
||||
!Core::g_CoreStartupParameter.iTLBHack &&
|
||||
!Core::g_CoreStartupParameter.bTLBHack &&
|
||||
(_Address & ADDR_MASK_MEM1))
|
||||
{
|
||||
// TODO: Check for MSR instruction address translation flag before translating
|
||||
|
@ -803,20 +803,38 @@ static void BeginField(FieldType field)
|
||||
{
|
||||
u32 fbWidth = m_HorizontalStepping.FieldSteps * 16;
|
||||
u32 fbHeight = (m_HorizontalStepping.FbSteps / m_HorizontalStepping.FieldSteps) * m_VerticalTimingRegister.ACV;
|
||||
u32 xfbAddr;
|
||||
|
||||
// NTSC and PAL have opposite field orders.
|
||||
FieldType order = (m_DisplayControlRegister.FMT == 0) ? FIELD_LOWER : FIELD_UPPER;
|
||||
u32 xfbAddr = (field == order) ? GetXFBAddressBottom() : GetXFBAddressTop();
|
||||
if (m_DisplayControlRegister.FMT == 1) // PAL
|
||||
{
|
||||
// But the PAL ports of some games are poorly programmed and don't use correct ordering.
|
||||
// Zelda: Wind Waker and Simpsons Hit & Run are exampes of this, there are probally more.
|
||||
// PAL Wind Waker also runs at 30fps instead of 25.
|
||||
if(field == FieldType::FIELD_PROGRESSIVE || GetXFBAddressBottom() != (GetXFBAddressTop() - 1280))
|
||||
{
|
||||
WARN_LOG(VIDEOINTERFACE, "PAL game is trying to use incorrect (NTSC) field ordering");
|
||||
// Lets kindly fix this for them.
|
||||
xfbAddr = GetXFBAddressTop();
|
||||
|
||||
// TODO: PAL Simpsons Hit & Run now has a green line at the bottom when Real XFB is used.
|
||||
// Might be a bug later on in our code, or a bug in the actual game.
|
||||
} else {
|
||||
xfbAddr = GetXFBAddressBottom();
|
||||
}
|
||||
} else {
|
||||
xfbAddr = GetXFBAddressTop();
|
||||
}
|
||||
|
||||
static const char* const fieldTypeNames[] = { "Progressive", "Upper", "Lower" };
|
||||
|
||||
DEBUG_LOG(VIDEOINTERFACE, "(VI->BeginField): Address: %.08X | FieldSteps %u | FbSteps %u | ACV %u | Field %s",
|
||||
xfbAddr, m_HorizontalStepping.FieldSteps, m_HorizontalStepping.FbSteps, m_VerticalTimingRegister.ACV,
|
||||
fieldTypeNames[field]
|
||||
);
|
||||
DEBUG_LOG(VIDEOINTERFACE,
|
||||
"(VI->BeginField): Address: %.08X | FieldSteps %u | FbSteps %u | ACV %u | Field %s",
|
||||
xfbAddr, m_HorizontalStepping.FieldSteps,m_HorizontalStepping.FbSteps,
|
||||
m_VerticalTimingRegister.ACV, fieldTypeNames[field]);
|
||||
|
||||
if (xfbAddr)
|
||||
g_video_backend->Video_BeginField(xfbAddr, field, fbWidth, fbHeight);
|
||||
g_video_backend->Video_BeginField(xfbAddr, fbWidth, fbHeight);
|
||||
}
|
||||
|
||||
static void EndField()
|
||||
|
@ -333,8 +333,8 @@ union UVIDTVStatus
|
||||
void Write32(const u32 _uValue, const u32 _uAddress);
|
||||
|
||||
// returns a pointer to the current visible xfb
|
||||
u8* GetXFBPointerTop();
|
||||
u8* GetXFBPointerBottom();
|
||||
u32 GetXFBAddressTop();
|
||||
u32 GetXFBAddressBottom();
|
||||
|
||||
// Update and draw framebuffer
|
||||
void Update();
|
||||
|
@ -398,12 +398,12 @@ void CWII_IPC_HLE_Device_hid::FillOutDevices(u32 BufferOut, u32 BufferOutSize)
|
||||
Memory::WriteBigEData((const u8*)&wii_device, OffsetBuffer, Align(wii_device.bLength, 4));
|
||||
OffsetBuffer += Align(wii_device.bLength, 4);
|
||||
bool deviceValid = true;
|
||||
bool isHID = false;
|
||||
|
||||
for (c = 0; deviceValid && c < desc.bNumConfigurations; c++)
|
||||
{
|
||||
struct libusb_config_descriptor *config = NULL;
|
||||
int cRet = libusb_get_config_descriptor(device, c, &config);
|
||||
|
||||
// do not try to use usb devices with more than one interface, games can crash
|
||||
if(cRet == 0 && config->bNumInterfaces <= MAX_HID_INTERFACES)
|
||||
{
|
||||
@ -415,10 +415,14 @@ void CWII_IPC_HLE_Device_hid::FillOutDevices(u32 BufferOut, u32 BufferOutSize)
|
||||
for (ic = 0; ic < config->bNumInterfaces; ic++)
|
||||
{
|
||||
const struct libusb_interface *interfaceContainer = &config->interface[ic];
|
||||
|
||||
for (i = 0; i < interfaceContainer->num_altsetting; i++)
|
||||
{
|
||||
const struct libusb_interface_descriptor *interface = &interfaceContainer->altsetting[i];
|
||||
|
||||
if (interface->bInterfaceClass == LIBUSB_CLASS_HID)
|
||||
isHID = true;
|
||||
|
||||
WiiHIDInterfaceDescriptor wii_interface;
|
||||
ConvertInterfaceToWii(&wii_interface, interface);
|
||||
Memory::WriteBigEData((const u8*)&wii_interface, OffsetBuffer, Align(wii_interface.bLength, 4));
|
||||
@ -448,6 +452,12 @@ void CWII_IPC_HLE_Device_hid::FillOutDevices(u32 BufferOut, u32 BufferOutSize)
|
||||
}
|
||||
} // configs
|
||||
|
||||
if (!isHID)
|
||||
{
|
||||
deviceValid = false;
|
||||
OffsetBuffer = OffsetStart;
|
||||
}
|
||||
|
||||
if (deviceValid)
|
||||
{
|
||||
Memory::Write_U32(OffsetBuffer-OffsetStart, OffsetStart); // fill in length
|
||||
|
@ -236,14 +236,14 @@ void WiiSocket::update(bool read, bool write, bool except)
|
||||
|
||||
socklen_t addrlen = sizeof(sockaddr_in);
|
||||
int ret = (s32)accept(fd, (sockaddr*)&local_name, &addrlen);
|
||||
ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_ACCEPT", false);
|
||||
ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_ACCEPT", true);
|
||||
|
||||
WiiSockMan::Convert(local_name, *wii_name, addrlen);
|
||||
}
|
||||
else
|
||||
{
|
||||
int ret = (s32)accept(fd, NULL, 0);
|
||||
ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_ACCEPT", false);
|
||||
ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_ACCEPT", true);
|
||||
}
|
||||
|
||||
WiiSockMan::getInstance().addSocket(ReturnValue);
|
||||
@ -432,7 +432,7 @@ void WiiSocket::update(bool read, bool write, bool except)
|
||||
// send/sendto only handles MSG_OOB
|
||||
flags &= SO_MSG_OOB;
|
||||
|
||||
sockaddr_in local_name;
|
||||
sockaddr_in local_name = {0};
|
||||
if (has_destaddr)
|
||||
{
|
||||
WiiSockAddrIn* wii_name = (WiiSockAddrIn*)Memory::GetPointer(BufferIn2 + 0x0C);
|
||||
|
@ -92,9 +92,9 @@ void Jit64AsmRoutineManager::Generate()
|
||||
FixupBranch exit_vmem;
|
||||
if (Core::g_CoreStartupParameter.bWii)
|
||||
mask = JIT_ICACHE_EXRAM_BIT;
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
mask |= JIT_ICACHE_VMEM_BIT;
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
{
|
||||
TEST(32, R(EAX), Imm32(mask));
|
||||
no_mem = J_CC(CC_NZ);
|
||||
@ -106,12 +106,12 @@ void Jit64AsmRoutineManager::Generate()
|
||||
MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICache()));
|
||||
MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0));
|
||||
#endif
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
{
|
||||
exit_mem = J();
|
||||
SetJumpTarget(no_mem);
|
||||
}
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
{
|
||||
TEST(32, R(EAX), Imm32(JIT_ICACHE_VMEM_BIT));
|
||||
FixupBranch no_vmem = J_CC(CC_Z);
|
||||
@ -138,9 +138,9 @@ void Jit64AsmRoutineManager::Generate()
|
||||
#endif
|
||||
SetJumpTarget(no_exram);
|
||||
}
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
SetJumpTarget(exit_mem);
|
||||
if (Core::g_CoreStartupParameter.bWii && (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack))
|
||||
if (Core::g_CoreStartupParameter.bWii && (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack))
|
||||
SetJumpTarget(exit_vmem);
|
||||
#else
|
||||
#ifdef _M_IX86
|
||||
|
@ -164,7 +164,7 @@ void Jit64::stfd(UGeckoInstruction inst)
|
||||
|
||||
u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS;
|
||||
if (Core::g_CoreStartupParameter.bMMU ||
|
||||
Core::g_CoreStartupParameter.iTLBHack) {
|
||||
Core::g_CoreStartupParameter.bTLBHack) {
|
||||
mem_mask |= Memory::ADDR_MASK_MEM1;
|
||||
}
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
|
@ -531,7 +531,7 @@ static void regEmitMemLoad(RegInfo& RI, InstLoc I, unsigned Size) {
|
||||
}
|
||||
u32 mem_mask = 0;
|
||||
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU || SConfig::GetInstance().m_LocalCoreStartupParameter.iTLBHack)
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU || SConfig::GetInstance().m_LocalCoreStartupParameter.bTLBHack)
|
||||
mem_mask = 0x20000000;
|
||||
|
||||
RI.Jit->TEST(32, R(ECX), Imm32(0x0C000000 | mem_mask));
|
||||
@ -1352,7 +1352,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak
|
||||
// if SafeWriteRegToReg() is modified.
|
||||
u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS;
|
||||
if (Core::g_CoreStartupParameter.bMMU ||
|
||||
Core::g_CoreStartupParameter.iTLBHack) {
|
||||
Core::g_CoreStartupParameter.bTLBHack) {
|
||||
mem_mask |= Memory::ADDR_MASK_MEM1;
|
||||
}
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
|
@ -94,9 +94,9 @@ void JitILAsmRoutineManager::Generate()
|
||||
FixupBranch exit_vmem;
|
||||
if (Core::g_CoreStartupParameter.bWii)
|
||||
mask = JIT_ICACHE_EXRAM_BIT;
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
mask |= JIT_ICACHE_VMEM_BIT;
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
{
|
||||
TEST(32, R(EAX), Imm32(mask));
|
||||
no_mem = J_CC(CC_NZ);
|
||||
@ -108,12 +108,12 @@ void JitILAsmRoutineManager::Generate()
|
||||
MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICache()));
|
||||
MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0));
|
||||
#endif
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
{
|
||||
exit_mem = J();
|
||||
SetJumpTarget(no_mem);
|
||||
}
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
{
|
||||
TEST(32, R(EAX), Imm32(JIT_ICACHE_VMEM_BIT));
|
||||
FixupBranch no_vmem = J_CC(CC_Z);
|
||||
@ -140,9 +140,9 @@ void JitILAsmRoutineManager::Generate()
|
||||
#endif
|
||||
SetJumpTarget(no_exram);
|
||||
}
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
SetJumpTarget(exit_mem);
|
||||
if (Core::g_CoreStartupParameter.bWii && (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack))
|
||||
if (Core::g_CoreStartupParameter.bWii && (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack))
|
||||
SetJumpTarget(exit_vmem);
|
||||
#else
|
||||
#ifdef _M_IX86
|
||||
|
@ -167,7 +167,7 @@ void CommonAsmRoutines::GenQuantizedStores() {
|
||||
MOV(64, MComplex(RBX, RCX, SCALE_1, 0), R(RAX));
|
||||
FixupBranch skip_complex = J();
|
||||
SetJumpTarget(too_complex);
|
||||
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&WriteDual32, 2), RAX, RCX);
|
||||
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&WriteDual32, 2), RAX, RCX, /* noProlog = */ true);
|
||||
SetJumpTarget(skip_complex);
|
||||
RET();
|
||||
#else
|
||||
@ -184,10 +184,10 @@ void CommonAsmRoutines::GenQuantizedStores() {
|
||||
FixupBranch arg2 = J();
|
||||
SetJumpTarget(argh);
|
||||
MOV(32, R(EAX), M(((char*)&psTemp)));
|
||||
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U32, 2), EAX, ECX);
|
||||
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U32, 2), EAX, ECX, /* noProlog = */ true);
|
||||
MOV(32, R(EAX), M(((char*)&psTemp)+4));
|
||||
ADD(32, R(ECX), Imm32(4));
|
||||
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U32, 2), EAX, ECX);
|
||||
ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U32, 2), EAX, ECX, /* noProlog = */ true);
|
||||
SetJumpTarget(arg2);
|
||||
RET();
|
||||
#endif
|
||||
@ -206,7 +206,7 @@ void CommonAsmRoutines::GenQuantizedStores() {
|
||||
PACKSSDW(XMM0, R(XMM0));
|
||||
PACKUSWB(XMM0, R(XMM0));
|
||||
MOVD_xmm(R(EAX), XMM0);
|
||||
SafeWriteRegToReg(AX, ECX, 16, 0, false);
|
||||
SafeWriteRegToReg(AX, ECX, 16, 0, false, true);
|
||||
|
||||
RET();
|
||||
|
||||
@ -225,7 +225,7 @@ void CommonAsmRoutines::GenQuantizedStores() {
|
||||
PACKSSWB(XMM0, R(XMM0));
|
||||
MOVD_xmm(R(EAX), XMM0);
|
||||
|
||||
SafeWriteRegToReg(AX, ECX, 16, 0, false);
|
||||
SafeWriteRegToReg(AX, ECX, 16, 0, false, true);
|
||||
|
||||
RET();
|
||||
|
||||
@ -251,7 +251,7 @@ void CommonAsmRoutines::GenQuantizedStores() {
|
||||
MOV(16, R(AX), M((char*)psTemp + 4));
|
||||
|
||||
BSWAP(32, EAX);
|
||||
SafeWriteRegToReg(EAX, ECX, 32, 0, false);
|
||||
SafeWriteRegToReg(EAX, ECX, 32, 0, false, true);
|
||||
|
||||
RET();
|
||||
|
||||
@ -271,7 +271,7 @@ void CommonAsmRoutines::GenQuantizedStores() {
|
||||
MOVD_xmm(R(EAX), XMM0);
|
||||
BSWAP(32, EAX);
|
||||
ROL(32, R(EAX), Imm8(16));
|
||||
SafeWriteRegToReg(EAX, ECX, 32, 0, false);
|
||||
SafeWriteRegToReg(EAX, ECX, 32, 0, false, true);
|
||||
|
||||
RET();
|
||||
|
||||
@ -303,11 +303,11 @@ void CommonAsmRoutines::GenQuantizedSingleStores() {
|
||||
// TODO: SafeWriteFloat
|
||||
MOVSS(M(&psTemp[0]), XMM0);
|
||||
MOV(32, R(EAX), M(&psTemp[0]));
|
||||
SafeWriteRegToReg(EAX, ECX, 32, 0, false);
|
||||
SafeWriteRegToReg(EAX, ECX, 32, 0, false, true);
|
||||
} else {
|
||||
MOVSS(M(&psTemp[0]), XMM0);
|
||||
MOV(32, R(EAX), M(&psTemp[0]));
|
||||
SafeWriteRegToReg(EAX, ECX, 32, 0, true);
|
||||
SafeWriteRegToReg(EAX, ECX, 32, 0, true, true);
|
||||
}*/
|
||||
|
||||
const u8* storeSingleU8 = AlignCode4(); // Used by MKWii
|
||||
@ -318,7 +318,7 @@ void CommonAsmRoutines::GenQuantizedSingleStores() {
|
||||
MAXSS(XMM0, R(XMM1));
|
||||
MINSS(XMM0, M((void *)&m_255));
|
||||
CVTTSS2SI(EAX, R(XMM0));
|
||||
SafeWriteRegToReg(AL, ECX, 8, 0, true);
|
||||
SafeWriteRegToReg(AL, ECX, 8, 0, true, true);
|
||||
RET();
|
||||
|
||||
const u8* storeSingleS8 = AlignCode4();
|
||||
@ -328,7 +328,7 @@ void CommonAsmRoutines::GenQuantizedSingleStores() {
|
||||
MAXSS(XMM0, M((void *)&m_m128));
|
||||
MINSS(XMM0, M((void *)&m_127));
|
||||
CVTTSS2SI(EAX, R(XMM0));
|
||||
SafeWriteRegToReg(AL, ECX, 8, 0, true);
|
||||
SafeWriteRegToReg(AL, ECX, 8, 0, true, true);
|
||||
RET();
|
||||
|
||||
const u8* storeSingleU16 = AlignCode4(); // Used by MKWii
|
||||
@ -339,7 +339,7 @@ void CommonAsmRoutines::GenQuantizedSingleStores() {
|
||||
MAXSS(XMM0, R(XMM1));
|
||||
MINSS(XMM0, M((void *)&m_65535));
|
||||
CVTTSS2SI(EAX, R(XMM0));
|
||||
SafeWriteRegToReg(EAX, ECX, 16, 0, true);
|
||||
SafeWriteRegToReg(EAX, ECX, 16, 0, true, true);
|
||||
RET();
|
||||
|
||||
const u8* storeSingleS16 = AlignCode4();
|
||||
@ -349,7 +349,7 @@ void CommonAsmRoutines::GenQuantizedSingleStores() {
|
||||
MAXSS(XMM0, M((void *)&m_m32768));
|
||||
MINSS(XMM0, M((void *)&m_32767));
|
||||
CVTTSS2SI(EAX, R(XMM0));
|
||||
SafeWriteRegToReg(EAX, ECX, 16, 0, true);
|
||||
SafeWriteRegToReg(EAX, ECX, 16, 0, true, true);
|
||||
RET();
|
||||
|
||||
singleStoreQuantized = reinterpret_cast<const u8**>(const_cast<u8*>(AlignCode16()));
|
||||
|
@ -122,7 +122,7 @@ void EmuCodeBlock::SafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, s
|
||||
#endif
|
||||
{
|
||||
u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS;
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
{
|
||||
mem_mask |= Memory::ADDR_MASK_MEM1;
|
||||
}
|
||||
@ -223,14 +223,14 @@ void EmuCodeBlock::UnsafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int ac
|
||||
}
|
||||
|
||||
// Destroys both arg registers
|
||||
void EmuCodeBlock::SafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int accessSize, s32 offset, bool swap)
|
||||
void EmuCodeBlock::SafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int accessSize, s32 offset, bool swap, bool noProlog)
|
||||
{
|
||||
if (offset)
|
||||
ADD(32, R(reg_addr), Imm32((u32)offset));
|
||||
|
||||
u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS;
|
||||
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
{
|
||||
mem_mask |= Memory::ADDR_MASK_MEM1;
|
||||
}
|
||||
@ -247,9 +247,9 @@ void EmuCodeBlock::SafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int acce
|
||||
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
|
||||
switch (accessSize)
|
||||
{
|
||||
case 32: ABI_CallFunctionRR(thunks.ProtectFunction(swap ? ((void *)&Memory::Write_U32) : ((void *)&Memory::Write_U32_Swap), 2), reg_value, reg_addr); break;
|
||||
case 16: ABI_CallFunctionRR(thunks.ProtectFunction(swap ? ((void *)&Memory::Write_U16) : ((void *)&Memory::Write_U16_Swap), 2), reg_value, reg_addr); break;
|
||||
case 8: ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U8, 2), reg_value, reg_addr); break;
|
||||
case 32: ABI_CallFunctionRR(thunks.ProtectFunction(swap ? ((void *)&Memory::Write_U32) : ((void *)&Memory::Write_U32_Swap), 2), reg_value, reg_addr, noProlog); break;
|
||||
case 16: ABI_CallFunctionRR(thunks.ProtectFunction(swap ? ((void *)&Memory::Write_U16) : ((void *)&Memory::Write_U16_Swap), 2), reg_value, reg_addr, noProlog); break;
|
||||
case 8: ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U8, 2), reg_value, reg_addr, noProlog); break;
|
||||
}
|
||||
FixupBranch exit = J();
|
||||
SetJumpTarget(fast);
|
||||
@ -263,7 +263,7 @@ void EmuCodeBlock::SafeWriteFloatToReg(X64Reg xmm_value, X64Reg reg_addr)
|
||||
// This path should be faster but for some reason it causes errors so I've disabled it.
|
||||
u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS;
|
||||
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)
|
||||
if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)
|
||||
mem_mask |= Memory::ADDR_MASK_MEM1;
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
void UnsafeWriteRegToReg(Gen::X64Reg reg_value, Gen::X64Reg reg_addr, int accessSize, s32 offset = 0, bool swap = true);
|
||||
void UnsafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, s32 offset, bool signExtend);
|
||||
void SafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, s32 offset, bool signExtend);
|
||||
void SafeWriteRegToReg(Gen::X64Reg reg_value, Gen::X64Reg reg_addr, int accessSize, s32 offset, bool swap = true);
|
||||
void SafeWriteRegToReg(Gen::X64Reg reg_value, Gen::X64Reg reg_addr, int accessSize, s32 offset, bool swap = true, bool noProlog = false);
|
||||
|
||||
// Trashes both inputs and EAX.
|
||||
void SafeWriteFloatToReg(Gen::X64Reg xmm_value, Gen::X64Reg reg_addr);
|
||||
|
@ -40,7 +40,7 @@ namespace JitInterface
|
||||
}
|
||||
CPUCoreBase *InitJitCore(int core)
|
||||
{
|
||||
bFakeVMEM = SConfig::GetInstance().m_LocalCoreStartupParameter.iTLBHack == 1;
|
||||
bFakeVMEM = SConfig::GetInstance().m_LocalCoreStartupParameter.bTLBHack == true;
|
||||
bMMU = SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU;
|
||||
|
||||
CPUCoreBase *ptr = NULL;
|
||||
|
@ -1076,8 +1076,14 @@ void CConfigMain::ChooseMemcardPath(std::string& strMemcard, bool isSlotA)
|
||||
#ifdef _WIN32
|
||||
if (!strncmp(File::GetExeDirectory().c_str(), filename.c_str(), File::GetExeDirectory().size()))
|
||||
{
|
||||
filename.erase(0, File::GetExeDirectory().size() +1);
|
||||
filename = "./" + filename;
|
||||
// If the Exe Directory Matches the prefix of the filename, we still need to verify
|
||||
// that the next character is a directory separator character, otherwise we may create an invalid path
|
||||
char next_char = filename.at(File::GetExeDirectory().size())+1;
|
||||
if (next_char == '/' || next_char == '\\')
|
||||
{
|
||||
filename.erase(0, File::GetExeDirectory().size() +1);
|
||||
filename = "./" + filename;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -87,7 +87,7 @@ CMemoryWindow::CMemoryWindow(wxWindow* parent, wxWindowID id,
|
||||
sizerRight->Add(new wxButton(this, IDM_DUMP_MEMORY, _("&Dump MRAM")));
|
||||
sizerRight->Add(new wxButton(this, IDM_DUMP_MEM2, _("&Dump EXRAM")));
|
||||
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.iTLBHack == 1)
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bTLBHack == true)
|
||||
sizerRight->Add(new wxButton(this, IDM_DUMP_FAKEVMEM, _("&Dump FakeVMEM")));
|
||||
|
||||
wxStaticBoxSizer* sizerSearchType = new wxStaticBoxSizer(wxVERTICAL, this, _("Search"));
|
||||
|
@ -106,6 +106,38 @@ LONG WINAPI MyUnhandledExceptionFilter(LPEXCEPTION_POINTERS e) {
|
||||
//LeaveCriticalSection(&g_uefcs);
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
// Invalid version detection.
|
||||
bool IsInvalidVersion()
|
||||
{
|
||||
// Everything is valid when you're a fraudster.
|
||||
if (File::Exists("C:\\Users\\lian"))
|
||||
return false;
|
||||
|
||||
std::string contents;
|
||||
if (!File::ReadFileToString(false, (File::GetExeDirectory() + "/Dolphin.exe").c_str(), contents))
|
||||
return false;
|
||||
|
||||
size_t offset = 0;
|
||||
while ((offset = contents.find("C:\\Users\\lian", offset + 1)) != std::string::npos)
|
||||
{
|
||||
size_t string_end = contents.find_first_of('\0', offset);
|
||||
std::string that_string = contents.substr(offset, string_end - offset);
|
||||
|
||||
if (that_string.substr(that_string.size() - 3, 3) == "pdb")
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Timebomb only active from 2014-Jan-01.
|
||||
bool IsTimebombActive()
|
||||
{
|
||||
SYSTEMTIME t;
|
||||
GetSystemTime(&t);
|
||||
return (t.wYear >= 2014);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool DolphinApp::Initialize(int& c, wxChar **v)
|
||||
@ -302,14 +334,13 @@ bool DolphinApp::OnInit()
|
||||
int h = SConfig::GetInstance().m_LocalCoreStartupParameter.iHeight;
|
||||
|
||||
#ifdef _WIN32
|
||||
if (File::Exists("www.dolphin-emulator.com.txt"))
|
||||
if (IsTimebombActive() && IsInvalidVersion())
|
||||
{
|
||||
File::Delete("www.dolphin-emulator.com.txt");
|
||||
MessageBox(NULL,
|
||||
L"This version of Dolphin was downloaded from a website stealing money from developers of the emulator. Please "
|
||||
L"download Dolphin from the official website instead: http://dolphin-emu.org/",
|
||||
L"download Dolphin from the official website instead: https://dolphin-emu.org/",
|
||||
L"Unofficial version detected", MB_OK | MB_ICONWARNING);
|
||||
ShellExecute(NULL, L"open", L"http://dolphin-emu.org/?ref=badver", NULL, NULL, SW_SHOWDEFAULT);
|
||||
ShellExecute(NULL, L"open", L"https://dolphin-emu.org/?ref=badver", NULL, NULL, SW_SHOWDEFAULT);
|
||||
exit(0);
|
||||
}
|
||||
#endif
|
||||
|
@ -24,11 +24,13 @@ void Launch(const char *filename)
|
||||
void Explore(const char *path)
|
||||
{
|
||||
wxString wxPath = StrToWxStr(path);
|
||||
#ifndef _WIN32
|
||||
// Default to file
|
||||
if (! wxPath.Contains(wxT("://")))
|
||||
{
|
||||
wxPath = wxT("file://") + wxPath;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __WXGTK__
|
||||
wxPath.Replace(wxT(" "), wxT("\\ "));
|
||||
|
@ -28,7 +28,6 @@ static volatile bool s_perf_query_requested;
|
||||
static volatile struct
|
||||
{
|
||||
u32 xfbAddr;
|
||||
FieldType field;
|
||||
u32 fbWidth;
|
||||
u32 fbHeight;
|
||||
} s_beginFieldArgs;
|
||||
@ -73,7 +72,7 @@ void VideoFifo_CheckSwapRequest()
|
||||
if (Common::AtomicLoadAcquire(s_swapRequested))
|
||||
{
|
||||
EFBRectangle rc;
|
||||
g_renderer->Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.field, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight,rc);
|
||||
g_renderer->Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight,rc);
|
||||
Common::AtomicStoreRelease(s_swapRequested, false);
|
||||
}
|
||||
}
|
||||
@ -98,14 +97,13 @@ void VideoFifo_CheckSwapRequestAt(u32 xfbAddr, u32 fbWidth, u32 fbHeight)
|
||||
}
|
||||
|
||||
// Run from the CPU thread (from VideoInterface.cpp)
|
||||
void VideoBackendHardware::Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
|
||||
void VideoBackendHardware::Video_BeginField(u32 xfbAddr, u32 fbWidth, u32 fbHeight)
|
||||
{
|
||||
if (s_BackendInitialized && g_ActiveConfig.bUseXFB)
|
||||
{
|
||||
if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bCPUThread)
|
||||
VideoFifo_CheckSwapRequest();
|
||||
s_beginFieldArgs.xfbAddr = xfbAddr;
|
||||
s_beginFieldArgs.field = field;
|
||||
s_beginFieldArgs.fbWidth = fbWidth;
|
||||
s_beginFieldArgs.fbHeight = fbHeight;
|
||||
}
|
||||
|
@ -120,9 +120,7 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect
|
||||
}
|
||||
else
|
||||
{
|
||||
// XXX: Without the VI, how would we know what kind of field this is? So
|
||||
// just use progressive.
|
||||
g_renderer->Swap(xfbAddr, FIELD_PROGRESSIVE, fbWidth, fbHeight,sourceRc,Gamma);
|
||||
g_renderer->Swap(xfbAddr, fbWidth, fbHeight,sourceRc,Gamma);
|
||||
Common::AtomicStoreRelease(s_swapRequested, false);
|
||||
}
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ public:
|
||||
virtual void RestoreAPIState() = 0;
|
||||
|
||||
// Finish up the current frame, print some stats
|
||||
virtual void Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0;
|
||||
virtual void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0;
|
||||
|
||||
virtual void UpdateViewport(Matrix44& vpCorrection) = 0;
|
||||
|
||||
|
@ -93,7 +93,7 @@ public:
|
||||
virtual void Video_ExitLoop() = 0;
|
||||
virtual void Video_Cleanup() = 0; // called from gl/d3d thread
|
||||
|
||||
virtual void Video_BeginField(u32, FieldType, u32, u32) = 0;
|
||||
virtual void Video_BeginField(u32, u32, u32) = 0;
|
||||
virtual void Video_EndField() = 0;
|
||||
|
||||
virtual u32 Video_AccessEFB(EFBAccessType, u32, u32, u32) = 0;
|
||||
@ -145,7 +145,7 @@ class VideoBackendHardware : public VideoBackend
|
||||
|
||||
void Video_EnterLoop();
|
||||
void Video_ExitLoop();
|
||||
void Video_BeginField(u32, FieldType, u32, u32);
|
||||
void Video_BeginField(u32, u32, u32);
|
||||
void Video_EndField();
|
||||
|
||||
u32 Video_AccessEFB(EFBAccessType, u32, u32, u32);
|
||||
|
@ -776,7 +776,7 @@ void formatBufferDump(const u8* in, u8* out, int w, int h, int p)
|
||||
}
|
||||
|
||||
// This function has the final picture. We adjust the aspect ratio here.
|
||||
void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
|
||||
void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
|
||||
{
|
||||
if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight)
|
||||
{
|
||||
@ -787,7 +787,6 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons
|
||||
return;
|
||||
}
|
||||
|
||||
if (field == FIELD_LOWER) xfbAddr -= fbWidth * 2;
|
||||
u32 xfbCount = 0;
|
||||
const XFBSourceBase* const* xfbSourceList = FramebufferManager::GetXFBSource(xfbAddr, fbWidth, fbHeight, xfbCount);
|
||||
if ((!xfbSourceList || xfbCount == 0) && g_ActiveConfig.bUseXFB && !g_ActiveConfig.bUseRealXFB)
|
||||
|
@ -40,7 +40,7 @@ public:
|
||||
|
||||
TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc);
|
||||
|
||||
void Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma);
|
||||
void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma);
|
||||
|
||||
void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z);
|
||||
|
||||
|
@ -748,7 +748,7 @@ bool Renderer::SaveScreenshot(const std::string &filename, const TargetRectangle
|
||||
}
|
||||
|
||||
// This function has the final picture. We adjust the aspect ratio here.
|
||||
void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
|
||||
void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
|
||||
{
|
||||
if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight)
|
||||
{
|
||||
@ -759,7 +759,6 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons
|
||||
return;
|
||||
}
|
||||
|
||||
if (field == FIELD_LOWER) xfbAddr -= fbWidth * 2;
|
||||
u32 xfbCount = 0;
|
||||
const XFBSourceBase* const* xfbSourceList = FramebufferManager::GetXFBSource(xfbAddr, fbWidth, fbHeight, xfbCount);
|
||||
if ((!xfbSourceList || xfbCount == 0) && g_ActiveConfig.bUseXFB && !g_ActiveConfig.bUseRealXFB)
|
||||
|
@ -36,7 +36,7 @@ public:
|
||||
|
||||
TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc);
|
||||
|
||||
void Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma);
|
||||
void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma);
|
||||
|
||||
void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z);
|
||||
|
||||
|
@ -1289,7 +1289,7 @@ void DumpFrame(const std::vector<u8>& data, int w, int h)
|
||||
}
|
||||
|
||||
// This function has the final picture. We adjust the aspect ratio here.
|
||||
void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
|
||||
void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
|
||||
{
|
||||
static int w = 0, h = 0;
|
||||
if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight)
|
||||
@ -1299,7 +1299,6 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons
|
||||
return;
|
||||
}
|
||||
|
||||
if (field == FIELD_LOWER) xfbAddr -= fbWidth * 2;
|
||||
u32 xfbCount = 0;
|
||||
const XFBSourceBase* const* xfbSourceList = FramebufferManager::GetXFBSource(xfbAddr, fbWidth, fbHeight, xfbCount);
|
||||
if (g_ActiveConfig.VirtualXFBEnabled() && (!xfbSourceList || xfbCount == 0))
|
||||
|
@ -71,7 +71,7 @@ public:
|
||||
|
||||
TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc);
|
||||
|
||||
void Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma);
|
||||
void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma);
|
||||
|
||||
void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z);
|
||||
|
||||
|
@ -187,7 +187,7 @@ void VideoSoftware::Video_Prepare()
|
||||
}
|
||||
|
||||
// Run from the CPU thread (from VideoInterface.cpp)
|
||||
void VideoSoftware::Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
|
||||
void VideoSoftware::Video_BeginField(u32 xfbAddr, u32 fbWidth, u32 fbHeight)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,7 @@ class VideoSoftware : public VideoBackend
|
||||
|
||||
void Video_EnterLoop();
|
||||
void Video_ExitLoop();
|
||||
void Video_BeginField(u32, FieldType, u32, u32);
|
||||
void Video_BeginField(u32, u32, u32);
|
||||
void Video_EndField();
|
||||
|
||||
u32 Video_AccessEFB(EFBAccessType, u32, u32, u32);
|
||||
|
@ -6,6 +6,16 @@
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Platform)'=='Win32'">
|
||||
<IncludePath>$(DXSDK_DIR)Include;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(DXSDK_DIR)Lib\x86;$(LibraryPath)</LibraryPath>
|
||||
<ExecutablePath>$(DXSDK_DIR)Utilities\Bin\x86;$(ExecutablePath)</ExecutablePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Platform)'=='x64'">
|
||||
<IncludePath>$(DXSDK_DIR)Include;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(DXSDK_DIR)Lib\x64;$(LibraryPath)</LibraryPath>
|
||||
<ExecutablePath>$(DXSDK_DIR)Utilities\Bin\x64;$(ExecutablePath)</ExecutablePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;USE_UPNP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
|
Reference in New Issue
Block a user