From 3fdb50b0ea9fb84ae9206bb98816251e8c5e962f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Sun, 16 Feb 2014 02:51:04 +0100 Subject: [PATCH 1/7] Some sceNpTrophy syscalls and few fixes * Restored deleted functions in FuncList.cpp * Fixed bugs in TRPLoader. * Implemented some sceNpTrophy syscalls. * Added sceNp headers (required for sceNpTrophy). * Updated .gitignore to ignore trophies. NOTE: Thanks to the new sceNpTrophy syscalls, RPCS3 can install the trophy contents in dev_hdd0/home/00000001/trophy/. Remember this is still on an experimental stage. --- .gitignore | 3 + rpcs3/Emu/SysCalls/FuncList.cpp | 5 + rpcs3/Emu/SysCalls/Modules/sceNp.cpp | 12 + rpcs3/Emu/SysCalls/Modules/sceNp.h | 26 ++ rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp | 286 +++++++++++++++++++++ rpcs3/Loader/TRP.cpp | 8 +- rpcs3/Loader/TRP.h | 24 +- rpcs3/rpcs3.vcxproj | 1 + rpcs3/rpcs3.vcxproj.filters | 3 + 9 files changed, 352 insertions(+), 16 deletions(-) create mode 100644 rpcs3/Emu/SysCalls/Modules/sceNp.cpp create mode 100644 rpcs3/Emu/SysCalls/Modules/sceNp.h create mode 100644 rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp diff --git a/.gitignore b/.gitignore index 274d7b4459..6e0001f131 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,6 @@ rpcs3/git-version.h !/bin/dev_hdd0/game/ /bin/dev_hdd0/game/* !/bin/dev_hdd0/game/TEST12345/ + +# Ignore other system generated files +bin/dev_hdd0/home/00000001/trophy diff --git a/rpcs3/Emu/SysCalls/FuncList.cpp b/rpcs3/Emu/SysCalls/FuncList.cpp index 4828964090..8ab729dd9c 100644 --- a/rpcs3/Emu/SysCalls/FuncList.cpp +++ b/rpcs3/Emu/SysCalls/FuncList.cpp @@ -1592,6 +1592,7 @@ s64 SysCalls::DoFunc(const u32 id) case 0x1d99c3ee: FUNC_LOG_ERROR("TODO: cellOskDialogGetInputText"); case 0x1dfbfdd6: FUNC_LOG_ERROR("TODO: cellSaveDataListLoad2"); case 0x1dfcce99: FUNC_LOG_ERROR("TODO: cellSysutilGameDataExit"); + case 0x1e7bff94: FUNC_LOG_ERROR("TODO: cellSysCacheMount"); case 0x1e930eef: FUNC_LOG_ERROR("TODO: cellVideoOutGetDeviceInfo"); case 0x1f6629e4: FUNC_LOG_ERROR("TODO: cellWebBrowserConfigSetErrorHook2"); case 0x20543730: FUNC_LOG_ERROR("TODO: cellMsgDialogClose"); @@ -1646,6 +1647,7 @@ s64 SysCalls::DoFunc(const u32 id) case 0x6dfff31d: FUNC_LOG_ERROR("TODO: cellWebBrowserSetSystemCallbackUsrdata"); case 0x6e7264ed: FUNC_LOG_ERROR("TODO: cellSaveDataUserFixedLoad"); case 0x71acb8d3: FUNC_LOG_ERROR("TODO: cellSysutilAvcSetVideoMuting"); + case 0x744c1544: FUNC_LOG_ERROR("TODO: cellSysCacheClear"); case 0x749c9b5f: FUNC_LOG_ERROR("TODO: cellWebBrowserInitialize"); case 0x75bbb672: FUNC_LOG_ERROR("TODO: cellVideoOutGetNumberOfDevice"); case 0x7603d3db: FUNC_LOG_ERROR("TODO: cellMsgDialogOpen2"); @@ -2456,6 +2458,7 @@ s64 SysCalls::DoFunc(const u32 id) case 0x0e2939e5: FUNC_LOG_ERROR("TODO: cellFsFtruncate"); case 0x103b8632: FUNC_LOG_ERROR("TODO: cellFsAllocateFileAreaWithInitialData"); case 0x190912f6: FUNC_LOG_ERROR("TODO: cellFsStReadGetCurrentAddr"); + case 0x1a108ab7: FUNC_LOG_ERROR("TODO: cellFsGetBlockSize"); case 0x1ea02e2f: FUNC_LOG_ERROR("TODO: cellFsArcadeHddSerialNumber"); case 0x2664c8ae: FUNC_LOG_ERROR("TODO: cellFsStReadInit"); case 0x27800c6b: FUNC_LOG_ERROR("TODO: cellFsStRead"); @@ -3759,6 +3762,7 @@ s64 SysCalls::DoFunc(const u32 id) case 0x5fdfb2fe: FUNC_LOG_ERROR("TODO: _sys_spu_printf_detach_group"); case 0x608212fc: FUNC_LOG_ERROR("TODO: sys_mempool_free_block"); case 0x620e35a7: FUNC_LOG_ERROR("TODO: sys_game_get_system_sw_version"); + case 0x67f9fedb: FUNC_LOG_ERROR("TODO: sys_game_process_exitspawn2"); case 0x68b9b011: FUNC_LOG_ERROR("TODO: _sys_memset"); case 0x6bf66ea7: FUNC_LOG_ERROR("TODO: _sys_memcpy"); case 0x6e05231d: FUNC_LOG_ERROR("TODO: sys_game_watchdog_stop"); @@ -3834,6 +3838,7 @@ s64 SysCalls::DoFunc(const u32 id) case 0xf7f7fb20: FUNC_LOG_ERROR("TODO: _sys_free"); case 0xfa7f693d: FUNC_LOG_ERROR("TODO: _sys_vprintf"); case 0xfb5db080: FUNC_LOG_ERROR("TODO: _sys_memcmp"); + case 0xfc52a7a9: FUNC_LOG_ERROR("TODO: sys_game_process_exitspawn"); } ConLog.Error("Unknown func id: 0x%08x", id); diff --git a/rpcs3/Emu/SysCalls/Modules/sceNp.cpp b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp new file mode 100644 index 0000000000..7d019f813b --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" +#include "Emu/SysCalls/SysCalls.h" +#include "Emu/SysCalls/SC_FUNC.h" + +#include "sceNp.h" + +void sceNp_init(); +Module sceNp(0x0016, sceNpTrophy_init); + +void sceNpTrophy_init() +{ +} diff --git a/rpcs3/Emu/SysCalls/Modules/sceNp.h b/rpcs3/Emu/SysCalls/Modules/sceNp.h new file mode 100644 index 0000000000..b140316963 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/sceNp.h @@ -0,0 +1,26 @@ +#pragma once + +// Return Codes +enum +{ +}; + +enum +{ + SCE_NP_COMMUNICATION_SIGNATURE_SIZE = 160, + SCE_NET_NP_COMMUNICATION_PASSPHRASE_SIZE = 128, +}; + +// Structs +struct SceNpCommunicationId +{ + char data[9]; + char term; + u8 num; + char dummy; +}; + +struct SceNpCommunicationSignature +{ + uint8_t data[SCE_NP_COMMUNICATION_SIGNATURE_SIZE]; +}; diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp new file mode 100644 index 0000000000..c69c716a59 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -0,0 +1,286 @@ +#include "stdafx.h" +#include "Emu/SysCalls/SysCalls.h" +#include "Emu/SysCalls/SC_FUNC.h" + +#include "sceNp.h" +#include "Loader/TRP.h" + +void sceNpTrophy_unload(); +void sceNpTrophy_init(); +Module sceNpTrophy(0xf035, sceNpTrophy_init, nullptr, sceNpTrophy_unload); + +enum +{ + SCE_NP_TROPHY_ERROR_ALREADY_INITIALIZED = 0x80022901, + SCE_NP_TROPHY_ERROR_NOT_INITIALIZED = 0x80022902, + SCE_NP_TROPHY_ERROR_NOT_SUPPORTED = 0x80022903, + SCE_NP_TROPHY_ERROR_CONTEXT_NOT_REGISTERED = 0x80022904, + SCE_NP_TROPHY_ERROR_OUT_OF_MEMORY = 0x80022905, + SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT = 0x80022906, + SCE_NP_TROPHY_ERROR_EXCEEDS_MAX = 0x80022907, + SCE_NP_TROPHY_ERROR_INSUFFICIENT = 0x80022909, + SCE_NP_TROPHY_ERROR_UNKNOWN_CONTEXT = 0x8002290a, + SCE_NP_TROPHY_ERROR_INVALID_FORMAT = 0x8002290b, + SCE_NP_TROPHY_ERROR_BAD_RESPONSE = 0x8002290c, + SCE_NP_TROPHY_ERROR_INVALID_GRADE = 0x8002290d, + SCE_NP_TROPHY_ERROR_INVALID_CONTEXT = 0x8002290e, + SCE_NP_TROPHY_ERROR_PROCESSING_ABORTED = 0x8002290f, + SCE_NP_TROPHY_ERROR_ABORT = 0x80022910, + SCE_NP_TROPHY_ERROR_UNKNOWN_HANDLE = 0x80022911, + SCE_NP_TROPHY_ERROR_LOCKED = 0x80022912, + SCE_NP_TROPHY_ERROR_HIDDEN = 0x80022913, + SCE_NP_TROPHY_ERROR_CANNOT_UNLOCK_PLATINUM = 0x80022914, + SCE_NP_TROPHY_ERROR_ALREADY_UNLOCKED = 0x80022915, + SCE_NP_TROPHY_ERROR_INVALID_TYPE = 0x80022916, + SCE_NP_TROPHY_ERROR_INVALID_HANDLE = 0x80022917, + SCE_NP_TROPHY_ERROR_INVALID_NP_COMM_ID = 0x80022918, + SCE_NP_TROPHY_ERROR_UNKNOWN_NP_COMM_ID = 0x80022919, + SCE_NP_TROPHY_ERROR_DISC_IO = 0x8002291a, + SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST = 0x8002291b, + SCE_NP_TROPHY_ERROR_UNSUPPORTED_FORMAT = 0x8002291c, + SCE_NP_TROPHY_ERROR_ALREADY_INSTALLED = 0x8002291d, + SCE_NP_TROPHY_ERROR_BROKEN_DATA = 0x8002291e, + SCE_NP_TROPHY_ERROR_VERIFICATION_FAILURE = 0x8002291f, + SCE_NP_TROPHY_ERROR_INVALID_TROPHY_ID = 0x80022920, + SCE_NP_TROPHY_ERROR_UNKNOWN_TROPHY_ID = 0x80022921, + SCE_NP_TROPHY_ERROR_UNKNOWN_TITLE = 0x80022922, + SCE_NP_TROPHY_ERROR_UNKNOWN_FILE = 0x80022923, + SCE_NP_TROPHY_ERROR_DISC_NOT_MOUNTED = 0x80022924, + SCE_NP_TROPHY_ERROR_SHUTDOWN = 0x80022925, + SCE_NP_TROPHY_ERROR_TITLE_ICON_NOT_FOUND = 0x80022926, + SCE_NP_TROPHY_ERROR_TROPHY_ICON_NOT_FOUND = 0x80022927, + SCE_NP_TROPHY_ERROR_INSUFFICIENT_DISK_SPACE = 0x80022928, + SCE_NP_TROPHY_ERROR_ILLEGAL_UPDATE = 0x8002292a, + SCE_NP_TROPHY_ERROR_SAVEDATA_USER_DOES_NOT_MATCH = 0x8002292b, + SCE_NP_TROPHY_ERROR_TROPHY_ID_DOES_NOT_EXIST = 0x8002292c, + SCE_NP_TROPHY_ERROR_SERVICE_UNAVAILABLE = 0x8002292d, + SCE_NP_TROPHY_ERROR_UNKNOWN = 0x800229ff, +}; + + +struct sceNpTrophyInternalContext +{ + // TODO + std::string trp_name; + vfsStream* trp_stream; +}; + +struct sceNpTrophyInternal +{ + bool m_bInitialized; + std::vector contexts; + + sceNpTrophyInternal() + : m_bInitialized(false) + { + } +}; + +sceNpTrophyInternal* s_npTrophyInstance = new sceNpTrophyInternal(); + +// Functions +int sceNpTrophyInit(u32 pool_addr, u32 poolSize, u32 containerId, u64 options) +{ + sceNpTrophy.Log("sceNpTrophyInit(pool_addr=0x%x, poolSize=%d, containerId=%d, options=0x%llx)", pool_addr, poolSize, containerId, options); + + if (s_npTrophyInstance->m_bInitialized) + return SCE_NP_TROPHY_ERROR_ALREADY_INITIALIZED; + if (options) + return SCE_NP_TROPHY_ERROR_NOT_SUPPORTED; + + s_npTrophyInstance->m_bInitialized = true; + return CELL_OK; +} + +int sceNpTrophyCreateContext(mem32_t context, mem_ptr_t commID, mem_ptr_t commSign, u64 options) +{ + sceNpTrophy.Warning("sceNpTrophyCreateContext(context_addr=0x%x, commID_addr=0x%x, commSign_addr=0x%x, options=0x%llx)", + context.GetAddr(), commID.GetAddr(), commSign.GetAddr(), options); + + if (!(s_npTrophyInstance->m_bInitialized)) + return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; + if (!context.IsGood()) + return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT; + if (options & (~(u64)1)) + SCE_NP_TROPHY_ERROR_NOT_SUPPORTED; + // TODO: There are other possible errors + + // TODO: Is the TROPHY.TRP file necessarily located in this path? + wxString ps3_path = "/app_home/TROPDIR/"; + wxString local_path; + Emu.GetVFS().GetDevice(ps3_path, local_path); + + vfsLocalDir dir(local_path); + if(!dir.Open(local_path)) + return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST; + + // TODO: Following method will retrieve the TROPHY.TRP of the first folder that contains such file + const DirEntryInfo* entry = dir.Read(); + while (entry) + { + if (!(entry->flags & DirEntry_TypeFile)) + { + vfsStream* stream = Emu.GetVFS().Open(ps3_path + entry->name + "/TROPHY.TRP", vfsRead); + if (stream) + { + sceNpTrophyInternalContext ctxt; + ctxt.trp_stream = stream; + ctxt.trp_name = entry->name; + s_npTrophyInstance->contexts.push_back(ctxt); + return CELL_OK; + } + } + entry->name; + entry = dir.Read(); + } + + return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST; +} + +int sceNpTrophyCreateHandle(mem32_t handle) +{ + sceNpTrophy.Warning("sceNpTrophyCreateHandle(handle_addr=0x%x)", handle.GetAddr()); + + if (!(s_npTrophyInstance->m_bInitialized)) + return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; + if (!handle.IsGood()) + return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT; + // TODO: There are other possible errors + + // TODO: ? + + return CELL_OK; +} + +int sceNpTrophyRegisterContext(u32 context, u32 handle, u32 statusCb_addr, u32 arg_addr, u64 options) +{ + sceNpTrophy.Warning("sceNpTrophyRegisterContext(context=%d, handle=%d, statusCb_addr=0x%x, arg_addr=0x%x, options=0x%llx)", + context, handle, statusCb_addr, arg_addr, options); + + if (!(s_npTrophyInstance->m_bInitialized)) + return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; + if (!Memory.IsGoodAddr(statusCb_addr)) + return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT; + if (options & (~(u64)1)) + SCE_NP_TROPHY_ERROR_NOT_SUPPORTED; + // TODO: There are other possible errors + + int ret; + sceNpTrophyInternalContext& ctxt = s_npTrophyInstance->contexts[context]; + TRPLoader trp(*(ctxt.trp_stream)); + + // TODO: Get the path of the current user + if (trp.Install("/dev_hdd0/home/00000001/trophy/" + ctxt.trp_name)) + ret = CELL_OK; + else + ret = SCE_NP_TROPHY_ERROR_ILLEGAL_UPDATE; + + // TODO: Callbacks + + trp.Close(); + return ret; +} + +int sceNpTrophyGetGameProgress() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophySetSoundLevel() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyGetRequiredDiskSpace() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyDestroyContext() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyAbortHandle() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyGetGameInfo() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyDestroyHandle() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyUnlockTrophy() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyTerm() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyGetTrophyUnlockState() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyGetTrophyIcon() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyGetTrophyInfo() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +int sceNpTrophyGetGameIcon() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} + +void sceNpTrophy_unload() +{ + s_npTrophyInstance->m_bInitialized = false; +} + +void sceNpTrophy_init() +{ + sceNpTrophy.AddFunc(0x079f0e87, sceNpTrophyGetGameProgress); + sceNpTrophy.AddFunc(0x1197b52c, sceNpTrophyRegisterContext); + sceNpTrophy.AddFunc(0x1c25470d, sceNpTrophyCreateHandle); + sceNpTrophy.AddFunc(0x27deda93, sceNpTrophySetSoundLevel); + sceNpTrophy.AddFunc(0x370136fe, sceNpTrophyGetRequiredDiskSpace); + sceNpTrophy.AddFunc(0x3741ecc7, sceNpTrophyDestroyContext); + sceNpTrophy.AddFunc(0x39567781, sceNpTrophyInit); + sceNpTrophy.AddFunc(0x48bd97c7, sceNpTrophyAbortHandle); + sceNpTrophy.AddFunc(0x49d18217, sceNpTrophyGetGameInfo); + sceNpTrophy.AddFunc(0x623cd2dc, sceNpTrophyDestroyHandle); + sceNpTrophy.AddFunc(0x8ceedd21, sceNpTrophyUnlockTrophy); + sceNpTrophy.AddFunc(0xa7fabf4d, sceNpTrophyTerm); + sceNpTrophy.AddFunc(0xb3ac3478, sceNpTrophyGetTrophyUnlockState); + sceNpTrophy.AddFunc(0xbaedf689, sceNpTrophyGetTrophyIcon); + sceNpTrophy.AddFunc(0xe3bf9a28, sceNpTrophyCreateContext); + sceNpTrophy.AddFunc(0xfce6d30a, sceNpTrophyGetTrophyInfo); + sceNpTrophy.AddFunc(0xff299e03, sceNpTrophyGetGameIcon); +} \ No newline at end of file diff --git a/rpcs3/Loader/TRP.cpp b/rpcs3/Loader/TRP.cpp index 6d52438166..c3b99b525a 100644 --- a/rpcs3/Loader/TRP.cpp +++ b/rpcs3/Loader/TRP.cpp @@ -9,10 +9,14 @@ bool TRPLoader::Install(std::string dest, bool show) { if(!trp_f.IsOpened()) return false; if(!LoadHeader(show)) return false; - + + if (!dest.empty() && dest.back() != '/') + dest += '/'; + for (const TRPEntry& entry : m_entries) { char* buffer = new char [entry.size]; + Emu.GetVFS().Create(dest+entry.name); vfsFile file(dest+entry.name, vfsWrite); trp_f.Seek(entry.offset); trp_f.Read(buffer, entry.size); @@ -35,7 +39,7 @@ bool TRPLoader::LoadHeader(bool show) if (trp_f.Read(&m_header, sizeof(TRPHeader)) != sizeof(TRPHeader)) return false; - if (!m_header.CheckMagic()) + if (m_header.trp_magic != 0xDCA24D00) return false; if (show) diff --git a/rpcs3/Loader/TRP.h b/rpcs3/Loader/TRP.h index 64ed0abc11..e0994ce650 100644 --- a/rpcs3/Loader/TRP.h +++ b/rpcs3/Loader/TRP.h @@ -3,26 +3,22 @@ struct TRPHeader { - u32 trp_magic; - u32 trp_version; - u64 trp_file_size; - u32 trp_files_count; - u32 trp_element_size; - u32 trp_unknown; + be_t trp_magic; + be_t trp_version; + be_t trp_file_size; + be_t trp_files_count; + be_t trp_element_size; + be_t trp_unknown; unsigned char sha1[20]; unsigned char padding[16]; - - bool CheckMagic() const { - return trp_magic == 0xDCA23D00; - } }; struct TRPEntry { - char name[20]; - u64 offset; - u64 size; - u32 unknown; + char name[32]; + be_t offset; + be_t size; + be_t unknown; char padding[12]; }; diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 3c47e75874..d54859b8a4 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -292,6 +292,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index b594ddbb64..a076af31e7 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -394,6 +394,9 @@ Loader + + Emu\SysCalls\Modules + From 01f3763eb4e61ab5eb26b443733dcd8935d9bebf Mon Sep 17 00:00:00 2001 From: DH Date: Sun, 16 Feb 2014 10:28:32 +0200 Subject: [PATCH 2/7] Small fixes --- rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp | 27 ++++++++++------------ rpcs3/Emu/SysCalls/SysCalls.h | 4 ++-- rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp | 5 +++- rpcs3/Emu/SysCalls/lv2/SC_TTY.cpp | 7 +++--- rpcs3/Gui/CompilerELF.cpp | 2 +- 6 files changed, 24 insertions(+), 23 deletions(-) diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index 79aab03149..237b148dac 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -941,7 +941,7 @@ int cellSysCacheClear(void) Emu.GetVFS().GetDevice(wxString("/dev_hdd1/cache/"), localPath); if (wxDirExists(localPath)){ WxDirDeleteTraverser deleter; - wxString f = wxFindFirstFile(localPath+"\*",wxDIR); + wxString f = wxFindFirstFile(localPath+"\\*",wxDIR); while (!f.empty()) { wxDir dir(f); diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index c69c716a59..9739d62468 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -76,19 +76,19 @@ struct sceNpTrophyInternal } }; -sceNpTrophyInternal* s_npTrophyInstance = new sceNpTrophyInternal(); +sceNpTrophyInternal s_npTrophyInstance; // Functions int sceNpTrophyInit(u32 pool_addr, u32 poolSize, u32 containerId, u64 options) { sceNpTrophy.Log("sceNpTrophyInit(pool_addr=0x%x, poolSize=%d, containerId=%d, options=0x%llx)", pool_addr, poolSize, containerId, options); - if (s_npTrophyInstance->m_bInitialized) + if (s_npTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_ALREADY_INITIALIZED; if (options) return SCE_NP_TROPHY_ERROR_NOT_SUPPORTED; - s_npTrophyInstance->m_bInitialized = true; + s_npTrophyInstance.m_bInitialized = true; return CELL_OK; } @@ -97,7 +97,7 @@ int sceNpTrophyCreateContext(mem32_t context, mem_ptr_t co sceNpTrophy.Warning("sceNpTrophyCreateContext(context_addr=0x%x, commID_addr=0x%x, commSign_addr=0x%x, options=0x%llx)", context.GetAddr(), commID.GetAddr(), commSign.GetAddr(), options); - if (!(s_npTrophyInstance->m_bInitialized)) + if (!s_npTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; if (!context.IsGood()) return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT; @@ -111,14 +111,13 @@ int sceNpTrophyCreateContext(mem32_t context, mem_ptr_t co Emu.GetVFS().GetDevice(ps3_path, local_path); vfsLocalDir dir(local_path); - if(!dir.Open(local_path)) + if(!dir.IsOpened()) return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST; // TODO: Following method will retrieve the TROPHY.TRP of the first folder that contains such file - const DirEntryInfo* entry = dir.Read(); - while (entry) + for(const DirEntryInfo* entry = dir.Read(); entry; entry = dir.Read()) { - if (!(entry->flags & DirEntry_TypeFile)) + if (entry->flags & DirEntry_TypeDir) { vfsStream* stream = Emu.GetVFS().Open(ps3_path + entry->name + "/TROPHY.TRP", vfsRead); if (stream) @@ -126,12 +125,10 @@ int sceNpTrophyCreateContext(mem32_t context, mem_ptr_t co sceNpTrophyInternalContext ctxt; ctxt.trp_stream = stream; ctxt.trp_name = entry->name; - s_npTrophyInstance->contexts.push_back(ctxt); + s_npTrophyInstance.contexts.push_back(ctxt); return CELL_OK; } } - entry->name; - entry = dir.Read(); } return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST; @@ -141,7 +138,7 @@ int sceNpTrophyCreateHandle(mem32_t handle) { sceNpTrophy.Warning("sceNpTrophyCreateHandle(handle_addr=0x%x)", handle.GetAddr()); - if (!(s_npTrophyInstance->m_bInitialized)) + if (!s_npTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; if (!handle.IsGood()) return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT; @@ -157,7 +154,7 @@ int sceNpTrophyRegisterContext(u32 context, u32 handle, u32 statusCb_addr, u32 a sceNpTrophy.Warning("sceNpTrophyRegisterContext(context=%d, handle=%d, statusCb_addr=0x%x, arg_addr=0x%x, options=0x%llx)", context, handle, statusCb_addr, arg_addr, options); - if (!(s_npTrophyInstance->m_bInitialized)) + if (!(s_npTrophyInstance.m_bInitialized)) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; if (!Memory.IsGoodAddr(statusCb_addr)) return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT; @@ -166,7 +163,7 @@ int sceNpTrophyRegisterContext(u32 context, u32 handle, u32 statusCb_addr, u32 a // TODO: There are other possible errors int ret; - sceNpTrophyInternalContext& ctxt = s_npTrophyInstance->contexts[context]; + sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; TRPLoader trp(*(ctxt.trp_stream)); // TODO: Get the path of the current user @@ -261,7 +258,7 @@ int sceNpTrophyGetGameIcon() void sceNpTrophy_unload() { - s_npTrophyInstance->m_bInitialized = false; + s_npTrophyInstance.m_bInitialized = false; } void sceNpTrophy_init() diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index 9570acf1b8..e0d5433366 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -307,8 +307,8 @@ extern int cellMouseGetRawData(u32 port_no, mem_class_t data); extern int cellGcmCallback(u32 context_addr, u32 count); //sys_tty -extern int sys_tty_read(s32 ch, u64 buf_addr, u32 len, u64 preadlen_addr); -extern int sys_tty_write(s32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr); +extern int sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr); +extern int sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr); //sys_heap extern int sys_heap_create_heap(const u32 heap_addr, const u32 start_addr, const u32 size); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp index b4760efcf4..60a7f561ef 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp @@ -148,8 +148,11 @@ int cellFsOpendir(u32 path_addr, mem32_t fd) wxString localPath; Emu.GetVFS().GetDevice(path, localPath); vfsLocalDir* dir = new vfsLocalDir(localPath); - if(!dir->Open(localPath)) + if(!dir->IsOpened()) + { + delete dir; return CELL_ENOENT; + } fd = sys_fs.GetNewId(dir); return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/lv2/SC_TTY.cpp b/rpcs3/Emu/SysCalls/lv2/SC_TTY.cpp index 2317aeb767..0eb3dcce12 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_TTY.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_TTY.cpp @@ -1,17 +1,18 @@ #include "stdafx.h" #include "Emu/SysCalls/SysCalls.h" -int sys_tty_read(s32 ch, u64 buf_addr, u32 len, u64 preadlen_addr) +int sys_tty_read(u32 ch, u64 buf_addr, u32 len, u64 preadlen_addr) { ConLog.Warning("sys_tty_read: ch: %d, buf addr: %llx, len: %d", ch, buf_addr, len); Memory.Write32NN(preadlen_addr, len); + Emu.Pause(); return CELL_OK; } -int sys_tty_write(s32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr) +int sys_tty_write(u32 ch, u64 buf_addr, u32 len, u64 pwritelen_addr) { - if(ch < 0 || ch > 15 || (s32)len <= 0) return CELL_EINVAL; + if(ch > 15 || (s32)len <= 0) return CELL_EINVAL; if(!Memory.IsGoodAddr(buf_addr)) return CELL_EFAULT; Emu.GetDbgCon().Write(ch, Memory.ReadString(buf_addr, len)); diff --git a/rpcs3/Gui/CompilerELF.cpp b/rpcs3/Gui/CompilerELF.cpp index 5cc0c44804..d455da5390 100644 --- a/rpcs3/Gui/CompilerELF.cpp +++ b/rpcs3/Gui/CompilerELF.cpp @@ -12,7 +12,7 @@ enum CompilerIDs wxFont GetFont(int size) { - return wxFont(size, wxMODERN, wxNORMAL, wxNORMAL); + return wxFont(size, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); } CompilerELF::CompilerELF(wxWindow* parent) From a7368cc893748d096dccfee3da4d8e21767632c9 Mon Sep 17 00:00:00 2001 From: DH Date: Sun, 16 Feb 2014 10:56:58 +0200 Subject: [PATCH 3/7] Merged elisha464 branch --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 110 ++++++++++++++- rpcs3/Emu/GS/GL/GLGSRender.h | 123 +++++++++++------ rpcs3/Emu/GS/GL/GLVertexProgram.cpp | 3 +- rpcs3/Emu/GS/RSXTexture.cpp | 202 ++++++++++++++++++++++++++++ rpcs3/Emu/GS/RSXThread.cpp | 117 ++++------------ rpcs3/Emu/GS/RSXThread.h | 191 ++++++++------------------ rpcs3/Gui/RSXDebugger.cpp | 41 +++--- rpcs3/rpcs3.vcxproj | 1 + rpcs3/rpcs3.vcxproj.filters | 5 +- 9 files changed, 504 insertions(+), 289 deletions(-) create mode 100644 rpcs3/Emu/GS/RSXTexture.cpp diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index a258b5b6fc..068a0f6a2e 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -12,6 +12,7 @@ #endif gcmBuffer gcmBuffers[8]; +GLuint flipTex; int last_width = 0, last_height = 0, last_depth_format = 0; @@ -85,12 +86,15 @@ GLGSRender::GLGSRender() , m_context(nullptr) { m_frame = new GLGSFrame(); + + glGenTextures(1, &flipTex); } GLGSRender::~GLGSRender() { m_frame->Close(); delete m_context; + glDeleteTextures(1, &flipTex); } void GLGSRender::Enable(bool enable, const u32 cap) @@ -304,17 +308,39 @@ void GLGSRender::DisableVertexData() void GLGSRender::InitVertexData() { + GLfloat scaleOffsetMat[16] = {1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + int l; + for(u32 i=0; i pixels; + pixels.SetCount(m_width * m_height * 4); + m_fbo.Bind(GL_READ_FRAMEBUFFER); + glReadPixels(0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels.GetPtr()); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, flipTex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels.GetPtr()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, 1, 0, 1, 0, 1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + GLfbo::Bind(GL_DRAW_FRAMEBUFFER, 0); + + m_program.UnUse(); + m_program.Use(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_ACCUM_BUFFER_BIT); + glBegin(GL_QUADS); + glTexCoord2i(0, 1); + glVertex2i(0, 0); + + glTexCoord2i(1, 1); + glVertex2i(1, 0); + + glTexCoord2i(1, 0); + glVertex2i(1, 1); + + glTexCoord2i(0, 0); + glVertex2i(0, 1); + glEnd(); + + /*GLfbo::Bind(GL_DRAW_FRAMEBUFFER, 0); GLfbo::Blit( m_surface_clip_x, m_surface_clip_y, m_surface_clip_x + m_surface_clip_w, m_surface_clip_y + m_surface_clip_h, m_surface_clip_x, m_surface_clip_y, m_surface_clip_x + m_surface_clip_w, m_surface_clip_y + m_surface_clip_h, - GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); + GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);*/ m_fbo.Bind(); } @@ -1072,4 +1139,39 @@ void GLGSRender::Flip() if(m_fbo.IsCreated()) m_fbo.Bind(); + + if(m_set_scissor_horizontal && m_set_scissor_vertical) + { + glScissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h); + checkForGlError("glScissor"); + } +} + +uint32_t LinearToSwizzleAddress( + uint32_t x, uint32_t y, uint32_t z, + uint32_t log2_width, uint32_t log2_height, uint32_t log2_depth) +{ + uint32_t offset = 0; + uint32_t shift_count = 0; + while(log2_width | log2_height | log2_depth){ + if(log2_width){ + offset |= (x & 0x01) << shift_count; + x >>= 1; + ++shift_count; + --log2_width; + } + if(log2_height){ + offset |= (y & 0x01) << shift_count; + y >>= 1; + ++shift_count; + --log2_height; + } + if(log2_depth){ + offset |= (z & 0x01) << shift_count; + z >>= 1; + ++shift_count; + --log2_depth; + } + } + return offset; } diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index 8be6fc008c..d685271871 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -13,6 +13,9 @@ extern GLenum g_last_gl_error; void printGlError(GLenum err, const char* situation); +uint32_t LinearToSwizzleAddress( + uint32_t x, uint32_t y, uint32_t z, + uint32_t log2_width, uint32_t log2_height, uint32_t log2_depth); #if RSX_DEBUG #define checkForGlError(sit) if((g_last_gl_error = glGetError()) != GL_NO_ERROR) printGlError(g_last_gl_error, sit) @@ -51,9 +54,11 @@ public: case 1: return GL_REPEAT; case 2: return GL_MIRRORED_REPEAT; case 3: return GL_CLAMP_TO_EDGE; - case 4: return GL_TEXTURE_BORDER; - case 5: return GL_CLAMP_TO_EDGE;//GL_CLAMP; - //case 6: return GL_MIRROR_CLAMP_TO_EDGE_EXT; + case 4: return GL_CLAMP_TO_BORDER; + case 5: return GL_CLAMP_TO_EDGE; + case 6: return GL_MIRROR_CLAMP_TO_EDGE_EXT; + case 7: return GL_MIRROR_CLAMP_TO_BORDER_EXT; + case 8: return GL_MIRROR_CLAMP_EXT; } ConLog.Error("Texture wrap error: bad wrap (%d).", wrap); @@ -63,9 +68,9 @@ public: void Init(RSXTexture& tex) { Bind(); - if(!Memory.IsGoodAddr(tex.GetOffset())) + if(!Memory.IsGoodAddr(GetAddress(tex.GetOffset(), tex.GetLocation()))) { - ConLog.Error("Bad texture address=0x%x", tex.GetOffset()); + ConLog.Error("Bad texture address=0x%x", GetAddress(tex.GetOffset(), tex.GetLocation())); return; } //ConLog.Warning("texture addr = 0x%x, width = %d, height = %d, max_aniso=%d, mipmap=%d, remap=0x%x, zfunc=0x%x, wraps=0x%x, wrapt=0x%x, wrapr=0x%x, minlod=0x%x, maxlod=0x%x", @@ -77,12 +82,13 @@ public: bool is_swizzled = (tex.GetFormat() & 0x20) == 0; glPixelStorei(GL_PACK_ALIGNMENT, tex.m_pitch); - char* pixels = (char*)Memory.GetMemFromAddr(tex.GetOffset()); + char* pixels = (char*)Memory.GetMemFromAddr(GetAddress(tex.GetOffset(), tex.GetLocation())); + char* unswizzledPixels; switch(format) { case 0x81: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_BLUE, GL_UNSIGNED_BYTE, pixels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BLUE, GL_UNSIGNED_BYTE, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); @@ -94,39 +100,60 @@ public: break; case 0x85: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); + if(is_swizzled) + { + uint32_t *src, *dst; + uint32_t log2width, log2height; + + unswizzledPixels = (char*)malloc(tex.GetWidth() * tex.GetHeight() * 4); + src = (uint32_t*)pixels; + dst = (uint32_t*)unswizzledPixels; + + log2width = log(tex.GetWidth())/log(2); + log2height = log(tex.GetHeight())/log(2); + + for(int i=0; i glTexImage2D"); break; case 0x86: { - u32 size = ((tex.m_width + 3) / 4) * ((tex.m_height + 3) / 4) * 8; + u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 8; - glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, tex.m_width, tex.m_height, 0, size, pixels); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, tex.GetWidth(), tex.GetHeight(), 0, size, pixels); checkForGlError("GLTexture::Init() -> glCompressedTexImage2D"); } break; case 0x87: { - u32 size = ((tex.m_width + 3) / 4) * ((tex.m_height + 3) / 4) * 16; + u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16; - glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, tex.m_width, tex.m_height, 0, size, pixels); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, tex.GetWidth(), tex.GetHeight(), 0, size, pixels); checkForGlError("GLTexture::Init() -> glCompressedTexImage2D"); } break; case 0x88: { - u32 size = ((tex.m_width + 3) / 4) * ((tex.m_height + 3) / 4) * 16; + u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16; - glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, tex.m_width, tex.m_height, 0, size, pixels); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, tex.GetWidth(), tex.GetHeight(), 0, size, pixels); checkForGlError("GLTexture::Init() -> glCompressedTexImage2D"); } break; case 0x94: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_RED, GL_SHORT, pixels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_RED, GL_SHORT, pixels); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_ONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_ONE); @@ -135,30 +162,30 @@ public: break; case 0x9a: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_BGRA, GL_HALF_FLOAT, pixels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_HALF_FLOAT, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); break; case 0x9e: { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ONE); } break; - default: ConLog.Error("Init tex error: Bad tex format (0x%x | 0x%x | 0x%x)", format, tex.GetFormat() & 0x20, tex.GetFormat() & 0x40); break; + default: ConLog.Error("Init tex error: Bad tex format (0x%x | %s | 0x%x)", format, is_swizzled ? "swizzled" : "linear", tex.GetFormat() & 0x40); break; } - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, tex.m_mipmap - 1); - glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, tex.m_mipmap > 1); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, tex.Getmipmap() - 1); + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, tex.Getmipmap() > 1); if(format != 0x81 && format != 0x94) { - u8 remap_a = tex.m_remap & 0x3; - u8 remap_r = (tex.m_remap >> 2) & 0x3; - u8 remap_g = (tex.m_remap >> 4) & 0x3; - u8 remap_b = (tex.m_remap >> 6) & 0x3; + u8 remap_a = tex.GetRemap() & 0x3; + u8 remap_r = (tex.GetRemap() >> 2) & 0x3; + u8 remap_g = (tex.GetRemap() >> 4) & 0x3; + u8 remap_b = (tex.GetRemap() >> 6) & 0x3; static const int gl_remap[] = { @@ -174,6 +201,8 @@ public: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, gl_remap[remap_b]); } + checkForGlError("GLTexture::Init() -> remap"); + static const int gl_tex_zfunc[] = { GL_NEVER, @@ -186,14 +215,18 @@ public: GL_ALWAYS, }; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GetGlWrap(tex.m_wraps)); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GetGlWrap(tex.m_wrapt)); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GetGlWrap(tex.m_wrapr)); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, gl_tex_zfunc[tex.m_zfunc]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GetGlWrap(tex.GetWrapS())); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GetGlWrap(tex.GetWrapT())); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GetGlWrap(tex.GetWrapR())); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, gl_tex_zfunc[tex.GetZfunc()]); + + checkForGlError("GLTexture::Init() -> parameters1"); - glTexEnvi(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, tex.m_bias); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, tex.m_minlod); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, tex.m_maxlod); + glTexEnvi(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, tex.GetBias()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, (tex.GetMinLOD() >> 8)); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, (tex.GetMaxLOD() >> 8)); + + checkForGlError("GLTexture::Init() -> parameters2"); static const int gl_tex_filter[] = { @@ -207,20 +240,28 @@ public: GL_NEAREST, }; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_tex_filter[tex.m_min_filter]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_tex_filter[tex.m_mag_filter]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_tex_filter[tex.GetMinFilter()]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_tex_filter[tex.GetMagFilter()]); + + checkForGlError("GLTexture::Init() -> filters"); + //Unbind(); + + if(is_swizzled && format == 0x85) + { + free(unswizzledPixels); + } } void Save(RSXTexture& tex, const wxString& name) { - if(!m_id || !tex.m_offset || !tex.m_width || !tex.m_height) return; + if(!m_id || !tex.GetOffset() || !tex.GetWidth() || !tex.GetHeight()) return; - u32* alldata = new u32[tex.m_width * tex.m_height]; + u32* alldata = new u32[tex.GetWidth() * tex.GetHeight()]; Bind(); - switch(tex.m_format & ~(0x20 | 0x40)) + switch(tex.GetFormat() & ~(0x20 | 0x40)) { case 0x81: glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, alldata); @@ -237,15 +278,15 @@ public: { wxFile f(name + ".raw", wxFile::write); - f.Write(alldata, tex.m_width * tex.m_height * 4); + f.Write(alldata, tex.GetWidth() * tex.GetHeight() * 4); } - u8* data = new u8[tex.m_width * tex.m_height * 3]; - u8* alpha = new u8[tex.m_width * tex.m_height]; + u8* data = new u8[tex.GetWidth() * tex.GetHeight() * 3]; + u8* alpha = new u8[tex.GetWidth() * tex.GetHeight()]; u8* src = (u8*)alldata; u8* dst_d = data; u8* dst_a = alpha; - for(u32 i=0; i> 2) & 0x1); +} + +u8 RSXTexture::GetBorderType() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 3) & 0x1); +} + +u8 RSXTexture::GetDimension() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 4) & 0xf); +} + +u8 RSXTexture::GetFormat() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 8) & 0xff); +} + +u16 RSXTexture::Getmipmap() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 16) & 0xffff); +} + +u8 RSXTexture::GetWrapS() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)]) & 0xf); +} + +u8 RSXTexture::GetWrapT() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 8) & 0xf); +} + +u8 RSXTexture::GetWrapR() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 16) & 0xf); +} + +u8 RSXTexture::GetUnsignedRemap() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 12) & 0xf); +} + +u8 RSXTexture::GetZfunc() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 28) & 0xf); +} + +u8 RSXTexture::GetGamma() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 20) & 0xf); +} + +u8 RSXTexture::GetAnisoBias() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 4) & 0xf); +} + +u8 RSXTexture::GetSignedRemap() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 24) & 0xf); +} + +bool RSXTexture::IsEnabled() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 31) & 0x1); +} + +u16 RSXTexture::GetMinLOD() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 19) & 0xfff); +} + +u16 RSXTexture::GetMaxLOD() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 7) & 0xfff); +} + +u8 RSXTexture::GetMaxAniso() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 4) & 0x7); +} + +bool RSXTexture::IsAlphaKillEnabled() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 2) & 0x1); +} + +u32 RSXTexture::GetRemap() const +{ + return (methodRegisters[NV4097_SET_TEXTURE_CONTROL1 + (m_index*32)]); +} + +u16 RSXTexture::GetBias() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)]) & 0x1fff); +} + +u8 RSXTexture::GetMinFilter() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 16) & 0x7); +} + +u8 RSXTexture::GetMagFilter() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 24) & 0x7); +} + +u8 RSXTexture::GetConvolutionFilter() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 13) & 0xf); +} + +bool RSXTexture::isASigned() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 28) & 0x1); +} + +bool RSXTexture::isRSigned() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 29) & 0x1); +} + +bool RSXTexture::isGSigned() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 30) & 0x1); +} + +bool RSXTexture::isBSigned() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 31) & 0x1); +} + +u16 RSXTexture::GetWidth() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*32)] >> 16) & 0xffff); +} + +u16 RSXTexture::GetHeight() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*32)]) & 0xffff); +} + +void RSXTexture::SetControl3(u16 depth, u32 pitch) +{ + m_depth = depth; + m_pitch = pitch; +} \ No newline at end of file diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index bd9f4396df..9556370bf9 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -3,6 +3,21 @@ #define ARGS(x) (Memory.Read32(Memory.RSXIOMem.GetStartAddr() + re(m_ctrl->get) + (4*(x+1)))) +u32 methodRegisters[0xffff]; + +u32 GetAddress(u32 offset, u8 location) +{ + switch(location) + { + case CELL_GCM_LOCATION_LOCAL: return Memory.RSXFBMem.GetStartAddr() + offset; + case CELL_GCM_LOCATION_MAIN: return Memory.RSXIOMem.getRealAddr(Memory.RSXIOMem.GetStartAddr() + offset); + } + + ConLog.Error("GetAddress(offset=0x%x, location=0x%x)", location); + assert(0); + return 0; +} + RSXVertexData::RSXVertexData() : frequency(0) , stride(0) @@ -185,47 +200,11 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_OFFSET, 0x20): { - RSXTexture& tex = m_textures[index]; - const u32 offset = ARGS(0); - u32 a1 = ARGS(1); - u8 location = (a1 & 0x3) - 1; - const bool cubemap = (a1 >> 2) & 0x1; - const u8 dimension = (a1 >> 4) & 0xf; - const u8 format = (a1 >> 8) & 0xff; - const u16 mipmap = (a1 >> 16) & 0xffff; - CMD_LOG("index = %d, offset=0x%x, location=0x%x, cubemap=0x%x, dimension=0x%x, format=0x%x, mipmap=0x%x", - index, offset, location, cubemap, dimension, format, mipmap); - - if(location == 2) - { - ConLog.Error("Bad texture location."); - location = 1; - } - u32 tex_addr = GetAddress(offset, location); - if(!Memory.IsGoodAddr(tex_addr)) - ConLog.Error("Bad texture[%d] addr = 0x%x #offset = 0x%x, location=%d", index, tex_addr, offset, location); - //ConLog.Warning("texture addr = 0x%x #offset = 0x%x, location=%d", tex_addr, offset, location); - tex.SetOffset(tex_addr); - tex.SetFormat(cubemap, dimension, format, mipmap); - - if(!tex.m_width || !tex.m_height) - { - gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(m_gcm_buffers_addr); - if(!tex.m_width) tex.m_width = re(buffers[m_gcm_current_buffer].width); - if(!tex.m_height) tex.m_height = re(buffers[m_gcm_current_buffer].height); - } } break; case_16(NV4097_SET_TEXTURE_CONTROL0, 0x20): { - RSXTexture& tex = m_textures[index]; - u32 a0 = ARGS(0); - bool enable = a0 >> 31 ? true : false; - u16 minlod = (a0 >> 19) & 0xfff; - u16 maxlod = (a0 >> 7) & 0xfff; - u8 maxaniso = (a0 >> 2) & 0x7; - tex.SetControl0(enable, minlod, maxlod, maxaniso); } break; @@ -294,8 +273,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_CONTROL1, 0x20): { - RSXTexture& tex = m_textures[index]; - tex.SetControl1(ARGS(0)); } break; @@ -311,36 +288,11 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_FILTER, 0x20): { - RSXTexture& tex = m_textures[index]; - u32 a0 = ARGS(0); - u16 bias = a0 & 0x1fff; - u8 conv = (a0 >> 13) & 0xf; - u8 min = (a0 >> 16) & 0x7; - u8 mag = (a0 >> 24) & 0x7; - u8 a_signed = (a0 >> 28) & 0x1; - u8 r_signed = (a0 >> 29) & 0x1; - u8 g_signed = (a0 >> 30) & 0x1; - u8 b_signed = (a0 >> 31) & 0x1; - - tex.SetFilter(bias, min, mag, conv, a_signed, r_signed, g_signed, b_signed); } break; case_16(NV4097_SET_TEXTURE_ADDRESS, 0x20): { - RSXTexture& tex = m_textures[index]; - - u32 a0 = ARGS(0); - u8 wraps = a0 & 0xf; - u8 aniso_bias = (a0 >> 4) & 0xf; - u8 wrapt = (a0 >> 8) & 0xf; - u8 unsigned_remap = (a0 >> 12) & 0xf; - u8 wrapr = (a0 >> 16) & 0xf; - u8 gamma = (a0 >> 20) & 0xf; - u8 signed_remap = (a0 >> 24) & 0xf; - u8 zfunc = a0 >> 28; - - tex.SetAddress(wraps, wrapt, wrapr, unsigned_remap, zfunc, gamma, aniso_bias, signed_remap); } break; @@ -350,26 +302,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_IMAGE_RECT, 32): { - RSXTexture& tex = m_textures[index]; - - u16 height = ARGS(0) & 0xffff; - u16 width = ARGS(0) >> 16; - CMD_LOG("width=%d, height=%d", width, height); - - if(!width || !height) - { - ConLog.Warning("Bad texture rect: %dx%d (%dx%d)", width, height, tex.m_width, tex.m_height); - for(int i=0; i::func(put, std::atomic_load((volatile std::atomic*)((u8*)m_ctrl + offsetof(CellGcmControl, put)))); se_t::func(get, std::atomic_load((volatile std::atomic*)((u8*)m_ctrl + offsetof(CellGcmControl, get)))); @@ -1504,6 +1439,7 @@ void RSXThread::Task() if(cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT) { //ConLog.Warning("non increment cmd! 0x%x", cmd); + inc=0; } if(cmd == 0) @@ -1513,6 +1449,11 @@ void RSXThread::Task() continue; } + for(int i=0; iGetId()) SHOW_BUFFER(3); if (event.GetId() == p_buffer_tex->GetId()) { - if(Memory.IsGoodAddr(render.m_textures[m_cur_texture].m_offset) && render.m_textures[m_cur_texture].m_width && render.m_textures[m_cur_texture].m_height) + if(Memory.IsGoodAddr(GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation())) && render.m_textures[m_cur_texture].GetWidth() && render.m_textures[m_cur_texture].GetHeight()) MemoryViewerPanel::ShowImage(this, - render.m_textures[m_cur_texture].m_offset, 0, - render.m_textures[m_cur_texture].m_width, - render.m_textures[m_cur_texture].m_height, false); + GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()), 1, + render.m_textures[m_cur_texture].GetWidth(), + render.m_textures[m_cur_texture].GetHeight(), false); } #undef SHOW_BUFFER @@ -417,15 +417,15 @@ void RSXDebugger::GetBuffers() } // Draw Texture - u32 TexBuffer_addr = render.m_textures[m_cur_texture].m_offset; + u32 TexBuffer_addr = GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()); if(!Memory.IsGoodAddr(TexBuffer_addr)) return; unsigned char* TexBuffer = (unsigned char*)Memory.VirtualToRealAddr(TexBuffer_addr); - u32 width = render.m_textures[m_cur_texture].m_width; - u32 height = render.m_textures[m_cur_texture].m_height; + u32 width = render.m_textures[m_cur_texture].GetWidth(); + u32 height = render.m_textures[m_cur_texture].GetHeight(); unsigned char* buffer = (unsigned char*)malloc(width * height * 3); memcpy(buffer, TexBuffer, width * height * 3); @@ -484,19 +484,22 @@ void RSXDebugger::GetTexture() for(uint i=0; iInsertItem(i, wxString::Format("%d", i)); - m_list_texture->SetItem(i, 1, wxString::Format("0x%x", render.m_textures[i].m_offset)); - m_list_texture->SetItem(i, 2, render.m_textures[i].m_cubemap ? "True" : "False"); - m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].m_dimension)); - m_list_texture->SetItem(i, 4, render.m_textures[i].m_enabled ? "True" : "False"); - m_list_texture->SetItem(i, 5, wxString::Format("0x%x", render.m_textures[i].m_format)); - m_list_texture->SetItem(i, 6, wxString::Format("0x%x", render.m_textures[i].m_mipmap)); - m_list_texture->SetItem(i, 7, wxString::Format("0x%x", render.m_textures[i].m_pitch)); - m_list_texture->SetItem(i, 8, wxString::Format("%dx%d", - render.m_textures[i].m_width, - render.m_textures[i].m_height)); + if(render.m_textures[i].IsEnabled()) + { + m_list_texture->InsertItem(i, wxString::Format("%d", i)); + m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[i].GetOffset(), render.m_textures[i].GetLocation()))); + m_list_texture->SetItem(i, 2, render.m_textures[i].isCubemap() ? "True" : "False"); + m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].GetDimension())); + m_list_texture->SetItem(i, 4, render.m_textures[i].IsEnabled() ? "True" : "False"); + m_list_texture->SetItem(i, 5, wxString::Format("0x%x", render.m_textures[i].GetFormat())); + m_list_texture->SetItem(i, 6, wxString::Format("0x%x", render.m_textures[i].Getmipmap())); + m_list_texture->SetItem(i, 7, wxString::Format("0x%x", render.m_textures[i].m_pitch)); + m_list_texture->SetItem(i, 8, wxString::Format("%dx%d", + render.m_textures[i].GetWidth(), + render.m_textures[i].GetHeight())); - m_list_texture->SetItemBackgroundColour(i, wxColour(m_cur_texture == i ? "Wheat" : "White")); + m_list_texture->SetItemBackgroundColour(i, wxColour(m_cur_texture == i ? "Wheat" : "White")); + } } } diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index d54859b8a4..05dbb2f58a 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -243,6 +243,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index a076af31e7..d7f9c7563c 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -394,7 +394,10 @@ Loader - + + Emu\GS + + Emu\SysCalls\Modules From 5d59dae73045cf70cf70ba95eda3f42e028cd6eb Mon Sep 17 00:00:00 2001 From: DH Date: Sun, 16 Feb 2014 11:39:03 +0200 Subject: [PATCH 4/7] Fixed RSXDebugger --- rpcs3/Gui/RSXDebugger.cpp | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/rpcs3/Gui/RSXDebugger.cpp b/rpcs3/Gui/RSXDebugger.cpp index 085d449c67..db0f1341ba 100644 --- a/rpcs3/Gui/RSXDebugger.cpp +++ b/rpcs3/Gui/RSXDebugger.cpp @@ -293,9 +293,11 @@ void RSXDebugger::OnClickBuffer(wxMouseEvent& event) if (event.GetId() == p_buffer_colorD->GetId()) SHOW_BUFFER(3); if (event.GetId() == p_buffer_tex->GetId()) { - if(Memory.IsGoodAddr(GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation())) && render.m_textures[m_cur_texture].GetWidth() && render.m_textures[m_cur_texture].GetHeight()) + u8 location = render.m_textures[m_cur_texture].GetLocation(); + if(location <= 1 && Memory.IsGoodAddr(GetAddress(render.m_textures[m_cur_texture].GetOffset(), location)) + && render.m_textures[m_cur_texture].GetWidth() && render.m_textures[m_cur_texture].GetHeight()) MemoryViewerPanel::ShowImage(this, - GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()), 1, + GetAddress(render.m_textures[m_cur_texture].GetOffset(), location), 1, render.m_textures[m_cur_texture].GetWidth(), render.m_textures[m_cur_texture].GetHeight(), false); } @@ -417,7 +419,20 @@ void RSXDebugger::GetBuffers() } // Draw Texture - u32 TexBuffer_addr = GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()); + if(!render.m_textures[m_cur_texture].IsEnabled()) + return; + + u32 offset = render.m_textures[m_cur_texture].GetOffset(); + + if(!offset) + return; + + u8 location = render.m_textures[m_cur_texture].GetLocation(); + + if(location > 1) + return; + + u32 TexBuffer_addr = GetAddress(offset, location); if(!Memory.IsGoodAddr(TexBuffer_addr)) return; @@ -487,7 +502,17 @@ void RSXDebugger::GetTexture() if(render.m_textures[i].IsEnabled()) { m_list_texture->InsertItem(i, wxString::Format("%d", i)); - m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[i].GetOffset(), render.m_textures[i].GetLocation()))); + u8 location = render.m_textures[i].GetLocation(); + if(location > 1) + { + m_list_texture->SetItem(i, 1, + wxString::Format("Bad address (offset=0x%x, location=%d)", render.m_textures[i].GetOffset(), location)); + } + else + { + m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[i].GetOffset(), location))); + } + m_list_texture->SetItem(i, 2, render.m_textures[i].isCubemap() ? "True" : "False"); m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].GetDimension())); m_list_texture->SetItem(i, 4, render.m_textures[i].IsEnabled() ? "True" : "False"); From 321d323beb944fc1b2d060774b5809e07424c2c9 Mon Sep 17 00:00:00 2001 From: DH Date: Sun, 16 Feb 2014 17:19:06 +0200 Subject: [PATCH 5/7] Improved VFS - Implemended vfsDir. - Improved vfsDevice. - Improved vfsFile. --- Utilities/Timer.h | 44 +++-- rpcs3.sln | 192 +-------------------- rpcs3/Emu/FS/VFS.cpp | 152 ++++++++++++++-- rpcs3/Emu/FS/VFS.h | 18 +- rpcs3/Emu/FS/vfsDevice.cpp | 20 ++- rpcs3/Emu/FS/vfsDevice.h | 23 +-- rpcs3/Emu/FS/vfsDeviceLocalFile.cpp | 14 ++ rpcs3/Emu/FS/vfsDeviceLocalFile.h | 9 + rpcs3/Emu/FS/vfsDir.cpp | 70 ++++++++ rpcs3/Emu/FS/vfsDir.h | 25 +++ rpcs3/Emu/FS/vfsDirBase.cpp | 14 +- rpcs3/Emu/FS/vfsDirBase.h | 5 +- rpcs3/Emu/FS/vfsFile.cpp | 44 +++-- rpcs3/Emu/FS/vfsFile.h | 8 +- rpcs3/Emu/FS/vfsFileBase.cpp | 4 +- rpcs3/Emu/FS/vfsFileBase.h | 33 ++-- rpcs3/Emu/FS/vfsLocalDir.cpp | 12 +- rpcs3/Emu/FS/vfsLocalDir.h | 3 +- rpcs3/Emu/FS/vfsLocalFile.cpp | 27 ++- rpcs3/Emu/FS/vfsLocalFile.h | 4 +- rpcs3/Emu/HDD/HDD.cpp | 13 ++ rpcs3/Emu/HDD/HDD.h | 28 +-- rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp | 13 +- rpcs3/Emu/SysCalls/Modules/sys_fs.cpp | 14 +- rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp | 23 +-- rpcs3/Emu/System.cpp | 6 +- rpcs3/Emu/System.h | 10 -- rpcs3/Gui/DisAsmFrame.cpp | 4 +- rpcs3/Gui/GameViewer.cpp | 6 +- rpcs3/Gui/VHDDManager.cpp | 2 +- rpcs3/Loader/Loader.cpp | 8 +- rpcs3/Loader/TRP.cpp | 2 +- rpcs3/rpcs3.vcxproj | 2 + rpcs3/rpcs3.vcxproj.filters | 12 +- rpcs3/stdafx.h | 3 +- 36 files changed, 479 insertions(+), 390 deletions(-) create mode 100644 rpcs3/Emu/FS/vfsDeviceLocalFile.cpp create mode 100644 rpcs3/Emu/FS/vfsDeviceLocalFile.h create mode 100644 rpcs3/Emu/FS/vfsDir.cpp create mode 100644 rpcs3/Emu/FS/vfsDir.h diff --git a/Utilities/Timer.h b/Utilities/Timer.h index ce4dc6a12d..6be99c9e52 100644 --- a/Utilities/Timer.h +++ b/Utilities/Timer.h @@ -1,38 +1,52 @@ #pragma once #include -using namespace std::chrono; class Timer { private: - bool stopped; - high_resolution_clock::time_point start; - high_resolution_clock::time_point end; + bool m_stopped; + std::chrono::high_resolution_clock::time_point m_start; + std::chrono::high_resolution_clock::time_point m_end; public: - Timer() : stopped(false) + Timer() : m_stopped(false) { } void Start() { - stopped = false; - start = high_resolution_clock::now(); + m_stopped = false; + m_start = std::chrono::high_resolution_clock::now(); } void Stop() { - stopped = true; - end = high_resolution_clock::now(); + m_stopped = true; + m_end = std::chrono::high_resolution_clock::now(); } - double GetElapsedTimeInSec(){return GetElapsedTimeInMicroSec() / 1000000.0;} - double GetElapsedTimeInMilliSec(){return GetElapsedTimeInMicroSec() / 1000.0;} - double GetElapsedTimeInMicroSec() + double GetElapsedTimeInSec() const { - if (!stopped) - end = high_resolution_clock::now(); - return duration_cast(end - start).count(); + return GetElapsedTimeInMicroSec() / 1000000.0; + } + + double GetElapsedTimeInMilliSec() const + { + return GetElapsedTimeInMicroSec() / 1000.0; + } + + double GetElapsedTimeInMicroSec() const + { + std::chrono::high_resolution_clock::time_point now = m_stopped ? m_end : std::chrono::high_resolution_clock::now(); + + return std::chrono::duration_cast(now - m_start).count(); + } + + double GetElapsedTimeInNanoSec() const + { + std::chrono::high_resolution_clock::time_point now = m_stopped ? m_end : std::chrono::high_resolution_clock::now(); + + return std::chrono::duration_cast(now - m_start).count(); } }; diff --git a/rpcs3.sln b/rpcs3.sln index 6074f13ecc..0d54438b39 100644 --- a/rpcs3.sln +++ b/rpcs3.sln @@ -1,7 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30110.0 -MinimumVisualStudioVersion = 10.0.40219.1 +# Visual Studio 2012 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpcs3", "rpcs3\rpcs3.vcxproj", "{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}" ProjectSection(ProjectDependencies) = postProject {CD478F02-7550-58A5-E085-CE4BC0C0AD23} = {CD478F02-7550-58A5-E085-CE4BC0C0AD23} @@ -124,10 +122,6 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 - DLL Debug|Win32 = DLL Debug|Win32 - DLL Debug|x64 = DLL Debug|x64 - DLL Release|Win32 = DLL Release|Win32 - DLL Release|x64 = DLL Release|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection @@ -136,14 +130,6 @@ Global {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|Win32.Build.0 = Debug|Win32 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|x64.ActiveCfg = Debug|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|x64.Build.0 = Debug|x64 - {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Debug|Win32.ActiveCfg = Debug|Win32 - {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Debug|Win32.Build.0 = Debug|Win32 - {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Debug|x64.ActiveCfg = Debug|x64 - {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Debug|x64.Build.0 = Debug|x64 - {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Release|Win32.ActiveCfg = Release|Win32 - {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Release|Win32.Build.0 = Release|Win32 - {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Release|x64.ActiveCfg = Release|x64 - {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.DLL Release|x64.Build.0 = Release|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|Win32.ActiveCfg = Release|Win32 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|Win32.Build.0 = Release|Win32 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|x64.ActiveCfg = Release|x64 @@ -152,14 +138,6 @@ Global {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|Win32.Build.0 = Debug|Win32 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|x64.ActiveCfg = Debug|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|x64.Build.0 = Debug|x64 - {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.DLL Release|x64.Build.0 = DLL Release|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|Win32.ActiveCfg = Release|Win32 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|Win32.Build.0 = Release|Win32 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|x64.ActiveCfg = Release|x64 @@ -168,14 +146,6 @@ Global {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|Win32.Build.0 = Debug|Win32 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|x64.ActiveCfg = Debug|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|x64.Build.0 = Debug|x64 - {7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {7047EE97-7F80-A70D-6147-BC11102DB6F4}.DLL Release|x64.Build.0 = DLL Release|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|Win32.ActiveCfg = Release|Win32 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|Win32.Build.0 = Release|Win32 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|x64.ActiveCfg = Release|x64 @@ -184,14 +154,6 @@ Global {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|Win32.Build.0 = Debug|Win32 {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|x64.ActiveCfg = Debug|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|x64.Build.0 = Debug|x64 - {3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {3111D679-7796-23C4-BA0C-271F1145DA24}.DLL Release|x64.Build.0 = DLL Release|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Release|Win32.ActiveCfg = Release|Win32 {3111D679-7796-23C4-BA0C-271F1145DA24}.Release|Win32.Build.0 = Release|Win32 {3111D679-7796-23C4-BA0C-271F1145DA24}.Release|x64.ActiveCfg = Release|x64 @@ -200,14 +162,6 @@ Global {067D9406-2A93-DACA-9449-93A2D356357D}.Debug|Win32.Build.0 = Debug|Win32 {067D9406-2A93-DACA-9449-93A2D356357D}.Debug|x64.ActiveCfg = Debug|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Debug|x64.Build.0 = Debug|x64 - {067D9406-2A93-DACA-9449-93A2D356357D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {067D9406-2A93-DACA-9449-93A2D356357D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {067D9406-2A93-DACA-9449-93A2D356357D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {067D9406-2A93-DACA-9449-93A2D356357D}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {067D9406-2A93-DACA-9449-93A2D356357D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {067D9406-2A93-DACA-9449-93A2D356357D}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {067D9406-2A93-DACA-9449-93A2D356357D}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {067D9406-2A93-DACA-9449-93A2D356357D}.DLL Release|x64.Build.0 = DLL Release|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Release|Win32.ActiveCfg = Release|Win32 {067D9406-2A93-DACA-9449-93A2D356357D}.Release|Win32.Build.0 = Release|Win32 {067D9406-2A93-DACA-9449-93A2D356357D}.Release|x64.ActiveCfg = Release|x64 @@ -216,14 +170,6 @@ Global {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|Win32.Build.0 = Debug|Win32 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|x64.ActiveCfg = Debug|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|x64.Build.0 = Debug|x64 - {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.DLL Release|x64.Build.0 = DLL Release|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|Win32.ActiveCfg = Release|Win32 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|Win32.Build.0 = Release|Win32 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|x64.ActiveCfg = Release|x64 @@ -232,14 +178,6 @@ Global {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|Win32.Build.0 = Debug|Win32 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|x64.ActiveCfg = Debug|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|x64.Build.0 = Debug|x64 - {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.DLL Release|x64.Build.0 = DLL Release|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|Win32.ActiveCfg = Release|Win32 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|Win32.Build.0 = Release|Win32 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|x64.ActiveCfg = Release|x64 @@ -248,14 +186,6 @@ Global {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|Win32.Build.0 = Debug|Win32 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|x64.ActiveCfg = Debug|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|x64.Build.0 = Debug|x64 - {6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {6EDC3B79-D217-F11A-406F-F11D856493F9}.DLL Release|x64.Build.0 = DLL Release|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|Win32.ActiveCfg = Release|Win32 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|Win32.Build.0 = Release|Win32 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|x64.ActiveCfg = Release|x64 @@ -264,14 +194,6 @@ Global {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|Win32.Build.0 = Debug|Win32 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|x64.ActiveCfg = Debug|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|x64.Build.0 = Debug|x64 - {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.DLL Release|x64.Build.0 = DLL Release|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|Win32.ActiveCfg = Release|Win32 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|Win32.Build.0 = Release|Win32 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|x64.ActiveCfg = Release|x64 @@ -280,14 +202,6 @@ Global {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|Win32.Build.0 = Debug|Win32 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|x64.ActiveCfg = Debug|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|x64.Build.0 = Debug|x64 - {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.DLL Release|x64.Build.0 = DLL Release|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|Win32.ActiveCfg = Release|Win32 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|Win32.Build.0 = Release|Win32 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|x64.ActiveCfg = Release|x64 @@ -296,14 +210,6 @@ Global {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|Win32.Build.0 = Debug|Win32 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|x64.ActiveCfg = Debug|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|x64.Build.0 = Debug|x64 - {22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {22B14659-C5B6-B775-868D-A49198FEAD4A}.DLL Release|x64.Build.0 = DLL Release|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|Win32.ActiveCfg = Release|Win32 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|Win32.Build.0 = Release|Win32 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|x64.ActiveCfg = Release|x64 @@ -312,14 +218,6 @@ Global {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|Win32.Build.0 = Debug|Win32 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|x64.ActiveCfg = Debug|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|x64.Build.0 = Debug|x64 - {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.DLL Release|x64.Build.0 = DLL Release|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|Win32.ActiveCfg = Release|Win32 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|Win32.Build.0 = Release|Win32 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|x64.ActiveCfg = Release|x64 @@ -328,14 +226,6 @@ Global {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|Win32.Build.0 = Debug|Win32 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|x64.ActiveCfg = Debug|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|x64.Build.0 = Debug|x64 - {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.DLL Release|x64.Build.0 = DLL Release|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|Win32.ActiveCfg = Release|Win32 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|Win32.Build.0 = Release|Win32 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|x64.ActiveCfg = Release|x64 @@ -344,14 +234,6 @@ Global {5C363C34-4741-7036-861C-2E2279CF552E}.Debug|Win32.Build.0 = Debug|Win32 {5C363C34-4741-7036-861C-2E2279CF552E}.Debug|x64.ActiveCfg = Debug|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Debug|x64.Build.0 = Debug|x64 - {5C363C34-4741-7036-861C-2E2279CF552E}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {5C363C34-4741-7036-861C-2E2279CF552E}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {5C363C34-4741-7036-861C-2E2279CF552E}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {5C363C34-4741-7036-861C-2E2279CF552E}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {5C363C34-4741-7036-861C-2E2279CF552E}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {5C363C34-4741-7036-861C-2E2279CF552E}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {5C363C34-4741-7036-861C-2E2279CF552E}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {5C363C34-4741-7036-861C-2E2279CF552E}.DLL Release|x64.Build.0 = DLL Release|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Release|Win32.ActiveCfg = Release|Win32 {5C363C34-4741-7036-861C-2E2279CF552E}.Release|Win32.Build.0 = Release|Win32 {5C363C34-4741-7036-861C-2E2279CF552E}.Release|x64.ActiveCfg = Release|x64 @@ -360,14 +242,6 @@ Global {76169FE8-0814-4F36-6409-699EF1A23001}.Debug|Win32.Build.0 = Debug|Win32 {76169FE8-0814-4F36-6409-699EF1A23001}.Debug|x64.ActiveCfg = Debug|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Debug|x64.Build.0 = Debug|x64 - {76169FE8-0814-4F36-6409-699EF1A23001}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {76169FE8-0814-4F36-6409-699EF1A23001}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {76169FE8-0814-4F36-6409-699EF1A23001}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {76169FE8-0814-4F36-6409-699EF1A23001}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {76169FE8-0814-4F36-6409-699EF1A23001}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {76169FE8-0814-4F36-6409-699EF1A23001}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {76169FE8-0814-4F36-6409-699EF1A23001}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {76169FE8-0814-4F36-6409-699EF1A23001}.DLL Release|x64.Build.0 = DLL Release|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Release|Win32.ActiveCfg = Release|Win32 {76169FE8-0814-4F36-6409-699EF1A23001}.Release|Win32.Build.0 = Release|Win32 {76169FE8-0814-4F36-6409-699EF1A23001}.Release|x64.ActiveCfg = Release|x64 @@ -376,14 +250,6 @@ Global {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|Win32.Build.0 = Debug|Win32 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|x64.ActiveCfg = Debug|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|x64.Build.0 = Debug|x64 - {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.DLL Release|x64.Build.0 = DLL Release|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|Win32.ActiveCfg = Release|Win32 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|Win32.Build.0 = Release|Win32 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|x64.ActiveCfg = Release|x64 @@ -392,14 +258,6 @@ Global {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|Win32.Build.0 = Debug|Win32 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|x64.ActiveCfg = Debug|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|x64.Build.0 = Debug|x64 - {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.DLL Release|x64.Build.0 = DLL Release|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|Win32.ActiveCfg = Release|Win32 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|Win32.Build.0 = Release|Win32 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|x64.ActiveCfg = Release|x64 @@ -408,14 +266,6 @@ Global {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|Win32.Build.0 = Debug|Win32 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|x64.ActiveCfg = Debug|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|x64.Build.0 = Debug|x64 - {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.DLL Release|x64.Build.0 = DLL Release|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|Win32.ActiveCfg = Release|Win32 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|Win32.Build.0 = Release|Win32 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|x64.ActiveCfg = Release|x64 @@ -424,14 +274,6 @@ Global {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|Win32.Build.0 = Debug|Win32 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|x64.ActiveCfg = Debug|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|x64.Build.0 = Debug|x64 - {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.DLL Release|x64.Build.0 = DLL Release|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|Win32.ActiveCfg = Release|Win32 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|Win32.Build.0 = Release|Win32 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|x64.ActiveCfg = Release|x64 @@ -440,14 +282,6 @@ Global {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|Win32.Build.0 = Debug|Win32 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|x64.ActiveCfg = Debug|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|x64.Build.0 = Debug|x64 - {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.DLL Release|x64.Build.0 = DLL Release|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|Win32.ActiveCfg = Release|Win32 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|Win32.Build.0 = Release|Win32 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|x64.ActiveCfg = Release|x64 @@ -456,14 +290,6 @@ Global {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|Win32.Build.0 = Debug|Win32 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|x64.ActiveCfg = Debug|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|x64.Build.0 = Debug|x64 - {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.DLL Release|x64.Build.0 = DLL Release|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|Win32.ActiveCfg = Release|Win32 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|Win32.Build.0 = Release|Win32 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|x64.ActiveCfg = Release|x64 @@ -472,14 +298,6 @@ Global {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|Win32.Build.0 = Debug|Win32 {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|x64.ActiveCfg = Debug|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|x64.Build.0 = Debug|x64 - {23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {23E1C437-A951-5943-8639-A17F3CF2E606}.DLL Release|x64.Build.0 = DLL Release|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Release|Win32.ActiveCfg = Release|Win32 {23E1C437-A951-5943-8639-A17F3CF2E606}.Release|Win32.Build.0 = Release|Win32 {23E1C437-A951-5943-8639-A17F3CF2E606}.Release|x64.ActiveCfg = Release|x64 @@ -488,14 +306,6 @@ Global {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|Win32.Build.0 = Debug|Win32 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|x64.ActiveCfg = Debug|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|x64.Build.0 = Debug|x64 - {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.DLL Release|x64.Build.0 = DLL Release|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|Win32.ActiveCfg = Release|Win32 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|Win32.Build.0 = Release|Win32 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|x64.ActiveCfg = Release|x64 diff --git a/rpcs3/Emu/FS/VFS.cpp b/rpcs3/Emu/FS/VFS.cpp index c3725f2df8..a2cf13efcd 100644 --- a/rpcs3/Emu/FS/VFS.cpp +++ b/rpcs3/Emu/FS/VFS.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "VFS.h" #include "Emu/HDD/HDD.h" +#include "vfsDeviceLocalFile.h" int sort_devices(const void* _a, const void* _b) { @@ -22,7 +23,7 @@ void VFS::Mount(const wxString& ps3_path, const wxString& local_path, vfsDevice* if(m_devices.GetCount() > 1) { - std::qsort(m_devices.GetPtr(), m_devices.GetCount(), sizeof(vfsDevice*), sort_devices); + //std::qsort(m_devices.GetPtr(), m_devices.GetCount(), sizeof(vfsDevice*), sort_devices); } } @@ -49,37 +50,150 @@ void VFS::UnMountAll() } } -vfsStream* VFS::Open(const wxString& ps3_path, vfsOpenMode mode) +std::shared_ptr VFS::OpenFile(const wxString& ps3_path, vfsOpenMode mode) const { - vfsDevice* stream = nullptr; - wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - stream = dev->GetNew(); - stream->Open(path, mode); + if(std::shared_ptr res = dev->GetNewFileStream()) + { + res->Open(path, mode); + return res; + } } - return stream; + return nullptr; } -void VFS::Create(const wxString& ps3_path) +std::shared_ptr VFS::OpenDir(const wxString& ps3_path) const { wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - dev->Create(path); + if(std::shared_ptr res = dev->GetNewDirStream()) + { + res->Open(path); + return res; + } } + + return nullptr; } -void VFS::Close(vfsStream*& device) +bool VFS::CreateFile(const wxString& ps3_path) const { - delete device; - device = nullptr; + wxString path; + if(vfsDevice* dev = GetDevice(ps3_path, path)) + { + if(std::shared_ptr res = dev->GetNewFileStream()) + { + return res->Create(path); + } + } + + return false; } -vfsDevice* VFS::GetDevice(const wxString& ps3_path, wxString& path) +bool VFS::CreateDir(const wxString& ps3_path) const +{ + wxString path; + if(vfsDevice* dev = GetDevice(ps3_path, path)) + { + if(std::shared_ptr res = dev->GetNewDirStream()) + { + return res->Create(path); + } + } + + return false; +} + +bool VFS::RemoveFile(const wxString& ps3_path) const +{ + wxString path; + if(vfsDevice* dev = GetDevice(ps3_path, path)) + { + if(std::shared_ptr res = dev->GetNewFileStream()) + { + return res->Remove(path); + } + } + + return false; +} + +bool VFS::RemoveDir(const wxString& ps3_path) const +{ + wxString path; + if(vfsDevice* dev = GetDevice(ps3_path, path)) + { + if(std::shared_ptr res = dev->GetNewDirStream()) + { + return res->Remove(path); + } + } + + return false; +} + +bool VFS::ExistsFile(const wxString& ps3_path) const +{ + wxString path; + if(vfsDevice* dev = GetDevice(ps3_path, path)) + { + if(std::shared_ptr res = dev->GetNewFileStream()) + { + return res->Exists(path); + } + } + + return false; +} + +bool VFS::ExistsDir(const wxString& ps3_path) const +{ + wxString path; + if(vfsDevice* dev = GetDevice(ps3_path, path)) + { + if(std::shared_ptr res = dev->GetNewDirStream()) + { + return res->IsExists(path); + } + } + + return false; +} + +bool VFS::RenameFile(const wxString& ps3_path_from, const wxString& ps3_path_to) const +{ + wxString path; + if(vfsDevice* dev = GetDevice(ps3_path_from, path)) + { + if(std::shared_ptr res = dev->GetNewFileStream()) + { + return res->Rename(path, ps3_path_to); + } + } + + return false; +} + +bool VFS::RenameDir(const wxString& ps3_path_from, const wxString& ps3_path_to) const +{ + wxString path; + if(vfsDevice* dev = GetDevice(ps3_path_from, path)) + { + if(std::shared_ptr res = dev->GetNewDirStream()) + { + return res->Rename(path, ps3_path_to); + } + } + + return false; +} + +vfsDevice* VFS::GetDevice(const wxString& ps3_path, wxString& path) const { u32 max_eq; s32 max_i=-1; @@ -101,14 +215,18 @@ vfsDevice* VFS::GetDevice(const wxString& ps3_path, wxString& path) return &m_devices[max_i]; } -vfsDevice* VFS::GetDeviceLocal(const wxString& local_path, wxString& path) +vfsDevice* VFS::GetDeviceLocal(const wxString& local_path, wxString& path) const { u32 max_eq; s32 max_i=-1; + wxFileName file_path(local_path); + file_path.Normalize(); + wxString mormalized_path = file_path.GetFullPath(); + for(u32 i=0; i max_eq) { @@ -135,11 +253,11 @@ void VFS::Init(const wxString& path) switch(entries[i].device) { case vfsDevice_LocalFile: - dev = new vfsLocalFile(); + dev = new vfsDeviceLocalFile(); break; case vfsDevice_HDD: - dev = new vfsHDD(entries[i].device_path); + dev = new vfsDeviceHDD(entries[i].device_path); break; default: diff --git a/rpcs3/Emu/FS/VFS.h b/rpcs3/Emu/FS/VFS.h index 2a09f20b74..e10fedea36 100644 --- a/rpcs3/Emu/FS/VFS.h +++ b/rpcs3/Emu/FS/VFS.h @@ -36,11 +36,19 @@ struct VFS void UnMount(const wxString& ps3_path); void UnMountAll(); - vfsStream* Open(const wxString& ps3_path, vfsOpenMode mode); - void Create(const wxString& ps3_path); - void Close(vfsStream*& device); - vfsDevice* GetDevice(const wxString& ps3_path, wxString& path); - vfsDevice* GetDeviceLocal(const wxString& local_path, wxString& path); + std::shared_ptr OpenFile(const wxString& ps3_path, vfsOpenMode mode) const; + std::shared_ptr OpenDir(const wxString& ps3_path) const; + bool CreateFile(const wxString& ps3_path) const; + bool CreateDir(const wxString& ps3_path) const; + bool RemoveFile(const wxString& ps3_path) const; + bool RemoveDir(const wxString& ps3_path) const; + bool ExistsFile(const wxString& ps3_path) const; + bool ExistsDir(const wxString& ps3_path) const; + bool RenameFile(const wxString& ps3_path_from, const wxString& ps3_path_to) const; + bool RenameDir(const wxString& ps3_path_from, const wxString& ps3_path_to) const; + + vfsDevice* GetDevice(const wxString& ps3_path, wxString& path) const; + vfsDevice* GetDeviceLocal(const wxString& local_path, wxString& path) const; void Init(const wxString& path); void SaveLoadDevices(Array& res, bool is_load); diff --git a/rpcs3/Emu/FS/vfsDevice.cpp b/rpcs3/Emu/FS/vfsDevice.cpp index 084269e50d..df79fcdfb4 100644 --- a/rpcs3/Emu/FS/vfsDevice.cpp +++ b/rpcs3/Emu/FS/vfsDevice.cpp @@ -45,14 +45,20 @@ u32 vfsDevice::CmpLocalPath(const wxString& local_path) if(local_path.Len() < m_local_path.Len()) return 0; - const u32 lim = min(m_local_path.Len(), local_path.Len()); + wxFileName path0(m_local_path); + path0.Normalize(); + + wxArrayString arr0 = wxSplit(path0.GetFullPath(), '\\'); + wxArrayString arr1 = wxSplit(local_path, '\\'); + + const u32 lim = min(arr0.GetCount(), arr1.GetCount()); u32 ret = 0; - for(u32 i=0; i +#include "vfsFileBase.h" +#include "vfsDirBase.h" -enum vfsOpenMode -{ - vfsRead = 0x1, - vfsWrite = 0x2, - vfsExcl = 0x4, - vfsAppend = 0x8, - vfsReadWrite = vfsRead | vfsWrite, - vfsWriteExcl = vfsWrite | vfsExcl, - vfsWriteAppend = vfsWrite | vfsAppend, -}; - -class vfsDevice : public vfsStream +class vfsDevice { wxString m_ps3_path; wxString m_local_path; @@ -23,9 +12,9 @@ public: vfsDevice(const wxString& ps3_path, const wxString& local_path); vfsDevice() {} - virtual vfsDevice* GetNew()=0; - virtual bool Open(const wxString& path, vfsOpenMode mode = vfsRead)=0; - virtual bool Create(const wxString& path)=0; + virtual std::shared_ptr GetNewFileStream()=0; + virtual std::shared_ptr GetNewDirStream()=0; + wxString GetLocalPath() const; wxString GetPs3Path() const; diff --git a/rpcs3/Emu/FS/vfsDeviceLocalFile.cpp b/rpcs3/Emu/FS/vfsDeviceLocalFile.cpp new file mode 100644 index 0000000000..c89bd8dd2e --- /dev/null +++ b/rpcs3/Emu/FS/vfsDeviceLocalFile.cpp @@ -0,0 +1,14 @@ +#include "stdafx.h" +#include "vfsDeviceLocalFile.h" +#include "vfsLocalFile.h" +#include "vfsLocalDir.h" + +std::shared_ptr vfsDeviceLocalFile::GetNewFileStream() +{ + return std::make_shared(this); +} + +std::shared_ptr vfsDeviceLocalFile::GetNewDirStream() +{ + return std::make_shared(this); +} diff --git a/rpcs3/Emu/FS/vfsDeviceLocalFile.h b/rpcs3/Emu/FS/vfsDeviceLocalFile.h new file mode 100644 index 0000000000..bab7bfb75c --- /dev/null +++ b/rpcs3/Emu/FS/vfsDeviceLocalFile.h @@ -0,0 +1,9 @@ +#pragma once +#include "vfsDevice.h" + +class vfsDeviceLocalFile : public vfsDevice +{ +public: + virtual std::shared_ptr GetNewFileStream() override; + virtual std::shared_ptr GetNewDirStream() override; +}; \ No newline at end of file diff --git a/rpcs3/Emu/FS/vfsDir.cpp b/rpcs3/Emu/FS/vfsDir.cpp new file mode 100644 index 0000000000..ff7d7f4a81 --- /dev/null +++ b/rpcs3/Emu/FS/vfsDir.cpp @@ -0,0 +1,70 @@ +#include "stdafx.h" +#include "vfsDir.h" + +vfsDir::vfsDir() + : vfsDirBase(nullptr) + , m_stream(nullptr) +{ +} + +vfsDir::vfsDir(const wxString path) + : vfsDirBase(nullptr) + , m_stream(nullptr) +{ + Open(path); +} + +bool vfsDir::Open(const wxString& path) +{ + Close(); + + m_stream = Emu.GetVFS().OpenDir(path); + + return m_stream && m_stream->IsOpened(); +} + +bool vfsDir::Create(const wxString& path) +{ + return m_stream->Create(path); +} + +bool vfsDir::IsExists(const wxString& path) const +{ + return m_stream->IsExists(path); +} + +const Array& vfsDir::GetEntries() const +{ + return m_stream->GetEntries(); +} + +bool vfsDir::Rename(const wxString& from, const wxString& to) +{ + return m_stream->Rename(from, to); +} + +bool vfsDir::Remove(const wxString& path) +{ + return m_stream->Remove(path); +} + +const DirEntryInfo* vfsDir::Read() +{ + return m_stream->Read(); +} + +void vfsDir::Close() +{ + m_stream.reset(); + return vfsDirBase::Close(); +} + +wxString vfsDir::GetPath() const +{ + return m_stream->GetPath(); +} + +bool vfsDir::IsOpened() const +{ + return m_stream && m_stream->IsOpened() && vfsDirBase::IsOpened(); +} diff --git a/rpcs3/Emu/FS/vfsDir.h b/rpcs3/Emu/FS/vfsDir.h new file mode 100644 index 0000000000..531403c854 --- /dev/null +++ b/rpcs3/Emu/FS/vfsDir.h @@ -0,0 +1,25 @@ +#pragma once +#include "vfsDirBase.h" + +class vfsDir : public vfsDirBase +{ +private: + std::shared_ptr m_stream; + +public: + vfsDir(); + vfsDir(const wxString path); + + virtual bool Open(const wxString& path) override; + virtual bool IsOpened() const override; + virtual bool IsExists(const wxString& path) const override; + virtual const Array& GetEntries() const override; + virtual void Close() override; + virtual wxString GetPath() const override; + + virtual bool Create(const wxString& path) override; + //virtual bool Create(const DirEntryInfo& info) override; + virtual bool Rename(const wxString& from, const wxString& to) override; + virtual bool Remove(const wxString& path) override; + virtual const DirEntryInfo* Read() override; +}; \ No newline at end of file diff --git a/rpcs3/Emu/FS/vfsDirBase.cpp b/rpcs3/Emu/FS/vfsDirBase.cpp index 8e5c945e36..c7d1f65fb2 100644 --- a/rpcs3/Emu/FS/vfsDirBase.cpp +++ b/rpcs3/Emu/FS/vfsDirBase.cpp @@ -1,9 +1,10 @@ #include "stdafx.h" #include "vfsDirBase.h" -vfsDirBase::vfsDirBase(const wxString& path) +vfsDirBase::vfsDirBase(vfsDevice* device) + : m_pos(0) + , m_device(device) { - Open(path); } vfsDirBase::~vfsDirBase() @@ -18,6 +19,7 @@ bool vfsDirBase::Open(const wxString& path) if(!IsExists(path)) return false; + m_pos = 0; m_cwd += '/' + path; return true; } @@ -46,4 +48,12 @@ void vfsDirBase::Close() wxString vfsDirBase::GetPath() const { return m_cwd; +} + +const DirEntryInfo* vfsDirBase::Read() +{ + if (m_pos >= m_entries.GetCount()) + return nullptr; + + return &m_entries[m_pos++]; } \ No newline at end of file diff --git a/rpcs3/Emu/FS/vfsDirBase.h b/rpcs3/Emu/FS/vfsDirBase.h index a1d5301efe..05a9fb0a87 100644 --- a/rpcs3/Emu/FS/vfsDirBase.h +++ b/rpcs3/Emu/FS/vfsDirBase.h @@ -32,9 +32,11 @@ class vfsDirBase protected: wxString m_cwd; Array m_entries; + uint m_pos; + vfsDevice* m_device; public: - vfsDirBase(const wxString& path); + vfsDirBase(vfsDevice* device); virtual ~vfsDirBase(); virtual bool Open(const wxString& path); @@ -48,4 +50,5 @@ public: //virtual bool Create(const DirEntryInfo& info)=0; virtual bool Rename(const wxString& from, const wxString& to)=0; virtual bool Remove(const wxString& path)=0; + virtual const DirEntryInfo* Read(); }; \ No newline at end of file diff --git a/rpcs3/Emu/FS/vfsFile.cpp b/rpcs3/Emu/FS/vfsFile.cpp index 2e0ebdcd75..79d7bd99ed 100644 --- a/rpcs3/Emu/FS/vfsFile.cpp +++ b/rpcs3/Emu/FS/vfsFile.cpp @@ -2,55 +2,51 @@ #include "vfsFile.h" vfsFile::vfsFile() - : vfsFileBase() + : vfsFileBase(nullptr) , m_stream(nullptr) { } vfsFile::vfsFile(const wxString path, vfsOpenMode mode) - : vfsFileBase() + : vfsFileBase(nullptr) , m_stream(nullptr) { Open(path, mode); } -vfsFile::~vfsFile() -{ - Close(); -} - -vfsDevice* vfsFile::GetNew() -{ - return new vfsFile(); -} - bool vfsFile::Open(const wxString& path, vfsOpenMode mode) { Close(); - m_stream = Emu.GetVFS().Open(path, mode); + m_stream = Emu.GetVFS().OpenFile(path, mode); return m_stream && m_stream->IsOpened(); } bool vfsFile::Create(const wxString& path) { - if(wxFileExists(path)) return false; + return m_stream->Create(path); +} - wxFile f; - return f.Create(path); +bool vfsFile::Exists(const wxString& path) +{ + return m_stream->Exists(path); +} + +bool vfsFile::Rename(const wxString& from, const wxString& to) +{ + return m_stream->Rename(from, to); +} + +bool vfsFile::Remove(const wxString& path) +{ + return m_stream->Remove(path); } bool vfsFile::Close() { - if(m_stream) - { - delete m_stream; - m_stream = nullptr; - return vfsFileBase::Close(); - } - - return false; + m_stream.reset(); + return vfsFileBase::Close(); } u64 vfsFile::GetSize() diff --git a/rpcs3/Emu/FS/vfsFile.h b/rpcs3/Emu/FS/vfsFile.h index d9777b7203..3b2fd102fd 100644 --- a/rpcs3/Emu/FS/vfsFile.h +++ b/rpcs3/Emu/FS/vfsFile.h @@ -4,17 +4,17 @@ class vfsFile : public vfsFileBase { private: - vfsStream* m_stream; + std::shared_ptr m_stream; public: vfsFile(); vfsFile(const wxString path, vfsOpenMode mode = vfsRead); - ~vfsFile(); - - virtual vfsDevice* GetNew() override; virtual bool Open(const wxString& path, vfsOpenMode mode = vfsRead) override; virtual bool Create(const wxString& path) override; + virtual bool Exists(const wxString& path) override; + virtual bool Rename(const wxString& from, const wxString& to) override; + virtual bool Remove(const wxString& path) override; virtual bool Close() override; virtual u64 GetSize() override; diff --git a/rpcs3/Emu/FS/vfsFileBase.cpp b/rpcs3/Emu/FS/vfsFileBase.cpp index ed4afc0b1b..9209bb4619 100644 --- a/rpcs3/Emu/FS/vfsFileBase.cpp +++ b/rpcs3/Emu/FS/vfsFileBase.cpp @@ -1,7 +1,9 @@ #include "stdafx.h" #include "vfsFileBase.h" -vfsFileBase::vfsFileBase() : vfsDevice() +vfsFileBase::vfsFileBase(vfsDevice* device) + : vfsStream() + , m_device(device) { } diff --git a/rpcs3/Emu/FS/vfsFileBase.h b/rpcs3/Emu/FS/vfsFileBase.h index b7f2f1a2c5..78c310dada 100644 --- a/rpcs3/Emu/FS/vfsFileBase.h +++ b/rpcs3/Emu/FS/vfsFileBase.h @@ -1,24 +1,37 @@ #pragma once -#include "vfsDevice.h" +#include "vfsStream.h" -struct vfsFileBase : public vfsDevice +enum vfsOpenMode +{ + vfsRead = 0x1, + vfsWrite = 0x2, + vfsExcl = 0x4, + vfsAppend = 0x8, + vfsReadWrite = vfsRead | vfsWrite, + vfsWriteExcl = vfsWrite | vfsExcl, + vfsWriteAppend = vfsWrite | vfsAppend, +}; + +class vfsDevice; + +struct vfsFileBase : public vfsStream { protected: wxString m_path; vfsOpenMode m_mode; + vfsDevice* m_device; public: - vfsFileBase(); + vfsFileBase(vfsDevice* device); virtual ~vfsFileBase(); - virtual bool Open(const wxString& path, vfsOpenMode mode) override; + virtual bool Open(const wxString& path, vfsOpenMode mode); virtual bool Close() override; - /* - virtual bool Create(const wxString& path)=0; - virtual bool Exists(const wxString& path)=0; - virtual bool Rename(const wxString& from, const wxString& to)=0; - virtual bool Remove(const wxString& path)=0; - */ + virtual bool Create(const wxString& path) { return false; } + virtual bool Exists(const wxString& path) { return false; } + virtual bool Rename(const wxString& from, const wxString& to) { return false; } + virtual bool Remove(const wxString& path) { return false; } + wxString GetPath() const; vfsOpenMode GetOpenMode() const; }; diff --git a/rpcs3/Emu/FS/vfsLocalDir.cpp b/rpcs3/Emu/FS/vfsLocalDir.cpp index 291b34f9d2..144e5d46a4 100644 --- a/rpcs3/Emu/FS/vfsLocalDir.cpp +++ b/rpcs3/Emu/FS/vfsLocalDir.cpp @@ -2,9 +2,7 @@ #include "vfsLocalDir.h" #include -vfsLocalDir::vfsLocalDir(const wxString& path) - : vfsDirBase(path) - , m_pos(0) +vfsLocalDir::vfsLocalDir(vfsDevice* device) : vfsDirBase(device) { } @@ -39,14 +37,6 @@ bool vfsLocalDir::Open(const wxString& path) return true; } -const DirEntryInfo* vfsLocalDir::Read() -{ - if (m_pos >= m_entries.GetCount()) - return 0; - - return &m_entries[m_pos++]; -} - bool vfsLocalDir::Create(const wxString& path) { return wxFileName::Mkdir(path, 0777, wxPATH_MKDIR_FULL); diff --git a/rpcs3/Emu/FS/vfsLocalDir.h b/rpcs3/Emu/FS/vfsLocalDir.h index 860064aa13..56aa176756 100644 --- a/rpcs3/Emu/FS/vfsLocalDir.h +++ b/rpcs3/Emu/FS/vfsLocalDir.h @@ -7,11 +7,10 @@ private: u32 m_pos; public: - vfsLocalDir(const wxString& path = wxEmptyString); + vfsLocalDir(vfsDevice* device); virtual ~vfsLocalDir(); virtual bool Open(const wxString& path) override; - const DirEntryInfo* Read(); virtual bool Create(const wxString& path) override; virtual bool Rename(const wxString& from, const wxString& to) override; diff --git a/rpcs3/Emu/FS/vfsLocalFile.cpp b/rpcs3/Emu/FS/vfsLocalFile.cpp index 49ee33c57f..3746f94f41 100644 --- a/rpcs3/Emu/FS/vfsLocalFile.cpp +++ b/rpcs3/Emu/FS/vfsLocalFile.cpp @@ -27,28 +27,27 @@ static const wxSeekMode vfs2wx_seek(vfsSeekMode mode) return wxFromStart; } -vfsLocalFile::vfsLocalFile() : vfsFileBase() +vfsLocalFile::vfsLocalFile(vfsDevice* device) : vfsFileBase(device) { } -vfsLocalFile::vfsLocalFile(const wxString path, vfsOpenMode mode) : vfsFileBase() -{ - Open(path, mode); -} - -vfsDevice* vfsLocalFile::GetNew() -{ - return new vfsLocalFile(); -} - bool vfsLocalFile::Open(const wxString& path, vfsOpenMode mode) { Close(); - if(!m_file.Access(vfsDevice::GetWinPath(GetLocalPath(), path), vfs2wx_mode(mode))) return false; + if(m_device) + { + if(!m_file.Access(vfsDevice::GetWinPath(m_device->GetLocalPath(), path), vfs2wx_mode(mode))) return false; - return m_file.Open(vfsDevice::GetWinPath(GetLocalPath(), path), vfs2wx_mode(mode)) && - vfsFileBase::Open(vfsDevice::GetPs3Path(GetPs3Path(), path), mode); + return m_file.Open(vfsDevice::GetWinPath(m_device->GetLocalPath(), path), vfs2wx_mode(mode)) && + vfsFileBase::Open(vfsDevice::GetPs3Path(m_device->GetPs3Path(), path), mode); + } + else + { + if(!m_file.Access(path, vfs2wx_mode(mode))) return false; + + return m_file.Open(path, vfs2wx_mode(mode)) && vfsFileBase::Open(path, mode); + } } bool vfsLocalFile::Create(const wxString& path) diff --git a/rpcs3/Emu/FS/vfsLocalFile.h b/rpcs3/Emu/FS/vfsLocalFile.h index 963e622ea1..c380d53191 100644 --- a/rpcs3/Emu/FS/vfsLocalFile.h +++ b/rpcs3/Emu/FS/vfsLocalFile.h @@ -7,9 +7,7 @@ private: wxFile m_file; public: - vfsLocalFile(); - vfsLocalFile(const wxString path, vfsOpenMode mode = vfsRead); - vfsDevice* GetNew(); + vfsLocalFile(vfsDevice* device); virtual bool Open(const wxString& path, vfsOpenMode mode = vfsRead) override; virtual bool Create(const wxString& path) override; diff --git a/rpcs3/Emu/HDD/HDD.cpp b/rpcs3/Emu/HDD/HDD.cpp index 00f20832bd..7281289705 100644 --- a/rpcs3/Emu/HDD/HDD.cpp +++ b/rpcs3/Emu/HDD/HDD.cpp @@ -1,3 +1,16 @@ #include "stdafx.h" #include "HDD.h" +vfsDeviceHDD::vfsDeviceHDD(const std::string& hdd_path) : m_hdd_path(hdd_path) +{ +} + +std::shared_ptr vfsDeviceHDD::GetNewFileStream() +{ + return std::make_shared(this, m_hdd_path); +} + +std::shared_ptr vfsDeviceHDD::GetNewDirStream() +{ + return nullptr; +} diff --git a/rpcs3/Emu/HDD/HDD.h b/rpcs3/Emu/HDD/HDD.h index baa03fdfe0..b8d4773f08 100644 --- a/rpcs3/Emu/HDD/HDD.h +++ b/rpcs3/Emu/HDD/HDD.h @@ -262,7 +262,7 @@ public: if(!size) return 0; - vfsDeviceLocker lock(m_hdd); + //vfsDeviceLocker lock(m_hdd); const u32 block_size = m_hdd_info.block_size - sizeof(vfsHDD_Block); u64 rsize = min(block_size - m_position, size); @@ -310,7 +310,7 @@ public: if(!size) return 0; - vfsDeviceLocker lock(m_hdd); + //vfsDeviceLocker lock(m_hdd); const u32 block_size = m_hdd_info.block_size - sizeof(vfsHDD_Block); @@ -409,6 +409,17 @@ public: } }; +class vfsDeviceHDD : public vfsDevice +{ + std::string m_hdd_path; + +public: + vfsDeviceHDD(const std::string& hdd_path); + + virtual std::shared_ptr GetNewFileStream() override; + virtual std::shared_ptr GetNewDirStream() override; +}; + class vfsHDD : public vfsFileBase { vfsHDD_Hdr m_hdd_info; @@ -419,11 +430,13 @@ class vfsHDD : public vfsFileBase const wxString& m_hdd_path; public: - vfsHDD(const wxString& hdd_path) - : m_hdd_file(hdd_path, vfsReadWrite) + vfsHDD(vfsDevice* device, const wxString& hdd_path) + : m_hdd_file(device) , m_file(m_hdd_file, m_hdd_info) , m_hdd_path(hdd_path) + , vfsFileBase(device) { + m_hdd_file.Open(hdd_path, vfsReadWrite); m_hdd_file.Read(&m_hdd_info, sizeof(vfsHDD_Hdr)); m_cur_dir_block = m_hdd_info.next_block; if(!m_hdd_info.block_size) @@ -435,11 +448,6 @@ public: m_hdd_file.Read(&m_cur_dir, sizeof(vfsHDD_Entry)); } - virtual vfsDevice* GetNew() - { - return new vfsHDD(m_hdd_path); - } - __forceinline u32 GetMaxNameLen() const { return m_hdd_info.block_size - sizeof(vfsHDD_Entry); @@ -861,4 +869,4 @@ public: { return m_file.GetSize(); } -}; +}; \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index 237b148dac..ab542ecf20 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -961,7 +961,7 @@ int cellSysCacheMount(mem_ptr_t param) char id[CELL_SYSCACHE_ID_SIZE]; strncpy(id, param->cacheId, CELL_SYSCACHE_ID_SIZE); strncpy(param->getCachePath, ("/dev_hdd1/cache/" + std::string(id) + "/").c_str(), CELL_SYSCACHE_PATH_MAX); - Emu.GetVFS().Create(wxString(param->getCachePath)); + Emu.GetVFS().CreateFile(wxString(param->getCachePath)); return CELL_SYSCACHE_RET_OK_RELAYED; } diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index 9739d62468..494b542610 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -106,11 +106,7 @@ int sceNpTrophyCreateContext(mem32_t context, mem_ptr_t co // TODO: There are other possible errors // TODO: Is the TROPHY.TRP file necessarily located in this path? - wxString ps3_path = "/app_home/TROPDIR/"; - wxString local_path; - Emu.GetVFS().GetDevice(ps3_path, local_path); - - vfsLocalDir dir(local_path); + vfsDir dir("/app_home/TROPDIR/"); if(!dir.IsOpened()) return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST; @@ -119,13 +115,14 @@ int sceNpTrophyCreateContext(mem32_t context, mem_ptr_t co { if (entry->flags & DirEntry_TypeDir) { - vfsStream* stream = Emu.GetVFS().Open(ps3_path + entry->name + "/TROPHY.TRP", vfsRead); - if (stream) + auto f = Emu.GetVFS().OpenFile("/app_home/TROPDIR/" + entry->name + "/TROPHY.TRP", vfsRead); + if (f && f->IsOpened()) { sceNpTrophyInternalContext ctxt; - ctxt.trp_stream = stream; + ctxt.trp_stream = f.get(); ctxt.trp_name = entry->name; s_npTrophyInstance.contexts.push_back(ctxt); + f = nullptr; return CELL_OK; } } diff --git a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp index 1c8e07170d..0982a7c2d4 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp @@ -35,20 +35,18 @@ bool sdata_check(u32 version, u32 flags, u64 filesizeInput, u64 filesizeTmp) int sdata_unpack(wxString packed_file, wxString unpacked_file) { - vfsStream* packed_stream = Emu.GetVFS().Open(packed_file, vfsRead); - vfsStream* unpacked_stream = Emu.GetVFS().Open(unpacked_file, vfsWrite); + auto packed_stream = Emu.GetVFS().OpenFile(packed_file, vfsRead); + auto unpacked_stream = Emu.GetVFS().OpenFile(unpacked_file, vfsWrite); if(!packed_stream || !packed_stream->IsOpened()) { sys_fs.Error("'%s' not found! flags: 0x%08x", packed_file.wx_str(), vfsRead); - delete packed_stream; return CELL_ENOENT; } if(!unpacked_stream || !unpacked_stream->IsOpened()) { sys_fs.Error("'%s' couldn't be created! flags: 0x%08x", unpacked_file.wx_str(), vfsWrite); - delete unpacked_stream; return CELL_ENOENT; } @@ -105,9 +103,6 @@ int sdata_unpack(wxString packed_file, wxString unpacked_file) } } - packed_stream->Close(); - unpacked_stream->Close(); - return CELL_OK; } @@ -131,8 +126,9 @@ int cellFsSdataOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) int ret = sdata_unpack(path, unpacked_path); if (ret) return ret; - vfsStream* stream = Emu.GetVFS().Open(unpacked_path, vfsRead); - fd = sys_fs.GetNewId(stream, flags); + auto stream = Emu.GetVFS().OpenFile(unpacked_path, vfsRead); + fd = sys_fs.GetNewId(stream.get(), flags); + stream = nullptr; return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp index 60a7f561ef..59ffd76135 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp @@ -17,7 +17,7 @@ int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) if(flags & CELL_O_CREAT) { _oflags &= ~CELL_O_CREAT; - Emu.GetVFS().Create(ppath); + Emu.GetVFS().CreateFile(ppath); } vfsOpenMode o_mode; @@ -55,9 +55,7 @@ int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) { _oflags &= ~CELL_O_TRUNC; //truncate file before opening it as read/write - vfsStream* stream = Emu.GetVFS().Open(ppath, vfsWrite); - stream->Close(); - delete stream; + Emu.GetVFS().OpenFile(ppath, vfsWrite); } o_mode = vfsReadWrite; break; @@ -69,17 +67,16 @@ int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) return CELL_EINVAL; } - vfsStream* stream = Emu.GetVFS().Open(ppath, o_mode); + auto stream = Emu.GetVFS().OpenFile(ppath, o_mode); if(!stream || !stream->IsOpened()) { sys_fs.Error("\"%s\" not found! flags: 0x%08x", ppath.wx_str(), flags); - delete stream; - return CELL_ENOENT; } - fd = sys_fs.GetNewId(stream, flags); + fd = sys_fs.GetNewId(stream.get(), flags); + stream = nullptr; ConLog.Warning("*** cellFsOpen(path=\"%s\"): fd = %d", path.wx_str(), fd.GetValue()); return CELL_OK; @@ -145,16 +142,14 @@ int cellFsOpendir(u32 path_addr, mem32_t fd) if(!Memory.IsGoodAddr(path_addr) || !fd.IsGood()) return CELL_EFAULT; - wxString localPath; - Emu.GetVFS().GetDevice(path, localPath); - vfsLocalDir* dir = new vfsLocalDir(localPath); + std::shared_ptr dir = Emu.GetVFS().OpenDir(path); if(!dir->IsOpened()) { - delete dir; return CELL_ENOENT; } - fd = sys_fs.GetNewId(dir); + fd = sys_fs.GetNewId(dir.get()); + dir = nullptr; return CELL_OK; } @@ -174,7 +169,7 @@ int cellFsReaddir(u32 fd, mem_ptr_t dir, mem64_t nread) nread = 1; Memory.WriteString(dir.GetAddr()+2, info->name.wx_str()); dir->d_namlen = info->name.Length(); - dir->d_type = (info->flags & 0x1) ? CELL_FS_TYPE_REGULAR : CELL_FS_TYPE_DIRECTORY; + dir->d_type = (info->flags & DirEntry_TypeFile) ? CELL_FS_TYPE_REGULAR : CELL_FS_TYPE_DIRECTORY; } else { diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 9cf0c1293a..5846edec19 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -92,9 +92,9 @@ void Emulator::CheckStatus() bool Emulator::IsSelf(const std::string& path) { - vfsLocalFile f(path); + vfsLocalFile f(nullptr); - if(!f.IsOpened()) + if(!f.Open(path)) return false; SceHeader hdr; @@ -238,7 +238,7 @@ void Emulator::Load() try { - if(!(is_error = !l.Analyze() || l.GetMachine() == MACHINE_Unknown)) + if(!(is_error = !l.Analyze()) && l.GetMachine() != MACHINE_Unknown) { switch(l.GetMachine()) { diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 74ce4c0f74..20c6baa4cc 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -107,16 +107,6 @@ public: void SetPath(const wxString& path, const wxString& elf_path = wxEmptyString); void SetTitleID(const wxString& id); - std::shared_ptr OpenFile(const wxString& path, vfsOpenMode mode = vfsRead) - { - return std::shared_ptr((vfsFileBase*)m_vfs.Open(path, mode)); - } - - std::shared_ptr OpenStream(const wxString& path, vfsOpenMode mode = vfsRead) - { - return std::shared_ptr(m_vfs.Open(path, mode)); - } - CPUThreadManager& GetCPU() { return m_thread_manager; } PadManager& GetPadManager() { return m_pad_manager; } KeyboardManager& GetKeyboardManager() { return m_keyboard_manager; } diff --git a/rpcs3/Gui/DisAsmFrame.cpp b/rpcs3/Gui/DisAsmFrame.cpp index f8521c5fc7..3d0c152dd8 100644 --- a/rpcs3/Gui/DisAsmFrame.cpp +++ b/rpcs3/Gui/DisAsmFrame.cpp @@ -294,7 +294,9 @@ void DisAsmFrame::Dump(wxCommandEvent& WXUNUSED(event)) if(ctrl.ShowModal() == wxID_CANCEL) return; - vfsStream& f_elf = *new vfsLocalFile(Emu.m_path); + vfsLocalFile& f_elf = *new vfsLocalFile(nullptr); + f_elf.Open(Emu.m_path); + ConLog.Write("path: %s", Emu.m_path.wx_str()); Elf_Ehdr ehdr; ehdr.Load(f_elf); diff --git a/rpcs3/Gui/GameViewer.cpp b/rpcs3/Gui/GameViewer.cpp index 0dcc862a71..c665a39983 100644 --- a/rpcs3/Gui/GameViewer.cpp +++ b/rpcs3/Gui/GameViewer.cpp @@ -50,8 +50,10 @@ void GameViewer::LoadPSF() for(uint i=0; iInsertColumn(2, "Size"); m_list->InsertColumn(3, "Creation time"); - m_hdd = new vfsHDD(hdd_path); + m_hdd = new vfsHDD(nullptr, hdd_path); UpdateList(); Connect(m_list->GetId(), wxEVT_COMMAND_LIST_BEGIN_DRAG, wxListEventHandler(VHDDExplorer::OnListDrag)); Connect(m_list->GetId(), wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler(VHDDExplorer::DClick)); diff --git a/rpcs3/Loader/Loader.cpp b/rpcs3/Loader/Loader.cpp index 3eab6b0acd..4dae78d73b 100644 --- a/rpcs3/Loader/Loader.cpp +++ b/rpcs3/Loader/Loader.cpp @@ -162,11 +162,13 @@ bool Loader::Load() return false; } + /* const wxString& root = wxFileName(wxFileName(m_stream->GetPath()).GetPath()).GetPath(); + wxString ps3_path; const wxString& psf_path = root + "\\" + "PARAM.SFO"; - if(wxFileExists(psf_path)) + vfsFile f(psf_path); + if(f.IsOpened()) { - vfsLocalFile f(psf_path); PSFLoader psf_l(f); if(psf_l.Load()) { @@ -175,6 +177,6 @@ bool Loader::Load() psf_l.Close(); } } - + */ return true; } diff --git a/rpcs3/Loader/TRP.cpp b/rpcs3/Loader/TRP.cpp index c3b99b525a..0345bdb0df 100644 --- a/rpcs3/Loader/TRP.cpp +++ b/rpcs3/Loader/TRP.cpp @@ -16,7 +16,7 @@ bool TRPLoader::Install(std::string dest, bool show) for (const TRPEntry& entry : m_entries) { char* buffer = new char [entry.size]; - Emu.GetVFS().Create(dest+entry.name); + Emu.GetVFS().CreateFile(dest+entry.name); vfsFile file(dest+entry.name, vfsWrite); trp_f.Seek(entry.offset); trp_f.Read(buffer, entry.size); diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 05dbb2f58a..dd103943cc 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -227,6 +227,8 @@ + + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index d7f9c7563c..67d1df150a 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -394,12 +394,18 @@ Loader - + Emu\GS - - + + Emu\SysCalls\Modules + + Emu\FS + + + Emu\FS + diff --git a/rpcs3/stdafx.h b/rpcs3/stdafx.h index 4bef139bb6..71ac10705d 100644 --- a/rpcs3/stdafx.h +++ b/rpcs3/stdafx.h @@ -210,9 +210,10 @@ enum Status #include "Emu/FS/vfsFileBase.h" #include "Emu/FS/vfsLocalDir.h" #include "Emu/FS/vfsLocalFile.h" -#include "Emu/FS/vfsFile.h" #include "Emu/FS/vfsStream.h" #include "Emu/FS/vfsStreamMemory.h" +#include "Emu/FS/vfsFile.h" +#include "Emu/FS/vfsDir.h" #include "rpcs3.h" #define _PRGNAME_ "RPCS3" From bd8ff4ca116ed32c6c3fd26388489a629e1d8b00 Mon Sep 17 00:00:00 2001 From: DH Date: Sun, 16 Feb 2014 17:37:32 +0200 Subject: [PATCH 6/7] Fixed cellFsOpen & cellFsOpendir --- rpcs3/Emu/FS/VFS.cpp | 40 +++++++++++++++------- rpcs3/Emu/FS/VFS.h | 4 +-- rpcs3/Emu/FS/vfsDevice.h | 4 +-- rpcs3/Emu/FS/vfsDeviceLocalFile.cpp | 8 ++--- rpcs3/Emu/FS/vfsDeviceLocalFile.h | 4 +-- rpcs3/Emu/FS/vfsDir.cpp | 2 +- rpcs3/Emu/FS/vfsFile.cpp | 2 +- rpcs3/Emu/HDD/HDD.cpp | 6 ++-- rpcs3/Emu/HDD/HDD.h | 4 +-- rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp | 3 +- rpcs3/Emu/SysCalls/Modules/sys_fs.cpp | 8 ++--- rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp | 13 ++++--- 12 files changed, 56 insertions(+), 42 deletions(-) diff --git a/rpcs3/Emu/FS/VFS.cpp b/rpcs3/Emu/FS/VFS.cpp index a2cf13efcd..a96a62457b 100644 --- a/rpcs3/Emu/FS/VFS.cpp +++ b/rpcs3/Emu/FS/VFS.cpp @@ -50,12 +50,12 @@ void VFS::UnMountAll() } } -std::shared_ptr VFS::OpenFile(const wxString& ps3_path, vfsOpenMode mode) const +vfsFileBase* VFS::OpenFile(const wxString& ps3_path, vfsOpenMode mode) const { wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - if(std::shared_ptr res = dev->GetNewFileStream()) + if(vfsFileBase* res = dev->GetNewFileStream()) { res->Open(path, mode); return res; @@ -65,13 +65,13 @@ std::shared_ptr VFS::OpenFile(const wxString& ps3_path, vfsOpenMode return nullptr; } -std::shared_ptr VFS::OpenDir(const wxString& ps3_path) const +vfsDirBase* VFS::OpenDir(const wxString& ps3_path) const { wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - if(std::shared_ptr res = dev->GetNewDirStream()) + if(vfsDirBase* res = dev->GetNewDirStream()) { res->Open(path); return res; @@ -86,7 +86,9 @@ bool VFS::CreateFile(const wxString& ps3_path) const wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - if(std::shared_ptr res = dev->GetNewFileStream()) + std::shared_ptr res(dev->GetNewFileStream()); + + if(res) { return res->Create(path); } @@ -100,7 +102,9 @@ bool VFS::CreateDir(const wxString& ps3_path) const wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - if(std::shared_ptr res = dev->GetNewDirStream()) + std::shared_ptr res(dev->GetNewDirStream()); + + if(res) { return res->Create(path); } @@ -114,7 +118,9 @@ bool VFS::RemoveFile(const wxString& ps3_path) const wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - if(std::shared_ptr res = dev->GetNewFileStream()) + std::shared_ptr res(dev->GetNewFileStream()); + + if(res) { return res->Remove(path); } @@ -128,7 +134,9 @@ bool VFS::RemoveDir(const wxString& ps3_path) const wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - if(std::shared_ptr res = dev->GetNewDirStream()) + std::shared_ptr res(dev->GetNewDirStream()); + + if(res) { return res->Remove(path); } @@ -142,7 +150,9 @@ bool VFS::ExistsFile(const wxString& ps3_path) const wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - if(std::shared_ptr res = dev->GetNewFileStream()) + std::shared_ptr res(dev->GetNewFileStream()); + + if(res) { return res->Exists(path); } @@ -156,7 +166,9 @@ bool VFS::ExistsDir(const wxString& ps3_path) const wxString path; if(vfsDevice* dev = GetDevice(ps3_path, path)) { - if(std::shared_ptr res = dev->GetNewDirStream()) + std::shared_ptr res(dev->GetNewDirStream()); + + if(res) { return res->IsExists(path); } @@ -170,7 +182,9 @@ bool VFS::RenameFile(const wxString& ps3_path_from, const wxString& ps3_path_to) wxString path; if(vfsDevice* dev = GetDevice(ps3_path_from, path)) { - if(std::shared_ptr res = dev->GetNewFileStream()) + std::shared_ptr res(dev->GetNewFileStream()); + + if(res) { return res->Rename(path, ps3_path_to); } @@ -184,7 +198,9 @@ bool VFS::RenameDir(const wxString& ps3_path_from, const wxString& ps3_path_to) wxString path; if(vfsDevice* dev = GetDevice(ps3_path_from, path)) { - if(std::shared_ptr res = dev->GetNewDirStream()) + std::shared_ptr res(dev->GetNewDirStream()); + + if(res) { return res->Rename(path, ps3_path_to); } diff --git a/rpcs3/Emu/FS/VFS.h b/rpcs3/Emu/FS/VFS.h index e10fedea36..8876726bb8 100644 --- a/rpcs3/Emu/FS/VFS.h +++ b/rpcs3/Emu/FS/VFS.h @@ -36,8 +36,8 @@ struct VFS void UnMount(const wxString& ps3_path); void UnMountAll(); - std::shared_ptr OpenFile(const wxString& ps3_path, vfsOpenMode mode) const; - std::shared_ptr OpenDir(const wxString& ps3_path) const; + vfsFileBase* OpenFile(const wxString& ps3_path, vfsOpenMode mode) const; + vfsDirBase* OpenDir(const wxString& ps3_path) const; bool CreateFile(const wxString& ps3_path) const; bool CreateDir(const wxString& ps3_path) const; bool RemoveFile(const wxString& ps3_path) const; diff --git a/rpcs3/Emu/FS/vfsDevice.h b/rpcs3/Emu/FS/vfsDevice.h index 2b52e46c5a..76a9bee378 100644 --- a/rpcs3/Emu/FS/vfsDevice.h +++ b/rpcs3/Emu/FS/vfsDevice.h @@ -12,8 +12,8 @@ public: vfsDevice(const wxString& ps3_path, const wxString& local_path); vfsDevice() {} - virtual std::shared_ptr GetNewFileStream()=0; - virtual std::shared_ptr GetNewDirStream()=0; + virtual vfsFileBase* GetNewFileStream()=0; + virtual vfsDirBase* GetNewDirStream()=0; wxString GetLocalPath() const; wxString GetPs3Path() const; diff --git a/rpcs3/Emu/FS/vfsDeviceLocalFile.cpp b/rpcs3/Emu/FS/vfsDeviceLocalFile.cpp index c89bd8dd2e..3210a268e0 100644 --- a/rpcs3/Emu/FS/vfsDeviceLocalFile.cpp +++ b/rpcs3/Emu/FS/vfsDeviceLocalFile.cpp @@ -3,12 +3,12 @@ #include "vfsLocalFile.h" #include "vfsLocalDir.h" -std::shared_ptr vfsDeviceLocalFile::GetNewFileStream() +vfsFileBase* vfsDeviceLocalFile::GetNewFileStream() { - return std::make_shared(this); + return new vfsLocalFile(this); } -std::shared_ptr vfsDeviceLocalFile::GetNewDirStream() +vfsDirBase* vfsDeviceLocalFile::GetNewDirStream() { - return std::make_shared(this); + return new vfsLocalDir(this); } diff --git a/rpcs3/Emu/FS/vfsDeviceLocalFile.h b/rpcs3/Emu/FS/vfsDeviceLocalFile.h index bab7bfb75c..fc73fa3886 100644 --- a/rpcs3/Emu/FS/vfsDeviceLocalFile.h +++ b/rpcs3/Emu/FS/vfsDeviceLocalFile.h @@ -4,6 +4,6 @@ class vfsDeviceLocalFile : public vfsDevice { public: - virtual std::shared_ptr GetNewFileStream() override; - virtual std::shared_ptr GetNewDirStream() override; + virtual vfsFileBase* GetNewFileStream() override; + virtual vfsDirBase* GetNewDirStream() override; }; \ No newline at end of file diff --git a/rpcs3/Emu/FS/vfsDir.cpp b/rpcs3/Emu/FS/vfsDir.cpp index ff7d7f4a81..7ce119601d 100644 --- a/rpcs3/Emu/FS/vfsDir.cpp +++ b/rpcs3/Emu/FS/vfsDir.cpp @@ -18,7 +18,7 @@ bool vfsDir::Open(const wxString& path) { Close(); - m_stream = Emu.GetVFS().OpenDir(path); + m_stream.reset(Emu.GetVFS().OpenDir(path)); return m_stream && m_stream->IsOpened(); } diff --git a/rpcs3/Emu/FS/vfsFile.cpp b/rpcs3/Emu/FS/vfsFile.cpp index 79d7bd99ed..924b4a80ee 100644 --- a/rpcs3/Emu/FS/vfsFile.cpp +++ b/rpcs3/Emu/FS/vfsFile.cpp @@ -18,7 +18,7 @@ bool vfsFile::Open(const wxString& path, vfsOpenMode mode) { Close(); - m_stream = Emu.GetVFS().OpenFile(path, mode); + m_stream.reset(Emu.GetVFS().OpenFile(path, mode)); return m_stream && m_stream->IsOpened(); } diff --git a/rpcs3/Emu/HDD/HDD.cpp b/rpcs3/Emu/HDD/HDD.cpp index 7281289705..4d8937b4b5 100644 --- a/rpcs3/Emu/HDD/HDD.cpp +++ b/rpcs3/Emu/HDD/HDD.cpp @@ -5,12 +5,12 @@ vfsDeviceHDD::vfsDeviceHDD(const std::string& hdd_path) : m_hdd_path(hdd_path) { } -std::shared_ptr vfsDeviceHDD::GetNewFileStream() +vfsFileBase* vfsDeviceHDD::GetNewFileStream() { - return std::make_shared(this, m_hdd_path); + return new vfsHDD(this, m_hdd_path); } -std::shared_ptr vfsDeviceHDD::GetNewDirStream() +vfsDirBase* vfsDeviceHDD::GetNewDirStream() { return nullptr; } diff --git a/rpcs3/Emu/HDD/HDD.h b/rpcs3/Emu/HDD/HDD.h index b8d4773f08..3478d30fbb 100644 --- a/rpcs3/Emu/HDD/HDD.h +++ b/rpcs3/Emu/HDD/HDD.h @@ -416,8 +416,8 @@ class vfsDeviceHDD : public vfsDevice public: vfsDeviceHDD(const std::string& hdd_path); - virtual std::shared_ptr GetNewFileStream() override; - virtual std::shared_ptr GetNewDirStream() override; + virtual vfsFileBase* GetNewFileStream() override; + virtual vfsDirBase* GetNewDirStream() override; }; class vfsHDD : public vfsFileBase diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index 494b542610..a5ada78529 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -115,7 +115,8 @@ int sceNpTrophyCreateContext(mem32_t context, mem_ptr_t co { if (entry->flags & DirEntry_TypeDir) { - auto f = Emu.GetVFS().OpenFile("/app_home/TROPDIR/" + entry->name + "/TROPHY.TRP", vfsRead); + std::shared_ptr f(Emu.GetVFS().OpenFile("/app_home/TROPDIR/" + entry->name + "/TROPHY.TRP", vfsRead)); + if (f && f->IsOpened()) { sceNpTrophyInternalContext ctxt; diff --git a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp index 0982a7c2d4..f0edaa2e46 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp @@ -35,8 +35,8 @@ bool sdata_check(u32 version, u32 flags, u64 filesizeInput, u64 filesizeTmp) int sdata_unpack(wxString packed_file, wxString unpacked_file) { - auto packed_stream = Emu.GetVFS().OpenFile(packed_file, vfsRead); - auto unpacked_stream = Emu.GetVFS().OpenFile(unpacked_file, vfsWrite); + std::shared_ptr packed_stream(Emu.GetVFS().OpenFile(packed_file, vfsRead)); + std::shared_ptr unpacked_stream(Emu.GetVFS().OpenFile(unpacked_file, vfsWrite)); if(!packed_stream || !packed_stream->IsOpened()) { @@ -126,9 +126,7 @@ int cellFsSdataOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) int ret = sdata_unpack(path, unpacked_path); if (ret) return ret; - auto stream = Emu.GetVFS().OpenFile(unpacked_path, vfsRead); - fd = sys_fs.GetNewId(stream.get(), flags); - stream = nullptr; + fd = sys_fs.GetNewId(Emu.GetVFS().OpenFile(unpacked_path, vfsRead), flags); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp index 59ffd76135..7ec0e6f3c8 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp @@ -67,7 +67,7 @@ int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) return CELL_EINVAL; } - auto stream = Emu.GetVFS().OpenFile(ppath, o_mode); + vfsFileBase* stream = Emu.GetVFS().OpenFile(ppath, o_mode); if(!stream || !stream->IsOpened()) { @@ -75,8 +75,7 @@ int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) return CELL_ENOENT; } - fd = sys_fs.GetNewId(stream.get(), flags); - stream = nullptr; + fd = sys_fs.GetNewId(stream, flags); ConLog.Warning("*** cellFsOpen(path=\"%s\"): fd = %d", path.wx_str(), fd.GetValue()); return CELL_OK; @@ -142,14 +141,14 @@ int cellFsOpendir(u32 path_addr, mem32_t fd) if(!Memory.IsGoodAddr(path_addr) || !fd.IsGood()) return CELL_EFAULT; - std::shared_ptr dir = Emu.GetVFS().OpenDir(path); - if(!dir->IsOpened()) + vfsDirBase* dir = Emu.GetVFS().OpenDir(path); + if(!dir || !dir->IsOpened()) { + delete dir; return CELL_ENOENT; } - fd = sys_fs.GetNewId(dir.get()); - dir = nullptr; + fd = sys_fs.GetNewId(dir); return CELL_OK; } From ab25edfaccb5574f0c9b87870a723d7e3e22ecdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Sun, 16 Feb 2014 22:17:56 +0100 Subject: [PATCH 7/7] Few source-code improvements * Fixed identation inconsistency after last merge. * Replaced uint32_t with u32 in LinearToSwizzleAddress. * Replaced hardcoded values with defined GCM constants (in Emu/GS/GCM.h) in some switch statements. This commit won't produce any changes in the RPCS3 executable. It's just to make the code easier to read. --- rpcs3/Emu/GS/GCM.h | 51 ++++++++++++++++++++++++++++++++++ rpcs3/Emu/GS/GL/GLGSRender.cpp | 32 ++++++++++----------- rpcs3/Emu/GS/GL/GLGSRender.h | 36 ++++++++++++------------ rpcs3/Emu/GS/RSXTexture.cpp | 18 ++++++------ rpcs3/Emu/GS/RSXThread.cpp | 14 +++++----- rpcs3/Emu/GS/RSXThread.h | 19 +++++++------ 6 files changed, 109 insertions(+), 61 deletions(-) diff --git a/rpcs3/Emu/GS/GCM.h b/rpcs3/Emu/GS/GCM.h index 7c23596207..da9c068027 100644 --- a/rpcs3/Emu/GS/GCM.h +++ b/rpcs3/Emu/GS/GCM.h @@ -22,6 +22,57 @@ enum CELL_GCM_DISPLAY_FREQUENCY_DISABLE = 3, }; +// GCM Texture +enum +{ + // Format + CELL_GCM_TEXTURE_B8 = 0x81, + CELL_GCM_TEXTURE_A1R5G5B5 = 0x82, + CELL_GCM_TEXTURE_A4R4G4B4 = 0x83, + CELL_GCM_TEXTURE_R5G6B5 = 0x84, + CELL_GCM_TEXTURE_A8R8G8B8 = 0x85, + CELL_GCM_TEXTURE_COMPRESSED_DXT1 = 0x86, + CELL_GCM_TEXTURE_COMPRESSED_DXT23 = 0x87, + CELL_GCM_TEXTURE_COMPRESSED_DXT45 = 0x88, + CELL_GCM_TEXTURE_G8B8 = 0x8B, + CELL_GCM_TEXTURE_R6G5B5 = 0x8F, + CELL_GCM_TEXTURE_DEPTH24_D8 = 0x90, + CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT = 0x91, + CELL_GCM_TEXTURE_DEPTH16 = 0x92, + CELL_GCM_TEXTURE_DEPTH16_FLOAT = 0x93, + CELL_GCM_TEXTURE_X16 = 0x94, + CELL_GCM_TEXTURE_Y16_X16 = 0x95, + CELL_GCM_TEXTURE_R5G5B5A1 = 0x97, + CELL_GCM_TEXTURE_COMPRESSED_HILO8 = 0x98, + CELL_GCM_TEXTURE_COMPRESSED_HILO_S8 = 0x99, + CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT = 0x9A, + CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT = 0x9B, + CELL_GCM_TEXTURE_X32_FLOAT = 0x9C, + CELL_GCM_TEXTURE_D1R5G5B5 = 0x9D, + CELL_GCM_TEXTURE_D8R8G8B8 = 0x9E, + CELL_GCM_TEXTURE_Y16_X16_FLOAT = 0x9F, + CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8 = 0xAD, + CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8 = 0xAE, + + // Format flags + CELL_GCM_TEXTURE_SZ = 0x00, + CELL_GCM_TEXTURE_LN = 0x20, + CELL_GCM_TEXTURE_NR = 0x00, + CELL_GCM_TEXTURE_UN = 0x40, +}; + +// GCM Surface +enum +{ + // Target + CELL_GCM_SURFACE_TARGET_NONE = 0, + CELL_GCM_SURFACE_TARGET_0 = 1, + CELL_GCM_SURFACE_TARGET_1 = 2, + CELL_GCM_SURFACE_TARGET_MRT1 = 0x13, + CELL_GCM_SURFACE_TARGET_MRT2 = 0x17, + CELL_GCM_SURFACE_TARGET_MRT3 = 0x1f, +}; + struct CellGcmControl { u32 put; diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index 068a0f6a2e..9bfaccc8dc 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -556,29 +556,29 @@ void GLGSRender::WriteBuffers() switch(m_surface_colour_target) { - case 0x0: + case CELL_GCM_SURFACE_TARGET_NONE: return; - case 0x1: + case CELL_GCM_SURFACE_TARGET_0: WriteColourBufferA(); break; - case 0x2: + case CELL_GCM_SURFACE_TARGET_1: WriteColourBufferB(); break; - case 0x13: + case CELL_GCM_SURFACE_TARGET_MRT1: WriteColourBufferA(); WriteColourBufferB(); break; - case 0x17: + case CELL_GCM_SURFACE_TARGET_MRT2: WriteColourBufferA(); WriteColourBufferB(); WriteColourBufferC(); break; - case 0x1f: + case CELL_GCM_SURFACE_TARGET_MRT3: WriteColourBufferA(); WriteColourBufferB(); WriteColourBufferC(); @@ -726,26 +726,26 @@ void GLGSRender::ExecCMD() switch(m_surface_colour_target) { - case 0x0: + case CELL_GCM_SURFACE_TARGET_NONE: break; - case 0x1: + case CELL_GCM_SURFACE_TARGET_0: glDrawBuffer(draw_buffers[0]); break; - case 0x2: + case CELL_GCM_SURFACE_TARGET_1: glDrawBuffer(draw_buffers[1]); break; - case 0x13: + case CELL_GCM_SURFACE_TARGET_MRT1: glDrawBuffers(2, draw_buffers); break; - case 0x17: + case CELL_GCM_SURFACE_TARGET_MRT2: glDrawBuffers(3, draw_buffers); break; - case 0x1f: + case CELL_GCM_SURFACE_TARGET_MRT3: glDrawBuffers(4, draw_buffers); break; @@ -1147,12 +1147,10 @@ void GLGSRender::Flip() } } -uint32_t LinearToSwizzleAddress( - uint32_t x, uint32_t y, uint32_t z, - uint32_t log2_width, uint32_t log2_height, uint32_t log2_depth) +u32 LinearToSwizzleAddress(u32 x, u32 y, u32 z, u32 log2_width, u32 log2_height, u32 log2_depth) { - uint32_t offset = 0; - uint32_t shift_count = 0; + u32 offset = 0; + u32 shift_count = 0; while(log2_width | log2_height | log2_depth){ if(log2_width){ offset |= (x & 0x01) << shift_count; diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index d685271871..b0ea63df71 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -13,9 +13,7 @@ extern GLenum g_last_gl_error; void printGlError(GLenum err, const char* situation); -uint32_t LinearToSwizzleAddress( - uint32_t x, uint32_t y, uint32_t z, - uint32_t log2_width, uint32_t log2_height, uint32_t log2_depth); +u32 LinearToSwizzleAddress(u32 x, u32 y, u32 z, u32 log2_width, u32 log2_height, u32 log2_depth); #if RSX_DEBUG #define checkForGlError(sit) if((g_last_gl_error = glGetError()) != GL_NO_ERROR) printGlError(g_last_gl_error, sit) @@ -79,7 +77,7 @@ public: checkForGlError("GLTexture::Init() -> glBindTexture"); int format = tex.GetFormat() & ~(0x20 | 0x40); - bool is_swizzled = (tex.GetFormat() & 0x20) == 0; + bool is_swizzled = !(tex.GetFormat() & CELL_GCM_TEXTURE_LN); glPixelStorei(GL_PACK_ALIGNMENT, tex.m_pitch); char* pixels = (char*)Memory.GetMemFromAddr(GetAddress(tex.GetOffset(), tex.GetLocation())); @@ -87,7 +85,7 @@ public: switch(format) { - case 0x81: + case CELL_GCM_TEXTURE_B8: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BLUE, GL_UNSIGNED_BYTE, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); @@ -99,15 +97,15 @@ public: checkForGlError("GLTexture::Init() -> glTexParameteri"); break; - case 0x85: + case CELL_GCM_TEXTURE_A8R8G8B8: if(is_swizzled) { - uint32_t *src, *dst; - uint32_t log2width, log2height; + u32 *src, *dst; + u32 log2width, log2height; unswizzledPixels = (char*)malloc(tex.GetWidth() * tex.GetHeight() * 4); - src = (uint32_t*)pixels; - dst = (uint32_t*)unswizzledPixels; + src = (u32*)pixels; + dst = (u32*)unswizzledPixels; log2width = log(tex.GetWidth())/log(2); log2height = log(tex.GetHeight())/log(2); @@ -125,7 +123,7 @@ public: checkForGlError("GLTexture::Init() -> glTexImage2D"); break; - case 0x86: + case CELL_GCM_TEXTURE_COMPRESSED_DXT1: { u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 8; @@ -134,7 +132,7 @@ public: } break; - case 0x87: + case CELL_GCM_TEXTURE_COMPRESSED_DXT23: { u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16; @@ -143,7 +141,7 @@ public: } break; - case 0x88: + case CELL_GCM_TEXTURE_COMPRESSED_DXT45: { u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16; @@ -152,7 +150,7 @@ public: } break; - case 0x94: + case CELL_GCM_TEXTURE_X16: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_RED, GL_SHORT, pixels); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_ONE); @@ -161,12 +159,12 @@ public: checkForGlError("GLTexture::Init() -> glTexImage2D"); break; - case 0x9a: + case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_HALF_FLOAT, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); break; - case 0x9e: + case CELL_GCM_TEXTURE_D8R8G8B8: { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); @@ -255,7 +253,7 @@ public: void Save(RSXTexture& tex, const wxString& name) { - if(!m_id || !tex.GetOffset() || !tex.GetWidth() || !tex.GetHeight()) return; + if(!m_id || !tex.GetOffset() || !tex.GetWidth() || !tex.GetHeight()) return; u32* alldata = new u32[tex.GetWidth() * tex.GetHeight()]; @@ -263,11 +261,11 @@ public: switch(tex.GetFormat() & ~(0x20 | 0x40)) { - case 0x81: + case CELL_GCM_TEXTURE_B8: glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, alldata); break; - case 0x85: + case CELL_GCM_TEXTURE_A8R8G8B8: glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, alldata); break; diff --git a/rpcs3/Emu/GS/RSXTexture.cpp b/rpcs3/Emu/GS/RSXTexture.cpp index 8db5499a02..9ac888c8e9 100644 --- a/rpcs3/Emu/GS/RSXTexture.cpp +++ b/rpcs3/Emu/GS/RSXTexture.cpp @@ -42,37 +42,37 @@ void RSXTexture::Init() u32 RSXTexture::GetOffset() const { - return methodRegisters[NV4097_SET_TEXTURE_OFFSET + (m_index*32)]; + return methodRegisters[NV4097_SET_TEXTURE_OFFSET + (m_index*32)]; } u8 RSXTexture::GetLocation() const { - return (methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] & 0x3) - 1; + return (methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] & 0x3) - 1; } bool RSXTexture::isCubemap() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 2) & 0x1); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 2) & 0x1); } u8 RSXTexture::GetBorderType() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 3) & 0x1); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 3) & 0x1); } u8 RSXTexture::GetDimension() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 4) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 4) & 0xf); } u8 RSXTexture::GetFormat() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 8) & 0xff); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 8) & 0xff); } u16 RSXTexture::Getmipmap() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 16) & 0xffff); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 16) & 0xffff); } u8 RSXTexture::GetWrapS() const @@ -197,6 +197,6 @@ u16 RSXTexture::GetHeight() const void RSXTexture::SetControl3(u16 depth, u32 pitch) { - m_depth = depth; - m_pitch = pitch; + m_depth = depth; + m_pitch = pitch; } \ No newline at end of file diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index 9556370bf9..d88e4d3fb8 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -1378,7 +1378,7 @@ void RSXThread::End() void RSXThread::Task() { - u8 inc; + u8 inc; ConLog.Write("RSX thread entry"); OnInitThread(); @@ -1387,7 +1387,7 @@ void RSXThread::Task() { wxCriticalSectionLocker lock(m_cs_main); - inc=1; + inc=1; u32 put, get; se_t::func(put, std::atomic_load((volatile std::atomic*)((u8*)m_ctrl + offsetof(CellGcmControl, put)))); @@ -1439,7 +1439,7 @@ void RSXThread::Task() if(cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT) { //ConLog.Warning("non increment cmd! 0x%x", cmd); - inc=0; + inc=0; } if(cmd == 0) @@ -1449,10 +1449,10 @@ void RSXThread::Task() continue; } - for(int i=0; i