From 8461bee32e3ce60f1f9386a2c3c4c7c50ddf5de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Sun, 9 Mar 2014 04:57:19 +0100 Subject: [PATCH 01/27] Updates in cellL10n and sceNpTrophy * UTF16stoUTF8s updated. * Added missing return in sceNpTrophyRegisterContext. * Added sceNpTrophyGetGameInfo. --- rpcs3/Emu/SysCalls/Modules/cellL10n.cpp | 26 ++++++++---------- rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp | 31 +++++++++++++++++++--- rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h | 23 +++++++++++++++- 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp index f78f667030..dcf34cd9d7 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp @@ -2,6 +2,8 @@ #include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SC_FUNC.h" +#include + void cellL10n_init(); Module cellL10n(0x001e, cellL10n_init); @@ -22,24 +24,18 @@ int UTF16stoUTF8s(mem16_ptr_t utf16, mem64_t utf16_len, mem8_ptr_t utf8, mem64_t if (!utf16.IsGood() || !utf16_len.IsGood() || !utf8_len.IsGood()) return SRCIllegal; - std::wstring wstr = (wchar_t*)Memory.VirtualToRealAddr(utf16); - std::string str; + std::u16string wstr =(char16_t*)Memory.VirtualToRealAddr(utf16); + wstr.resize(utf16_len.GetValue()); // TODO: Is this really the role of utf16_len in this function? - int len = min((int)utf16_len.GetValue(), (int)wstr.size()); - int size = (int)WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), len, 0, 0, NULL, NULL); + std::wstring_convert,char16_t> convert; + std::string str = convert.to_bytes(wstr); - if (!utf8.IsGood()) - utf8_len = size; - if (utf8_len.GetValue() < size) + if (!utf8.IsGood() || utf8_len.GetValue() < str.size()) + utf8_len = str.size(); return DSTExhausted; - -#ifdef WIN32 - WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), len, &str[0], size, NULL, NULL); -#else - // TODO -#endif - - Memory.WriteString(utf8, str); + + utf8_len = str.size(); + Memory.WriteString(utf8, str.c_str()); return ConversionOK; } diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index 2198525289..872c25556d 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -110,7 +110,7 @@ int sceNpTrophyRegisterContext(u32 context, u32 handle, u32 statusCb_addr, u32 a if (!Memory.IsGoodAddr(statusCb_addr)) return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT; if (options & (~(u64)1)) - SCE_NP_TROPHY_ERROR_NOT_SUPPORTED; + return SCE_NP_TROPHY_ERROR_NOT_SUPPORTED; if (context >= s_npTrophyInstance.contexts.size()) return SCE_NP_TROPHY_ERROR_UNKNOWN_CONTEXT; // TODO: There are other possible errors @@ -181,9 +181,32 @@ int sceNpTrophyAbortHandle() return CELL_OK; } -int sceNpTrophyGetGameInfo() +int sceNpTrophyGetGameInfo(u32 context, u32 handle, mem_ptr_t details, mem_ptr_t data) { - UNIMPLEMENTED_FUNC(sceNpTrophy); + sceNpTrophy.Warning("sceNpTrophyGetGameInfo(context=%d, handle=%d, details_addr=0x%x, data_addr=0x%x)", + context, handle, details.GetAddr(), data.GetAddr()); + + if (!s_npTrophyInstance.m_bInitialized) + return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; + if (!details.IsGood() || !data.IsGood()) + return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT; + // TODO: There are other possible errors + + // sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; + + // TODO: This data is faked, implement a XML reader and get it from TROP.SFM + memcpy(details->title, "Trophy Set", SCE_NP_TROPHY_NAME_MAX_SIZE); + memcpy(details->description, "Hey! Implement a XML reader, and load the description from TROP.SFM", SCE_NP_TROPHY_DESCR_MAX_SIZE); + details->numTrophies = 0; + details->numPlatinum = 0; + details->numGold = 0; + details->numSilver = 0; + details->numBronze = 0; + data->unlockedTrophies = 0; + data->unlockedPlatinum = 0; + data->unlockedGold = 0; + data->unlockedSilver = 0; + data->unlockedBronze = 0; return CELL_OK; } @@ -229,6 +252,8 @@ int sceNpTrophyGetTrophyInfo(u32 context, u32 handle, s32 trophyId, mem_ptr_tname, "Some Trophy", SCE_NP_TROPHY_NAME_MAX_SIZE); memcpy(details->description, "Hey! Implement a XML reader, and load the description from TROP.SFM", SCE_NP_TROPHY_DESCR_MAX_SIZE); details->hidden = false; diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h index 2bcf4b15c8..f57f18679b 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h @@ -57,7 +57,7 @@ enum SCE_NP_TROPHY_DESCR_MAX_SIZE = 1024, }; -enum +enum SceNpTrophyGrade { SCE_NP_TROPHY_GRADE_UNKNOWN = 0, SCE_NP_TROPHY_GRADE_PLATINUM = 1, @@ -66,6 +66,27 @@ enum SCE_NP_TROPHY_GRADE_BRONZE = 4, }; +struct SceNpTrophyGameDetails +{ + u32 numTrophies; + u32 numPlatinum; + u32 numGold; + u32 numSilver; + u32 numBronze; + u8 title[SCE_NP_TROPHY_TITLE_MAX_SIZE]; + u8 description[SCE_NP_TROPHY_GAME_DESCR_MAX_SIZE]; + u8 reserved[4]; +}; + +struct SceNpTrophyGameData +{ + u32 unlockedTrophies; + u32 unlockedPlatinum; + u32 unlockedGold; + u32 unlockedSilver; + u32 unlockedBronze; +}; + struct SceNpTrophyDetails { s32 trophyId; // SceNpTrophyId From bde5c9cfed2b7149cc8074d75811a06cdb67b8a8 Mon Sep 17 00:00:00 2001 From: Sacha Date: Mon, 10 Mar 2014 00:44:12 +1000 Subject: [PATCH 02/27] Fix slashes in OpenAL includes --- rpcs3/Emu/Audio/AL/OpenALThread.h | 7 ++++--- rpcs3/Emu/Audio/AudioManager.h | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Audio/AL/OpenALThread.h b/rpcs3/Emu/Audio/AL/OpenALThread.h index f4a5181e80..62a16c42f6 100644 --- a/rpcs3/Emu/Audio/AL/OpenALThread.h +++ b/rpcs3/Emu/Audio/AL/OpenALThread.h @@ -1,7 +1,7 @@ #pragma once -#include "OpenAL\include\al.h" -#include "OpenAL\include\alc.h" +#include "OpenAL/include/al.h" +#include "OpenAL/include/alc.h" #include extern ALenum g_last_al_error; @@ -46,4 +46,5 @@ public: void Stop(); bool AddBlock(ALuint bufferID, ALsizei size, const void* src); void AddData(const void* src, ALsizei size); -}; \ No newline at end of file +}; + diff --git a/rpcs3/Emu/Audio/AudioManager.h b/rpcs3/Emu/Audio/AudioManager.h index 8d02d11004..dc448b7ced 100644 --- a/rpcs3/Emu/Audio/AudioManager.h +++ b/rpcs3/Emu/Audio/AudioManager.h @@ -1,6 +1,6 @@ #pragma once #include "sysutil_audio.h" -#include "AL\OpenALThread.h" +#include "AL/OpenALThread.h" struct AudioInfo { @@ -43,4 +43,5 @@ public: u8 GetState(); }; -extern OpenALThread* m_audio_out; \ No newline at end of file +extern OpenALThread* m_audio_out; + From a33575b1152b77b0ce9d31acc411812ea436d311 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 10 Mar 2014 03:07:53 +0400 Subject: [PATCH 03/27] Compilation fix --- rpcs3/Emu/Cell/PPUThread.h | 2 +- rpcs3/Emu/SysCalls/Modules/cellSpurs.h | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUThread.h b/rpcs3/Emu/Cell/PPUThread.h index fbb53bf1ae..0302180399 100644 --- a/rpcs3/Emu/Cell/PPUThread.h +++ b/rpcs3/Emu/Cell/PPUThread.h @@ -526,7 +526,7 @@ static const s32 MAX_INT_VALUE = 0x7fffffff; class PPUThread : public PPCThread { public: - std::atomic owned_mutexes; + u32 owned_mutexes; public: PPCdouble FPR[32]; //Floating Point Register diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h index af9f4c4e6c..bc9f70b848 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h @@ -87,7 +87,8 @@ struct CellSpursTraceInfo //u8 padding[]; }; -__declspec(align(8)) struct CellTraceHeader +//__declspec(align(8)) +struct CellTraceHeader { u8 tag; u8 length; @@ -135,17 +136,20 @@ struct CellSpursTracePacket } data; }; -__declspec(align(128)) struct CellSpurs +//__declspec(align(128)) +struct CellSpurs { u8 skip[CELL_SPURS_SIZE]; }; -__declspec(align(128)) struct CellSpurs2 +//__declspec(align(128)) +struct CellSpurs2 { u8 skip[CELL_SPURS_SIZE2 - CELL_SPURS_SIZE]; }; -__declspec(align(8)) struct CellSpursAttribute +//__declspec(align(8)) +struct CellSpursAttribute { u8 skip[CELL_SPURS_ATTRIBUTE_SIZE]; }; @@ -184,7 +188,8 @@ enum }; -__declspec(align(128)) struct CellSpursTaskset +//__declspec(align(128)) +struct CellSpursTaskset { u8 skip[6400]; }; @@ -217,7 +222,8 @@ struct CellSpursTasksetInfo #define CELL_SPURS_TASKSET_SIZE CELL_SPURS_TASKSET_CLASS0_SIZE */ -__declspec(align(128)) struct CellSpursTaskset2 +//__declspec(align(128)) +struct CellSpursTaskset2 { be_t skip[10496]; }; @@ -267,7 +273,8 @@ struct CellSpursTaskAttribute2 //be_t __reserved__[]; }; -__declspec(align(128)) struct CellSpursTaskExitCode +//__declspec(align(128)) +struct CellSpursTaskExitCode { unsigned char skip[128]; }; From 1aa6e5df958bd54811b284865d7b1a4b22877440 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 10 Mar 2014 03:28:17 -0400 Subject: [PATCH 04/27] Fix a case where an array is read out of bounds in cellSpurs.cpp --- rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp index e6e9bbd98e..aca92144af 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp @@ -57,7 +57,7 @@ int cellSpursAttributeEnableSystemWorkload(mem_ptr_t attr, c cellSpurs.Warning("cellSpursAttributeEnableSystemWorkload(attr_addr=0x%x, priority[%u], maxSpu=%u, isPreemptible[%u])", attr.GetAddr(), priority, maxSpu, isPreemptible); if(!attr.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; - for (int i=0; i<9; i++) + for (int i=0; i<8; i++) if(priority[i] != 1 || maxSpu == 0) return CELL_SPURS_CORE_ERROR_INVAL; return CELL_OK; From d5e94d4cd938cfd3e4d246ce35ec64c5100e8305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Tue, 11 Mar 2014 15:42:28 +0100 Subject: [PATCH 05/27] Some sys_net functions * sys_net; Added some functions using winsock.h | sys/socket.h * sys_net: Renamed overloaded function/structs "*" to "sys_net_*" * Added SetAddr function to mem_base_t --- rpcs3/Emu/Memory/Memory.h | 2 + rpcs3/Emu/SysCalls/Modules/sys_net.cpp | 294 ++++++++++++++++++------- rpcs3/Emu/SysCalls/Modules/sys_net.h | 16 ++ rpcs3/rpcs3.vcxproj | 1 + rpcs3/rpcs3.vcxproj.filters | 3 + 5 files changed, 240 insertions(+), 76 deletions(-) create mode 100644 rpcs3/Emu/SysCalls/Modules/sys_net.h diff --git a/rpcs3/Emu/Memory/Memory.h b/rpcs3/Emu/Memory/Memory.h index ea670cb846..a7468cb161 100644 --- a/rpcs3/Emu/Memory/Memory.h +++ b/rpcs3/Emu/Memory/Memory.h @@ -513,6 +513,8 @@ public: __forceinline AT GetAddr() const { return m_addr; } + __forceinline void SetAddr(AT addr) { m_addr = addr; } + __forceinline bool IsGood() const { return Memory.IsGoodAddr(m_addr, sizeof(T)); diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp index 3b83186840..a171925f52 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp @@ -2,25 +2,119 @@ #include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SC_FUNC.h" +#include "sys_net.h" + +#ifdef _WIN32 +#include +#elif +#include +#include +#endif + void sys_net_init(); Module sys_net((u16)0x0000, sys_net_init); -int accept() +mem32_t g_lastError(NULL); + + +// Auxiliary Functions +int inet_pton4(const char *src, char *dst) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + const char digits[] = "0123456789"; + int saw_digit, octets, ch; + unsigned char tmp[4], *tp; + + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr(digits, ch)) != NULL) { + unsigned int n = *tp * 10 + (pch - digits); + + if (n > 255) + return (0); + *tp = n; + if (! saw_digit) { + if (++octets > 4) + return (0); + saw_digit = 1; + } + } else if (ch == '.' && saw_digit) { + if (octets == 4) + return 0; + *++tp = 0; + saw_digit = 0; + } else + return (0); + } + if (octets < 4) + return 0; + + memcpy(dst, tmp, 4); + return 1; } -int bind() +int inet_pton(int af, const char *src, char *dst) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + switch (af) { + case AF_INET: + return (inet_pton4(src, dst)); + + default: + errno = EAFNOSUPPORT; + return -1; + } } -int connect() +s32 getLastError() { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; +#ifdef _WIN32 + s32 ret = WSAGetLastError(); + if (ret > 10000 && ret < 11000) + return ret % 10000; + else + return -1; +#else + return errno; +#endif +} + + +// Functions +int sys_net_accept(s32 s, mem_ptr_t addr, mem32_t paddrlen) +{ + sys_net.Warning("accept(s=%d, family_addr=0x%x, paddrlen=0x%x)", s, addr.GetAddr(), paddrlen.GetAddr()); + sockaddr _addr; + memcpy(&_addr, Memory.VirtualToRealAddr(addr.GetAddr()), sizeof(sockaddr)); + _addr.sa_family = addr->sa_family; + s32 *_paddrlen = (s32 *)Memory.VirtualToRealAddr(paddrlen.GetAddr()); + int ret = accept(s, &_addr, _paddrlen); + g_lastError = getLastError(); + return ret; +} + +int sys_net_bind(s32 s, mem_ptr_t family, u32 addrlen) +{ + sys_net.Warning("bind(s=%d, family_addr=0x%x, addrlen=%u)", s, family.GetAddr(), addrlen); + sockaddr _family; + memcpy(&_family, Memory.VirtualToRealAddr(family.GetAddr()), sizeof(sockaddr)); + _family.sa_family = family->sa_family; + int ret = bind(s, &_family, addrlen); + g_lastError = getLastError(); + return ret; +} + +int sys_net_connect(s32 s, mem_ptr_t family, u32 addrlen) +{ + sys_net.Warning("connect(s=%d, family_addr=0x%x, addrlen=%u)", s, family.GetAddr(), addrlen); + sockaddr _family; + memcpy(&_family, Memory.VirtualToRealAddr(family.GetAddr()), sizeof(sockaddr)); + _family.sa_family = family->sa_family; + int ret = connect(s, &_family, addrlen); + g_lastError = getLastError(); + return ret; } int gethostbyaddr() @@ -101,10 +195,12 @@ int inet_ntop() return CELL_OK; } -int inet_pton() +int sys_net_inet_pton(s32 af, u32 src_addr, u32 dst_addr) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("inet_pton(af=%d, src_addr=0x%x, dst_addr=0x%x)", af, src_addr, dst_addr); + char *src = (char *)Memory.VirtualToRealAddr(src_addr); + char *dst = (char *)Memory.VirtualToRealAddr(dst_addr); + return inet_pton(af, src, dst); } int listen() @@ -113,16 +209,28 @@ int listen() return CELL_OK; } -int recv() +int sys_net_recv(s32 s, u32 buf_addr, u32 len, s32 flags) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("recv(s=%d, buf_addr=0x%x, len=%d, flags=0x%x)", s, buf_addr, len, flags); + char *buf = (char *)Memory.VirtualToRealAddr(buf_addr); + int ret = recv(s, buf, len, flags); + g_lastError = getLastError(); + return ret; } -int recvfrom() +int sys_net_recvfrom(s32 s, u32 buf_addr, u32 len, s32 flags, mem_ptr_t addr, mem32_t paddrlen) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("recvfrom(s=%d, buf_addr=0x%x, len=%u, flags=0x%x, addr_addr=0x%x, paddrlen=0x%x)", + s, buf_addr, len, flags, addr.GetAddr(), paddrlen.GetAddr()); + + char *_buf_addr = (char *)Memory.VirtualToRealAddr(buf_addr); + sockaddr _addr; + memcpy(&_addr, Memory.VirtualToRealAddr(addr.GetAddr()), sizeof(sockaddr)); + _addr.sa_family = addr->sa_family; + s32 *_paddrlen = (s32 *)Memory.VirtualToRealAddr(paddrlen.GetAddr()); + int ret = recvfrom(s, _buf_addr, len, flags, &_addr, _paddrlen); + g_lastError = getLastError(); + return ret; } int recvmsg() @@ -131,10 +239,13 @@ int recvmsg() return CELL_OK; } -int send() +int sys_net_send(s32 s, u32 buf_addr, u32 len, s32 flags) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("send(s=%d, buf_addr=0x%x, len=%d, flags=0x%x)", s, buf_addr, len, flags); + char *buf = (char *)Memory.VirtualToRealAddr(buf_addr); + int ret = send(s, buf, len, flags); + g_lastError = getLastError(); + return ret; } int sendmsg() @@ -143,34 +254,51 @@ int sendmsg() return CELL_OK; } -int sendto() +int sys_net_sendto(s32 s, u32 buf_addr, u32 len, s32 flags, mem_ptr_t addr, u32 addrlen) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("sendto(s=%d, buf_addr=0x%x, len=%u, flags=0x%x, addr=0x%x, addrlen=%u)", + s, buf_addr, len, flags, addr.GetAddr(), addrlen); + + char *_buf_addr = (char *)Memory.VirtualToRealAddr(buf_addr); + sockaddr _addr; + memcpy(&_addr, Memory.VirtualToRealAddr(addr.GetAddr()), sizeof(sockaddr)); + _addr.sa_family = addr->sa_family; + int ret = sendto(s, _buf_addr, len, flags, &_addr, addrlen); + g_lastError = getLastError(); + return ret; } -int setsockopt() +int sys_net_setsockopt(s32 s, s32 level, s32 optname, u32 optval_addr, u32 optlen) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("socket(s=%d, level=%d, optname=%d, optval_addr=0x%x, optlen=%u)", s, level, optname, optval_addr, optlen); + char *_optval_addr = (char *)Memory.VirtualToRealAddr(optval_addr); + int ret = setsockopt(s, level, optname, _optval_addr, optlen); + g_lastError = getLastError(); + return ret; } -int shutdown() +int sys_net_shutdown(s32 s, s32 how) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("shutdown(s=%d, how=%d)", s, how); + int ret = shutdown(s, how); + g_lastError = getLastError(); + return ret; } -int socket() +int sys_net_socket(s32 family, s32 type, s32 protocol) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("socket(family=%d, type=%d, protocol=%d", family, type, protocol); + int ret = socket(family, type, protocol); + g_lastError = getLastError(); + return ret; } -int socketclose() +int sys_net_socketclose(s32 s) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("socket(s=%d)", s); + int ret = closesocket(s); + g_lastError = getLastError(); + return ret; } int socketpoll() @@ -185,9 +313,17 @@ int socketselect() return CELL_OK; } -int sys_net_initialize_network_ex() +int sys_net_initialize_network_ex(mem_ptr_t param) { - UNIMPLEMENTED_FUNC(sys_net); + sys_net.Warning("sys_net_initialize_network_ex(param_addr=0x%x)", param.GetAddr()); + g_lastError.SetAddr(Memory.Alloc(4, 1)); +#ifdef _WIN32 + WSADATA wsaData; + WORD wVersionRequested = MAKEWORD(1,1); + WSAStartup(wVersionRequested, &wsaData); +#elif + // TODO ? +#endif return CELL_OK; } @@ -245,10 +381,10 @@ int sys_net_show_nameserver() return CELL_OK; } -int _sys_net_errno_loc() +s32 _sys_net_errno_loc() { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("_sys_net_errno_loc()"); + return g_lastError.GetAddr(); } int sys_net_set_resolver_configurations() @@ -313,7 +449,14 @@ int sys_net_show_ifconfig() int sys_net_finalize_network() { - UNIMPLEMENTED_FUNC(sys_net); + sys_net.Warning("sys_net_initialize_network_ex()"); + Memory.Free(g_lastError.GetAddr()); + g_lastError.SetAddr(NULL); +#ifdef _WIN32 + WSACleanup(); +#else + // TODO ? +#endif return CELL_OK; } @@ -337,40 +480,39 @@ int sys_net_free_thread_context() void sys_net_init() { - // (TODO: Fix function overloading problem due to winsock.h and find addresses for ntohl and ntohs) - - //sys_net.AddFunc(0xc94f6939, accept); - //sys_net.AddFunc(0xb0a59804, bind); - //sys_net.AddFunc(0x64f66d35, connect); - //sys_net.AddFunc(0xf7ac8941, gethostbyaddr); - //sys_net.AddFunc(0x71f4c717, gethostbyname); - //sys_net.AddFunc(0xf9ec2db6, getpeername); - //sys_net.AddFunc(0x13efe7f5, getsockname); - //sys_net.AddFunc(0x5a045bd1, getsockopt); - //sys_net.AddFunc(0xdabbc2c0, inet_addr); - sys_net.AddFunc(0xa9a079e0, inet_aton); - sys_net.AddFunc(0x566893ce, inet_lnaof); - sys_net.AddFunc(0xb4152c74, inet_makeaddr); - sys_net.AddFunc(0xe39a62a7, inet_netof); - sys_net.AddFunc(0x506ad863, inet_network); - //sys_net.AddFunc(0x858a930b, inet_ntoa); - sys_net.AddFunc(0xc98a3146, inet_ntop); - sys_net.AddFunc(0x8af3825e, inet_pton); - //sys_net.AddFunc(0x28e208bb, listen); - //sys_net.AddFunc(, ntohl); - //sys_net.AddFunc(, ntohs); - //sys_net.AddFunc(0xfba04f37, recv); - //sys_net.AddFunc(0x1f953b9f, recvfrom); - sys_net.AddFunc(0xc9d09c34, recvmsg); - //sys_net.AddFunc(0xdc751b40, send); - sys_net.AddFunc(0xad09481b, sendmsg); - //sys_net.AddFunc(0x9647570b, sendto); - //sys_net.AddFunc(0x88f03575, setsockopt); - //sys_net.AddFunc(0xa50777c6, shutdown); - //sys_net.AddFunc(0x9c056962, socket); - sys_net.AddFunc(0x6db6e8cd, socketclose); - sys_net.AddFunc(0x051ee3ee, socketpoll); - sys_net.AddFunc(0x3f09e20a, socketselect); + // The names of the following functions are modified to avoid overloading problems + sys_net.AddFunc(0xc94f6939, sys_net_accept); + sys_net.AddFunc(0xb0a59804, sys_net_bind); + sys_net.AddFunc(0x64f66d35, sys_net_connect); + //sys_net.AddFunc(0xf7ac8941, sys_net_gethostbyaddr); + //sys_net.AddFunc(0x71f4c717, sys_net_gethostbyname); + //sys_net.AddFunc(0xf9ec2db6, sys_net_getpeername); + //sys_net.AddFunc(0x13efe7f5, sys_net_getsockname); + //sys_net.AddFunc(0x5a045bd1, sys_net_getsockopt); + //sys_net.AddFunc(0xdabbc2c0, sys_net_inet_addr); + //sys_net.AddFunc(0xa9a079e0, sys_net_inet_aton); + //sys_net.AddFunc(0x566893ce, sys_net_inet_lnaof); + //sys_net.AddFunc(0xb4152c74, sys_net_inet_makeaddr); + //sys_net.AddFunc(0xe39a62a7, sys_net_inet_netof); + //sys_net.AddFunc(0x506ad863, sys_net_inet_network); + //sys_net.AddFunc(0x858a930b, sys_net_inet_ntoa); + //sys_net.AddFunc(0xc98a3146, sys_net_inet_ntop); + sys_net.AddFunc(0x8af3825e, sys_net_inet_pton); + //sys_net.AddFunc(0x28e208bb, sys_net_listen); + //sys_net.AddFunc(, sys_net_ntohl); + //sys_net.AddFunc(, sys_net_ntohs); + sys_net.AddFunc(0xfba04f37, sys_net_recv); + sys_net.AddFunc(0x1f953b9f, sys_net_recvfrom); + //sys_net.AddFunc(0xc9d09c34, sys_net_recvmsg); + sys_net.AddFunc(0xdc751b40, sys_net_send); + //sys_net.AddFunc(0xad09481b, sys_net_sendmsg); + sys_net.AddFunc(0x9647570b, sys_net_sendto); + sys_net.AddFunc(0x88f03575, sys_net_setsockopt); + sys_net.AddFunc(0xa50777c6, sys_net_shutdown); + sys_net.AddFunc(0x9c056962, sys_net_socket); + sys_net.AddFunc(0x6db6e8cd, sys_net_socketclose); + //sys_net.AddFunc(0x051ee3ee, sys_net_socketpoll); + //sys_net.AddFunc(0x3f09e20a, sys_net_socketselect); sys_net.AddFunc(0x139a9e9b, sys_net_initialize_network_ex); sys_net.AddFunc(0x05bd4438, sys_net_get_udpp2p_test_param); diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.h b/rpcs3/Emu/SysCalls/Modules/sys_net.h new file mode 100644 index 0000000000..770a6958c2 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.h @@ -0,0 +1,16 @@ +#pragma once + +struct sys_net_initialize_parameter +{ + u32 memory_addr; + int memory_size; + int flags; +}; + +// The names of the following structs are modified to avoid overloading problems +struct sys_net_sockaddr +{ + u8 sa_len; + u8 sa_family; // sa_family_t + u8 sa_data[14]; +}; diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 80630f36d2..5a9fa6fb3f 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -312,6 +312,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index c045ad6bbe..6f796ff3fe 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -460,6 +460,9 @@ Emu\Audio\AL + + Emu\SysCalls\Modules + From 7f7d5a57c80a1308ae206890267359c9a7d2242f Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 11 Mar 2014 20:20:01 +0400 Subject: [PATCH 06/27] rldcr, rldcl instructions Some intructions fixed --- rpcs3/Emu/CPU/CPUThread.cpp | 2 +- rpcs3/Emu/Cell/PPUDisAsm.h | 7 +++++ rpcs3/Emu/Cell/PPUInstrTable.h | 3 ++- rpcs3/Emu/Cell/PPUInterpreter.h | 48 ++++++++++++++++++++++++++------- rpcs3/Emu/Cell/PPUOpcodes.h | 2 ++ 5 files changed, 50 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 1ec31434b2..ec21cc80a1 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -393,7 +393,7 @@ s64 CPUThread::ExecAsCallback(u64 pc, bool wait, u64 a1, u64 a2, u64 a3, u64 a4) { if (Emu.IsStopped()) { - ConLog.Warning("ExecAsCallback() aborted"); + ConLog.Warning("ExecAsCallback(wait=%s) aborted", wxString(wait ? "true" : false).wx_str()); return CELL_EABORT; // doesn't mean anything } Sleep(1); diff --git a/rpcs3/Emu/Cell/PPUDisAsm.h b/rpcs3/Emu/Cell/PPUDisAsm.h index a5cbf1775b..c904350589 100644 --- a/rpcs3/Emu/Cell/PPUDisAsm.h +++ b/rpcs3/Emu/Cell/PPUDisAsm.h @@ -1206,6 +1206,13 @@ private: { DisAsm_R2_INT2_RC("rldimi", ra, rs, sh, mb, rc); } + void RLDC_LR(u32 ra, u32 rs, u32 rb, u32 m_eb, bool is_r, bool rc) + { + if (is_r) + DisAsm_R3_INT2_RC("rldcr", ra, rs, rb, m_eb, 0, rc); + else + DisAsm_R3_INT2_RC("rldcl", ra, rs, rb, m_eb, 0, rc); + } void CMP(u32 crfd, u32 l, u32 ra, u32 rb) { DisAsm_CR1_R2(wxString::Format("cmp%s", wxString(l ? "d" : "w").wx_str()), crfd, ra, rb); diff --git a/rpcs3/Emu/Cell/PPUInstrTable.h b/rpcs3/Emu/Cell/PPUInstrTable.h index e82c02abdb..a65c9224a0 100644 --- a/rpcs3/Emu/Cell/PPUInstrTable.h +++ b/rpcs3/Emu/Cell/PPUInstrTable.h @@ -193,7 +193,7 @@ namespace PPU_instr static CodeField<26, 31> GD_04; //0x3f static CodeField<21, 31> GD_04_0;//0x7ff static CodeField<21, 30> GD_13; //0x3ff - static CodeField<28, 29> GD_1e; //0x3 + static CodeField<27, 29> GD_1e; //0x7 static CodeField<21, 30> GD_1f; //0x3ff static CodeField<30, 31> GD_3a; //0x3 static CodeField<26, 30> GD_3b; //0x1f @@ -441,6 +441,7 @@ namespace PPU_instr bind_instr(g1e_list, RLDICR, RA, RS, sh, me, RC); bind_instr(g1e_list, RLDIC, RA, RS, sh, mb, RC); bind_instr(g1e_list, RLDIMI, RA, RS, sh, mb, RC); + bind_instr(g1e_list, RLDC_LR, RA, RS, RB, mb, AA, RC); /*0x000*/bind_instr(g1f_list, CMP, CRFD, L_10, RA, RB); /*0x004*/bind_instr(g1f_list, TW, TO, RA, RB); diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index ea916d43b1..474cc75f25 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -2238,6 +2238,17 @@ private: CPU.GPR[ra] = (CPU.GPR[ra] & ~mask) | (rotl64(CPU.GPR[rs], sh) & mask); if(rc) CPU.UpdateCR0(CPU.GPR[ra]); } + void RLDC_LR(u32 ra, u32 rs, u32 rb, u32 m_eb, bool is_r, bool rc) + { + if (is_r) // rldcr + { + RLDICR(ra, rs, CPU.GPR[rb], m_eb, rc); + } + else // rldcl + { + RLDICL(ra, rs, CPU.GPR[rb], m_eb, rc); + } + } void CMP(u32 crfd, u32 l, u32 ra, u32 rb) { CPU.UpdateCRnS(l, crfd, CPU.GPR[ra], CPU.GPR[rb]); @@ -2766,7 +2777,7 @@ private: } void MULLW(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { - CPU.GPR[rd] = (s64)(s32)((s32)CPU.GPR[ra] * (s32)CPU.GPR[rb]); + CPU.GPR[rd] = (s64)((s64)(s32)CPU.GPR[ra] * (s64)(s32)CPU.GPR[rb]); if(rc) CPU.UpdateCR0(CPU.GPR[rd]); if(oe) UNK("mullwo"); } @@ -2949,7 +2960,7 @@ private: if (RB == 0 || ((u64)RA == (1ULL << 63) && RB == -1)) { if(oe) UNK("divdo"); - CPU.GPR[rd] = (((u64)RA & (1ULL << 63)) && RB == 0) ? -1 : 0; + CPU.GPR[rd] = /*(((u64)RA & (1ULL << 63)) && RB == 0) ? -1 :*/ 0; } else { @@ -2966,11 +2977,11 @@ private: if (RB == 0 || ((u32)RA == (1 << 31) && RB == -1)) { if(oe) UNK("divwo"); - CPU.GPR[rd] = (((u32)RA & (1 << 31)) && RB == 0) ? -1 : 0; + CPU.GPR[rd] = /*(((u32)RA & (1 << 31)) && RB == 0) ? -1 :*/ 0; } else { - CPU.GPR[rd] = (s64)(RA / RB); + CPU.GPR[rd] = (u32)(RA / RB); } if(rc) CPU.UpdateCR0(CPU.GPR[rd]); @@ -3077,18 +3088,34 @@ private: void SRAW(u32 ra, u32 rs, u32 rb, bool rc) { s32 RS = CPU.GPR[rs]; - s32 RB = CPU.GPR[rb]; - CPU.GPR[ra] = RS >> RB; - CPU.XER.CA = (RS < 0) & ((CPU.GPR[ra] << RB) != RS); + u8 shift = CPU.GPR[rb] & 63; + if (shift > 31) + { + CPU.GPR[ra] = 0 - (RS < 0); + CPU.XER.CA = (RS < 0); + } + else + { + CPU.GPR[ra] = RS >> shift; + CPU.XER.CA = (RS < 0) & ((CPU.GPR[ra] << shift) != RS); + } if(rc) CPU.UpdateCR0(CPU.GPR[ra]); } void SRAD(u32 ra, u32 rs, u32 rb, bool rc) { s64 RS = CPU.GPR[rs]; - s64 RB = CPU.GPR[rb]; - CPU.GPR[ra] = RS >> RB; - CPU.XER.CA = (RS < 0) & ((CPU.GPR[ra] << RB) != RS); + u8 shift = CPU.GPR[rb] & 127; + if (shift > 63) + { + CPU.GPR[ra] = 0 - (RS < 0); + CPU.XER.CA = (RS < 0); + } + else + { + CPU.GPR[ra] = RS >> shift; + CPU.XER.CA = (RS < 0) & ((CPU.GPR[ra] << shift) != RS); + } if(rc) CPU.UpdateCR0(CPU.GPR[ra]); } @@ -3162,6 +3189,7 @@ private: void EXTSW(u32 ra, u32 rs, bool rc) { CPU.GPR[ra] = (s64)(s32)CPU.GPR[rs]; + //CPU.XER.CA = ((s64)CPU.GPR[ra] < 0); // ??? if(rc) CPU.UpdateCR0(CPU.GPR[ra]); } /*0x3d6*///ICBI diff --git a/rpcs3/Emu/Cell/PPUOpcodes.h b/rpcs3/Emu/Cell/PPUOpcodes.h index 71a8d3b2f1..2d18686ecf 100644 --- a/rpcs3/Emu/Cell/PPUOpcodes.h +++ b/rpcs3/Emu/Cell/PPUOpcodes.h @@ -250,6 +250,7 @@ namespace PPU_opcodes RLDICR = 0x1, RLDIC = 0x2, RLDIMI = 0x3, + RLDC_LR = 0x4, }; enum G_1fOpcodes //Field 21 - 30 @@ -644,6 +645,7 @@ public: virtual void RLDICR(u32 ra, u32 rs, u32 sh, u32 me, bool rc) = 0; virtual void RLDIC(u32 ra, u32 rs, u32 sh, u32 mb, bool rc) = 0; virtual void RLDIMI(u32 ra, u32 rs, u32 sh, u32 mb, bool rc) = 0; + virtual void RLDC_LR(u32 ra, u32 rs, u32 rb, u32 m_eb, bool is_r, bool rc) = 0; virtual void CMP(u32 crfd, u32 l, u32 ra, u32 rb) = 0; virtual void TW(u32 to, u32 ra, u32 rb) = 0; virtual void LVSL(u32 vd, u32 ra, u32 rb) = 0; From b7b33145f6870fff3be00321a7d83dc9a11bcb01 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 10 Mar 2014 03:07:53 +0400 Subject: [PATCH 07/27] Compilation fix --- rpcs3/Emu/Cell/PPUThread.h | 2 +- rpcs3/Emu/SysCalls/Modules/cellSpurs.h | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUThread.h b/rpcs3/Emu/Cell/PPUThread.h index fbb53bf1ae..0302180399 100644 --- a/rpcs3/Emu/Cell/PPUThread.h +++ b/rpcs3/Emu/Cell/PPUThread.h @@ -526,7 +526,7 @@ static const s32 MAX_INT_VALUE = 0x7fffffff; class PPUThread : public PPCThread { public: - std::atomic owned_mutexes; + u32 owned_mutexes; public: PPCdouble FPR[32]; //Floating Point Register diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h index af9f4c4e6c..bc9f70b848 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h @@ -87,7 +87,8 @@ struct CellSpursTraceInfo //u8 padding[]; }; -__declspec(align(8)) struct CellTraceHeader +//__declspec(align(8)) +struct CellTraceHeader { u8 tag; u8 length; @@ -135,17 +136,20 @@ struct CellSpursTracePacket } data; }; -__declspec(align(128)) struct CellSpurs +//__declspec(align(128)) +struct CellSpurs { u8 skip[CELL_SPURS_SIZE]; }; -__declspec(align(128)) struct CellSpurs2 +//__declspec(align(128)) +struct CellSpurs2 { u8 skip[CELL_SPURS_SIZE2 - CELL_SPURS_SIZE]; }; -__declspec(align(8)) struct CellSpursAttribute +//__declspec(align(8)) +struct CellSpursAttribute { u8 skip[CELL_SPURS_ATTRIBUTE_SIZE]; }; @@ -184,7 +188,8 @@ enum }; -__declspec(align(128)) struct CellSpursTaskset +//__declspec(align(128)) +struct CellSpursTaskset { u8 skip[6400]; }; @@ -217,7 +222,8 @@ struct CellSpursTasksetInfo #define CELL_SPURS_TASKSET_SIZE CELL_SPURS_TASKSET_CLASS0_SIZE */ -__declspec(align(128)) struct CellSpursTaskset2 +//__declspec(align(128)) +struct CellSpursTaskset2 { be_t skip[10496]; }; @@ -267,7 +273,8 @@ struct CellSpursTaskAttribute2 //be_t __reserved__[]; }; -__declspec(align(128)) struct CellSpursTaskExitCode +//__declspec(align(128)) +struct CellSpursTaskExitCode { unsigned char skip[128]; }; From 5f3f7e197a7c692ecb379c2a37c1d132489659fb Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 12 Mar 2014 02:36:17 +1000 Subject: [PATCH 08/27] Linux build fix. --- rpcs3/CMakeLists.txt | 18 ++++++++++++++---- rpcs3/Emu/GS/GL/GLGSRender.cpp | 6 +++--- rpcs3/Emu/GS/GL/GLGSRender.h | 4 +--- rpcs3/Emu/GS/GL/OpenGL.h | 3 +++ rpcs3/Emu/SysCalls/Modules/cellL10n.cpp | 8 ++++++-- rpcs3/Emu/System.cpp | 16 ++++++++-------- rpcs3/Ini.cpp | 2 +- rpcs3/Ini.h | 12 ++++++------ rpcs3/Loader/Loader.cpp | 2 +- 9 files changed, 43 insertions(+), 28 deletions(-) diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index ba436d5957..b0e9b5eb5d 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -10,21 +10,29 @@ if (CMAKE_COMPILER_IS_GNUCXX) endif() set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules) -SET(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/../bin") +set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/../bin") add_definitions(-DGL_GLEXT_PROTOTYPES) add_definitions(-DGLX_GLXEXT_PROTOTYPES) find_package(wxWidgets COMPONENTS core base net aui gl REQUIRED) +find_package(GLEW REQUIRED) find_package(OpenGL REQUIRED) -find_package(FFMPEG REQUIRED) find_package(ZLIB REQUIRED) +find_package(OpenAL REQUIRED) include("${wxWidgets_USE_FILE}") +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(PLATFORM_ARCH "linux/x86_64") +else() + set(PLATFORM_ARCH "linux/x86") +endif() + include_directories( ${wxWidgets_INCLUDE_DIRS} -${FFMPEG_INCLUDE_DIR} +${OPENAL_INCLUDE_DIR} +${CMAKE_SOURCE_DIR}/../ffmpeg/${PLATFORM_ARCH}/include ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/Emu ${CMAKE_SOURCE_DIR}/Gui @@ -33,6 +41,8 @@ ${CMAKE_SOURCE_DIR}/Crypto ${CMAKE_SOURCE_DIR}/.. ) +link_directories(${CMAKE_SOURCE_DIR}/../ffmpeg/${PLATFORM_ARCH}/lib) + file( GLOB_RECURSE RPCS3_SRC @@ -48,5 +58,5 @@ ${CMAKE_SOURCE_DIR}/../Utilities/* add_executable(rpcs3 ${RPCS3_SRC}) -target_link_libraries(rpcs3 ${wxWidgets_LIBRARIES} ${OPENGL_LIBRARIES} ${ZLIB_LIBRARIES} ${FFMPEG_LIBRARIES}) +target_link_libraries(rpcs3 ${wxWidgets_LIBRARIES} ${OPENAL_LIBRARY} ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES} libavformat.a libavcodec.a libavutil.a libswresample.a libswscale.a ${ZLIB_LIBRARIES}) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index 9e1b4a6fd0..699e23da97 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -2,7 +2,6 @@ #include "GLGSRender.h" #include "Emu/Cell/PPCInstrTable.h" #include "Gui/RSXDebugger.h" -#include "OpenGL.h" #define CMD_DEBUG 0 #define DUMP_VERTEX_DATA 0 @@ -650,10 +649,11 @@ void GLGSRender::OnInitThread() #ifdef _WIN32 glSwapInterval(Ini.GSVSyncEnable.GetValue() ? 1 : 0); -#else +// Undefined reference: glXSwapIntervalEXT +/*#else if (GLXDrawable drawable = glXGetCurrentDrawable()){ glXSwapIntervalEXT(glXGetCurrentDisplay(), drawable, Ini.GSVSyncEnable.GetValue() ? 1 : 0); - } + }*/ #endif glGenTextures(1, &g_depth_tex); glGenTextures(1, &g_flip_tex); diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index 5f503bde02..4bd83f26e0 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -1,11 +1,9 @@ #pragma once #include "Emu/GS/GSRender.h" #include "Emu/GS/RSXThread.h" -#include #include "GLBuffers.h" -#include "GLProgram.h" -#include "OpenGL.h" #include "GLProgramBuffer.h" +#include #pragma comment(lib, "opengl32.lib") diff --git a/rpcs3/Emu/GS/GL/OpenGL.h b/rpcs3/Emu/GS/GL/OpenGL.h index 4089f466e1..5122b47589 100644 --- a/rpcs3/Emu/GS/GL/OpenGL.h +++ b/rpcs3/Emu/GS/GL/OpenGL.h @@ -1,4 +1,7 @@ #pragma once +#ifndef _WIN32 +#include +#endif #include #include "GL/glext.h" diff --git a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp index dcf34cd9d7..7745ed224d 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp @@ -2,7 +2,10 @@ #include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SC_FUNC.h" +// Requires GCC 4.10 apparently.. +#ifdef _MSC_VER #include +#endif void cellL10n_init(); Module cellL10n(0x001e, cellL10n_init); @@ -26,7 +29,7 @@ int UTF16stoUTF8s(mem16_ptr_t utf16, mem64_t utf16_len, mem8_ptr_t utf8, mem64_t std::u16string wstr =(char16_t*)Memory.VirtualToRealAddr(utf16); wstr.resize(utf16_len.GetValue()); // TODO: Is this really the role of utf16_len in this function? - +#ifdef _MSC_VER std::wstring_convert,char16_t> convert; std::string str = convert.to_bytes(wstr); @@ -36,6 +39,7 @@ int UTF16stoUTF8s(mem16_ptr_t utf16, mem64_t utf16_len, mem8_ptr_t utf8, mem64_t utf8_len = str.size(); Memory.WriteString(utf8, str.c_str()); +#endif return ConversionOK; } @@ -208,4 +212,4 @@ void cellL10n_init() // cellL10n.AddFunc(0xf9b1896d, SJISstoUCS2s); // cellL10n.AddFunc(0xfa4a675a, BIG5stoUCS2s); // cellL10n.AddFunc(0xfdbf6ac5, UTF8stoUCS2s); -} \ No newline at end of file +} diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 08f356707e..7c92cb7e3d 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -93,12 +93,12 @@ bool Emulator::BootGame(const std::string& path) { static const char* elf_path[6] = { - "\\PS3_GAME\\USRDIR\\BOOT.BIN", - "\\USRDIR\\BOOT.BIN", - "\\BOOT.BIN", - "\\PS3_GAME\\USRDIR\\EBOOT.BIN", - "\\USRDIR\\EBOOT.BIN", - "\\EBOOT.BIN", + "/PS3_GAME/USRDIR/BOOT.BIN", + "/USRDIR/BOOT.BIN", + "/BOOT.BIN", + "/PS3_GAME/USRDIR/EBOOT.BIN", + "/USRDIR/EBOOT.BIN", + "/EBOOT.BIN", }; for(int i=0; iGetPath()).GetPath()).GetPath(); wxString ps3_path; - const wxString& psf_path = root + "\\" + "PARAM.SFO"; + const wxString& psf_path = root + "/" + "PARAM.SFO"; vfsFile f(psf_path); if(f.IsOpened()) { From b31a990cf135599e1bbcf5f0b3068d81f3cdf0b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Tue, 11 Mar 2014 18:40:37 +0100 Subject: [PATCH 09/27] cellUserInfo module added & cellFsReadWithOffset --- rpcs3/Emu/SysCalls/Modules.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp | 75 +++++++++++++++++++++ rpcs3/Emu/SysCalls/Modules/cellUserInfo.h | 55 +++++++++++++++ rpcs3/Emu/SysCalls/Modules/sys_fs.cpp | 20 ++++++ rpcs3/rpcs3.vcxproj | 1 + rpcs3/rpcs3.vcxproj.filters | 3 + 6 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp create mode 100644 rpcs3/Emu/SysCalls/Modules/cellUserInfo.h diff --git a/rpcs3/Emu/SysCalls/Modules.cpp b/rpcs3/Emu/SysCalls/Modules.cpp index 07404f49ad..370ad88004 100644 --- a/rpcs3/Emu/SysCalls/Modules.cpp +++ b/rpcs3/Emu/SysCalls/Modules.cpp @@ -63,7 +63,7 @@ static const g_module_list[] = {0x002e, "cellLv2dbg"}, {0x0030, "cellUsbpspcm"}, {0x0031, "cellAvconfExt"}, - {0x0032, "cellSysutilUserinfo"}, + {0x0032, "cellUserInfo"}, {0x0033, "cellSysutilSavedata"}, {0x0034, "cellSubdisplay"}, {0x0035, "cellSysutilRec"}, diff --git a/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp b/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp new file mode 100644 index 0000000000..3c0a541d56 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "Emu/SysCalls/SysCalls.h" +#include "Emu/SysCalls/SC_FUNC.h" + +#include "cellUserInfo.h" + +void cellUserInfo_init(); +Module cellUserInfo(0x0032, cellUserInfo_init); + +int cellUserInfoGetStat(u32 id, mem_ptr_t stat) +{ + cellUserInfo.Warning("cellUserInfoGetStat(id=%d, stat_addr=0x%x)", id, stat.GetAddr()); + + if (!stat.IsGood()) + return CELL_USERINFO_ERROR_PARAM; + if (id > CELL_USERINFO_USER_MAX) + return CELL_USERINFO_ERROR_NOUSER; + + char path [256]; + sprintf(path, "/dev_hdd0/home/%08d", id); + if (!Emu.GetVFS().ExistsDir(path)) + return CELL_USERINFO_ERROR_NOUSER; + + sprintf(path, "/dev_hdd0/home/%08d/localusername", id); + vfsStream* stream = Emu.GetVFS().OpenFile(path, vfsRead); + if (!stream || !(stream->IsOpened())) + return CELL_USERINFO_ERROR_INTERNAL; + + char name [CELL_USERINFO_USERNAME_SIZE]; + memset(name, 0, CELL_USERINFO_USERNAME_SIZE); + stream->Read(name, CELL_USERINFO_USERNAME_SIZE); + stream->Close(); + + stat->id = id; + memcpy(stat->name, name, CELL_USERINFO_USERNAME_SIZE); + return CELL_OK; +} + +int cellUserInfoSelectUser_ListType() +{ + UNIMPLEMENTED_FUNC(cellUserInfo); + return CELL_OK; +} + +int cellUserInfoSelectUser_SetList() +{ + UNIMPLEMENTED_FUNC(cellUserInfo); + return CELL_OK; +} + +int cellUserInfoEnableOverlay() +{ + UNIMPLEMENTED_FUNC(cellUserInfo); + return CELL_OK; +} + +int cellUserInfoGetList(mem32_t listNum, mem_ptr_t listBuf, mem32_t currentUserId) +{ + cellUserInfo.Warning("cellUserInfoGetList(listNum_addr=0x%x, listBuf_addr=0x%x, currentUserId_addr=0x%x)", + listNum.GetAddr(), listBuf.GetAddr(), currentUserId.GetAddr()); + + listNum = 1; + listBuf->userId[0] = 1; + currentUserId = 1; + return CELL_OK; +} + +void cellUserInfo_init() +{ + cellUserInfo.AddFunc(0x2b761140, cellUserInfoGetStat); + cellUserInfo.AddFunc(0x3097cc1c, cellUserInfoSelectUser_ListType); + cellUserInfo.AddFunc(0x55123a25, cellUserInfoSelectUser_SetList); + cellUserInfo.AddFunc(0xb3516536, cellUserInfoEnableOverlay); + cellUserInfo.AddFunc(0xc55e338b, cellUserInfoGetList); +} diff --git a/rpcs3/Emu/SysCalls/Modules/cellUserInfo.h b/rpcs3/Emu/SysCalls/Modules/cellUserInfo.h new file mode 100644 index 0000000000..3498b0293c --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellUserInfo.h @@ -0,0 +1,55 @@ +#pragma once + +// Return Codes +enum +{ + CELL_USERINFO_RET_OK = 0, + CELL_USERINFO_RET_CANCEL = 1, + CELL_USERINFO_ERROR_BUSY = 0x8002c301, + CELL_USERINFO_ERROR_INTERNAL = 0x8002c302, + CELL_USERINFO_ERROR_PARAM = 0x8002c303, + CELL_USERINFO_ERROR_NOUSER = 0x8002c304, +}; + +// Enums +enum CellUserInfoParamSize +{ + CELL_USERINFO_USER_MAX = 16, + CELL_USERINFO_TITLE_SIZE = 256, + CELL_USERINFO_USERNAME_SIZE = 64, +}; + +enum CellUserInfoListType +{ + CELL_USERINFO_LISTTYPE_ALL = 0, + CELL_USERINFO_LISTTYPE_NOCURRENT = 1, +}; + +// Structs +struct CellUserInfoUserStat +{ + u32 id; + u8 name[CELL_USERINFO_USERNAME_SIZE]; +}; + +struct CellUserInfoUserList +{ + u32 userId[CELL_USERINFO_USER_MAX]; +}; + +struct CellUserInfoListSet +{ + u32 title_addr; // (char*) + u32 focus; + u32 fixedListNum; + mem_ptr_t fixedList; + u32 reserved_addr; // (void*) +}; + +struct CellUserInfoTypeSet +{ + u32 title_addr; // (char*) + u32 focus; + CellUserInfoListType type; + u32 reserved_addr; // (void*) +}; diff --git a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp index cf05cbf3b7..07c7c73a8e 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp @@ -270,6 +270,25 @@ int cellFsAioFinish(mem8_ptr_t mount_point) return CELL_OK; } +int cellFsReadWithOffset(u32 fd, u64 offset, u32 buf_addr, u64 buffer_size, mem64_t nread) +{ + sys_fs.Warning("cellFsReadWithOffset(fd=%d, offset=0x%llx, buf_addr=0x%x, buffer_size=%lld nread=0x%llx)", + fd, offset, buf_addr, buffer_size, nread.GetAddr()); + + int ret; + MemoryAllocator> oldPos, newPos; + ret = cellFsLseek(fd, 0, CELL_SEEK_CUR, oldPos.GetAddr()); // Save the current position + if (ret) return ret; + ret = cellFsLseek(fd, offset, CELL_SEEK_SET, newPos.GetAddr()); // Move to the specified offset + if (ret) return ret; + ret = cellFsRead(fd, buf_addr, buffer_size, nread.GetAddr()); // Read the file + if (ret) return ret; + ret = cellFsLseek(fd, Memory.Read64(oldPos.GetAddr()), CELL_SEEK_SET, newPos.GetAddr()); // Return to the old position + if (ret) return ret; + + return CELL_OK; +} + void sys_fs_init() { sys_fs.AddFunc(0x718bf5f8, cellFsOpen); @@ -295,5 +314,6 @@ void sys_fs_init() sys_fs.AddFunc(0x9f951810, cellFsAioFinish); sys_fs.AddFunc(0x1a108ab7, cellFsGetBlockSize); sys_fs.AddFunc(0xaa3b4bcd, cellFsGetFreeSize); + sys_fs.AddFunc(0x0d5b4a14, cellFsReadWithOffset); aio_init = false; } diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 5a9fa6fb3f..1dfb346159 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -304,6 +304,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 6f796ff3fe..b10d1cb470 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -463,6 +463,9 @@ Emu\SysCalls\Modules + + Emu\SysCalls\Modules + From a31160fe9933ccfbfb827d3231cb0d0c2a8d978d Mon Sep 17 00:00:00 2001 From: O1L Date: Tue, 11 Mar 2014 20:45:15 +0300 Subject: [PATCH 10/27] Fix converting audio data. Implemented some cellFsStRead functions. --- rpcs3/Emu/Audio/AL/OpenALThread.cpp | 2 +- rpcs3/Emu/Audio/AudioDumper.cpp | 2 - rpcs3/Emu/SysCalls/Modules/cellAudio.cpp | 4 +- rpcs3/Emu/SysCalls/Modules/sys_fs.cpp | 14 ++ rpcs3/Emu/SysCalls/SysCalls.h | 13 ++ rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp | 249 ++++++++++++++++++++++- rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h | 31 ++- 7 files changed, 308 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Audio/AL/OpenALThread.cpp b/rpcs3/Emu/Audio/AL/OpenALThread.cpp index 4517f527c0..e4a461171a 100644 --- a/rpcs3/Emu/Audio/AL/OpenALThread.cpp +++ b/rpcs3/Emu/Audio/AL/OpenALThread.cpp @@ -69,7 +69,7 @@ void OpenALThread::Stop() void OpenALThread::Open(const void* src, ALsizei size) { - alGenSources(1, &mSource); // WARNING: Memory leaks! + alGenSources(1, &mSource); checkForAlError("alGenSources"); alSourcei(mSource, AL_LOOPING, AL_FALSE); diff --git a/rpcs3/Emu/Audio/AudioDumper.cpp b/rpcs3/Emu/Audio/AudioDumper.cpp index 95b83272c0..f906b3531a 100644 --- a/rpcs3/Emu/Audio/AudioDumper.cpp +++ b/rpcs3/Emu/Audio/AudioDumper.cpp @@ -24,8 +24,6 @@ void AudioDumper::WriteHeader() size_t AudioDumper::WriteData(const void* buffer, size_t size) { size_t ret = m_output.Write(buffer, size); - - return ret; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index 486b1720a4..145f3e7f10 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -120,7 +120,7 @@ int cellAudioInit() buffer[i] = buffer2[i]; // convert the data from float to u16 - oal_buffer[i] = (u16)((float)buffer[i] * (1 << 16)); + oal_buffer[i] = (u16)((float)buffer[i] * (1 << 15)); } first_mix = false; } @@ -131,7 +131,7 @@ int cellAudioInit() buffer[i] = (buffer[i] + buffer2[i]) * 0.5; // TODO: valid mixing // convert the data from float to u16 - oal_buffer[i] = (u16)((float)buffer[i] * (1 << 16)); + oal_buffer[i] = (u16)((float)buffer[i] * (1 << 15)); } } } diff --git a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp index cf05cbf3b7..6f9589b6c0 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp @@ -295,5 +295,19 @@ void sys_fs_init() sys_fs.AddFunc(0x9f951810, cellFsAioFinish); sys_fs.AddFunc(0x1a108ab7, cellFsGetBlockSize); sys_fs.AddFunc(0xaa3b4bcd, cellFsGetFreeSize); + sys_fs.AddFunc(0x9b882495, cellFsGetDirectoryEntries); + sys_fs.AddFunc(0x2664c8ae, cellFsStReadInit); + sys_fs.AddFunc(0xd73938df, cellFsStReadFinish); + sys_fs.AddFunc(0xb3afee8b, cellFsStReadGetRingBuf); + sys_fs.AddFunc(0xcf34969c, cellFsStReadGetStatus); + sys_fs.AddFunc(0xbd273a88, cellFsStReadGetRegid); + sys_fs.AddFunc(0x8df28ff9, cellFsStReadStart); + sys_fs.AddFunc(0xf8e5d9a0, cellFsStReadStop); + sys_fs.AddFunc(0x27800c6b, cellFsStRead); + sys_fs.AddFunc(0x190912f6, cellFsStReadGetCurrentAddr); + sys_fs.AddFunc(0x81f33783, cellFsStReadPutCurrentAddr); + sys_fs.AddFunc(0x8f71c5b2, cellFsStReadWait); + sys_fs.AddFunc(0x866f6aec, cellFsStReadWaitCallback); + aio_init = false; } diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index c97518f7a4..9d75580371 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -262,6 +262,19 @@ extern int cellFsTruncate(u32 path_addr, u64 size); extern int cellFsFGetBlockSize(u32 fd, mem64_t sector_size, mem64_t block_size); extern int cellFsGetBlockSize(u32 path_addr, mem64_t sector_size, mem64_t block_size); extern int cellFsGetFreeSize(u32 path_addr, mem32_t block_size, mem64_t block_count); +extern int cellFsGetDirectoryEntries(u32 fd, mem_ptr_t entries, u32 entries_size, mem32_t data_count); +extern int cellFsStReadInit(u32 fd, mem_ptr_t ringbuf); +extern int cellFsStReadFinish(u32 fd); +extern int cellFsStReadGetRingBuf(u32 fd, mem_ptr_t ringbuf); +extern int cellFsStReadGetStatus(u32 fd, mem64_t status); +extern int cellFsStReadGetRegid(u32 fd, mem64_t regid); +extern int cellFsStReadStart(u32 fd, u64 offset, u64 size); +extern int cellFsStReadStop(u32 fd); +extern int cellFsStRead(u32 fd, u32 buf_addr, u64 size, mem64_t rsize); +extern int cellFsStReadGetCurrentAddr(u32 fd, mem32_t addr_addr, mem64_t size); +extern int cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size); +extern int cellFsStReadWait(u32 fd, u64 size); +extern int cellFsStReadWaitCallback(u32 fd, u64 size, mem_func_ptr_t func); //cellVideo extern int cellVideoOutGetState(u32 videoOut, u32 deviceIndex, u32 state_addr); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp index 80b425bf02..dfbe386ca0 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp @@ -10,6 +10,39 @@ enum IDFlag_Dir = 2, }; +struct FsRingBuffer +{ + u64 m_ringbuf_size; + u64 m_block_size; + u64 m_transfer_rate; + u32 m_copy; +}; + +struct FsRingBufferConfig +{ + FsRingBuffer m_ring_buffer; + u32 m_buffer; + u64 m_fs_status; + u64 m_regid; + u32 m_alloc_mem_size; + u32 m_current_addr; + + FsRingBufferConfig() + : m_fs_status(CELL_FS_ST_NOT_INITIALIZED) + , m_regid(0) + , m_alloc_mem_size(0) + , m_current_addr(0) + { + memset(&m_ring_buffer, 0, sizeof(FsRingBufferConfig)); + } + + ~FsRingBufferConfig() + { + memset(&m_ring_buffer, 0, sizeof(FsRingBufferConfig)); + } +} m_fs_config; + + int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) { const wxString& path = Memory.ReadString(path_addr); @@ -290,7 +323,7 @@ int cellFsMkdir(u32 path_addr, u32 mode) { const wxString& ps3_path = Memory.ReadString(path_addr); sys_fs.Log("cellFsMkdir(path=\"%s\", mode=0x%x)", ps3_path.wx_str(), mode); - + vfsDir dir; if(dir.IsExists(ps3_path)) return CELL_EEXIST; @@ -484,3 +517,217 @@ int cellFsGetFreeSize(u32 path_addr, mem32_t block_size, mem64_t block_count) return CELL_OK; } + +int cellFsGetDirectoryEntries(u32 fd, mem_ptr_t entries, u32 entries_size, mem32_t data_count) +{ + sys_fs.Log("cellFsGetDirectoryEntries(fd=%d, entries_addr=0x%x, entries_size = 0x%x, data_count_addr=0x%x)", fd, entries.GetAddr(), entries_size, data_count.GetAddr()); + + vfsDirBase* directory; + if(!sys_fs.CheckId(fd, directory)) + return CELL_ESRCH; + if(!entries.IsGood() || !data_count.IsGood()) + return CELL_EFAULT; + + const DirEntryInfo* info = directory->Read(); + if(info) + { + data_count = 1; + Memory.WriteString(entries.GetAddr()+2, info->name.wx_str()); + entries->entry_name.d_namlen = info->name.Length(); + entries->entry_name.d_type = (info->flags & DirEntry_TypeFile) ? CELL_FS_TYPE_REGULAR : CELL_FS_TYPE_DIRECTORY; + + entries->attribute.st_mode = + CELL_FS_S_IRUSR | CELL_FS_S_IWUSR | CELL_FS_S_IXUSR | + CELL_FS_S_IRGRP | CELL_FS_S_IWGRP | CELL_FS_S_IXGRP | + CELL_FS_S_IROTH | CELL_FS_S_IWOTH | CELL_FS_S_IXOTH; + + entries->attribute.st_uid = 0; + entries->attribute.st_gid = 0; + entries->attribute.st_atime_ = 0; //TODO + entries->attribute.st_mtime_ = 0; //TODO + entries->attribute.st_ctime_ = 0; //TODO + entries->attribute.st_blksize = 4096; + } + else + { + data_count = 0; + } + + return CELL_OK; +} + +int cellFsStReadInit(u32 fd, mem_ptr_t ringbuf) +{ + sys_fs.Warning("cellFsStReadInit(fd=%d, ringbuf_addr=0x%x)", fd, ringbuf.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if(!ringbuf.IsGood()) + return CELL_EFAULT; + + FsRingBuffer& buffer = m_fs_config.m_ring_buffer; + + buffer.m_block_size = ringbuf->block_size; + buffer.m_copy = ringbuf->copy; + buffer.m_ringbuf_size = ringbuf->ringbuf_size; + buffer.m_transfer_rate = ringbuf->transfer_rate; + + if(buffer.m_ringbuf_size < 0x40000000) // If the size is less than 1MB + m_fs_config.m_alloc_mem_size = ((ringbuf->ringbuf_size + 64 * 1024 - 1) / (64 * 1024)) * (64 * 1024); + m_fs_config.m_alloc_mem_size = ((ringbuf->ringbuf_size + 1024 * 1024 - 1) / (1024 * 1024)) * (1024 * 1024); + + // alloc memory + m_fs_config.m_buffer = Memory.Alloc(m_fs_config.m_alloc_mem_size, 1024); + memset(Memory + m_fs_config.m_buffer, 0, m_fs_config.m_alloc_mem_size); + + m_fs_config.m_fs_status = CELL_FS_ST_INITIALIZED; + + return CELL_OK; +} + +int cellFsStReadFinish(u32 fd) +{ + sys_fs.Warning("cellFsStReadFinish(fd=%d)", fd); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + Memory.Free(m_fs_config.m_buffer); + m_fs_config.m_fs_status = CELL_FS_ST_NOT_INITIALIZED; + + return CELL_OK; +} + +int cellFsStReadGetRingBuf(u32 fd, mem_ptr_t ringbuf) +{ + sys_fs.Warning("cellFsStReadGetRingBuf(fd=%d, ringbuf_addr=0x%x)", fd, ringbuf.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if(!ringbuf.IsGood()) + return CELL_EFAULT; + + FsRingBuffer& buffer = m_fs_config.m_ring_buffer; + + ringbuf->block_size = buffer.m_block_size; + ringbuf->copy = buffer.m_copy; + ringbuf->ringbuf_size = buffer.m_ringbuf_size; + ringbuf->transfer_rate = buffer.m_transfer_rate; + + sys_fs.Warning("*** fs stream config: block_size=0x%llx, copy=%d, ringbuf_size = 0x%llx, transfer_rate = 0x%llx", ringbuf->block_size, ringbuf->copy, + ringbuf->ringbuf_size, ringbuf->transfer_rate); + return CELL_OK; +} + +int cellFsStReadGetStatus(u32 fd, mem64_t status) +{ + sys_fs.Warning("cellFsStReadGetRingBuf(fd=%d, status_addr=0x%x)", fd, status.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + status = m_fs_config.m_fs_status; + + return CELL_OK; +} + +int cellFsStReadGetRegid(u32 fd, mem64_t regid) +{ + sys_fs.Warning("cellFsStReadGetRingBuf(fd=%d, regid_addr=0x%x)", fd, regid.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + regid = m_fs_config.m_regid; + + return CELL_OK; +} + +int cellFsStReadStart(u32 fd, u64 offset, u64 size) +{ + sys_fs.Warning("TODO: cellFsStReadStart(fd=%d, offset=0x%llx, size=0x%llx)", fd, offset, size); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + m_fs_config.m_current_addr = m_fs_config.m_buffer + (u32)offset; + m_fs_config.m_fs_status = CELL_FS_ST_PROGRESS; + + return CELL_OK; +} + +int cellFsStReadStop(u32 fd) +{ + sys_fs.Warning("cellFsStReadStop(fd=%d)", fd); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + m_fs_config.m_fs_status = CELL_FS_ST_STOP; + + return CELL_OK; +} + +int cellFsStRead(u32 fd, u32 buf_addr, u64 size, mem64_t rsize) +{ + sys_fs.Warning("TODO: cellFsStRead(fd=%d, buf_addr=0x%x, size=0x%llx, rsize_addr = 0x%x)", fd, buf_addr, size, rsize.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if (rsize.GetAddr() && !rsize.IsGood()) return CELL_EFAULT; + + m_fs_config.m_regid += size; + rsize = m_fs_config.m_regid; + + return CELL_OK; +} + +int cellFsStReadGetCurrentAddr(u32 fd, mem32_t addr_addr, mem64_t size) +{ + sys_fs.Warning("TODO: cellFsStReadGetCurrentAddr(fd=%d, addr_addr=0x%x, size_addr = 0x%x)", fd, addr_addr.GetAddr(), size.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if (!addr_addr.IsGood() && !size.IsGood()) return CELL_EFAULT; + + return CELL_OK; +} + +int cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size) +{ + sys_fs.Warning("TODO: cellFsStReadPutCurrentAddr(fd=%d, addr_addr=0x%x, size = 0x%llx)", fd, addr_addr, size); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if (!Memory.IsGoodAddr(addr_addr)) return CELL_EFAULT; + + return CELL_OK; +} + +int cellFsStReadWait(u32 fd, u64 size) +{ + sys_fs.Warning("TODO: cellFsStReadWait(fd=%d, size = 0x%llx)", fd, size); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + return CELL_OK; +} + +int cellFsStReadWaitCallback(u32 fd, u64 size, mem_func_ptr_t func) +{ + sys_fs.Warning("TODO: cellFsStReadWaitCallback(fd=%d, size = 0x%llx, func_addr = 0x%x)", fd, size, func.GetAddr()); + + if (!func.IsGood()) + return CELL_EFAULT; + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + return CELL_OK; +} \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h index 58e0af41f8..4029d50201 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h +++ b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h @@ -56,6 +56,21 @@ enum FsDirentType CELL_FS_TYPE_SYMLINK = 3, }; +enum CellFsRingBufferCopy +{ + CELL_FS_ST_COPY = 0, + CELL_FS_ST_COPYLESS = 1, +}; + +enum cellFsStStatus +{ + CELL_FS_ST_INITIALIZED = 0x0001, + CELL_FS_ST_NOT_INITIALIZED = 0x0002, + CELL_FS_ST_STOP = 0x0100, + CELL_FS_ST_PROGRESS = 0x0200, +}; + + #pragma pack(4) struct CellFsStat @@ -92,4 +107,18 @@ struct CellFsAio be_t buf_addr; be_t size; be_t user_data; -}; \ No newline at end of file +}; + +struct CellFsDirectoryEntry +{ + CellFsStat attribute; + CellFsDirent entry_name; +}; + +struct CellFsRingBuffer +{ + be_t ringbuf_size; + be_t block_size; + be_t transfer_rate; + be_t copy; +}; From fb1b57720c124f22d3d8148df61e6df5a64aba04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Tue, 11 Mar 2014 20:14:39 +0100 Subject: [PATCH 11/27] Merge pull request #100 from O1L/master --- rpcs3/Emu/Audio/AL/OpenALThread.cpp | 2 +- rpcs3/Emu/Audio/AudioDumper.cpp | 2 - rpcs3/Emu/SysCalls/Modules/cellAudio.cpp | 4 +- rpcs3/Emu/SysCalls/Modules/sys_fs.cpp | 14 ++ rpcs3/Emu/SysCalls/SysCalls.h | 13 ++ rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp | 249 ++++++++++++++++++++++- rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h | 31 ++- 7 files changed, 308 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Audio/AL/OpenALThread.cpp b/rpcs3/Emu/Audio/AL/OpenALThread.cpp index 4517f527c0..e4a461171a 100644 --- a/rpcs3/Emu/Audio/AL/OpenALThread.cpp +++ b/rpcs3/Emu/Audio/AL/OpenALThread.cpp @@ -69,7 +69,7 @@ void OpenALThread::Stop() void OpenALThread::Open(const void* src, ALsizei size) { - alGenSources(1, &mSource); // WARNING: Memory leaks! + alGenSources(1, &mSource); checkForAlError("alGenSources"); alSourcei(mSource, AL_LOOPING, AL_FALSE); diff --git a/rpcs3/Emu/Audio/AudioDumper.cpp b/rpcs3/Emu/Audio/AudioDumper.cpp index 95b83272c0..f906b3531a 100644 --- a/rpcs3/Emu/Audio/AudioDumper.cpp +++ b/rpcs3/Emu/Audio/AudioDumper.cpp @@ -24,8 +24,6 @@ void AudioDumper::WriteHeader() size_t AudioDumper::WriteData(const void* buffer, size_t size) { size_t ret = m_output.Write(buffer, size); - - return ret; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index 486b1720a4..145f3e7f10 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -120,7 +120,7 @@ int cellAudioInit() buffer[i] = buffer2[i]; // convert the data from float to u16 - oal_buffer[i] = (u16)((float)buffer[i] * (1 << 16)); + oal_buffer[i] = (u16)((float)buffer[i] * (1 << 15)); } first_mix = false; } @@ -131,7 +131,7 @@ int cellAudioInit() buffer[i] = (buffer[i] + buffer2[i]) * 0.5; // TODO: valid mixing // convert the data from float to u16 - oal_buffer[i] = (u16)((float)buffer[i] * (1 << 16)); + oal_buffer[i] = (u16)((float)buffer[i] * (1 << 15)); } } } diff --git a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp index 07c7c73a8e..a76a583acc 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp @@ -315,5 +315,19 @@ void sys_fs_init() sys_fs.AddFunc(0x1a108ab7, cellFsGetBlockSize); sys_fs.AddFunc(0xaa3b4bcd, cellFsGetFreeSize); sys_fs.AddFunc(0x0d5b4a14, cellFsReadWithOffset); + sys_fs.AddFunc(0x9b882495, cellFsGetDirectoryEntries); + sys_fs.AddFunc(0x2664c8ae, cellFsStReadInit); + sys_fs.AddFunc(0xd73938df, cellFsStReadFinish); + sys_fs.AddFunc(0xb3afee8b, cellFsStReadGetRingBuf); + sys_fs.AddFunc(0xcf34969c, cellFsStReadGetStatus); + sys_fs.AddFunc(0xbd273a88, cellFsStReadGetRegid); + sys_fs.AddFunc(0x8df28ff9, cellFsStReadStart); + sys_fs.AddFunc(0xf8e5d9a0, cellFsStReadStop); + sys_fs.AddFunc(0x27800c6b, cellFsStRead); + sys_fs.AddFunc(0x190912f6, cellFsStReadGetCurrentAddr); + sys_fs.AddFunc(0x81f33783, cellFsStReadPutCurrentAddr); + sys_fs.AddFunc(0x8f71c5b2, cellFsStReadWait); + sys_fs.AddFunc(0x866f6aec, cellFsStReadWaitCallback); + aio_init = false; } diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index c97518f7a4..9d75580371 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -262,6 +262,19 @@ extern int cellFsTruncate(u32 path_addr, u64 size); extern int cellFsFGetBlockSize(u32 fd, mem64_t sector_size, mem64_t block_size); extern int cellFsGetBlockSize(u32 path_addr, mem64_t sector_size, mem64_t block_size); extern int cellFsGetFreeSize(u32 path_addr, mem32_t block_size, mem64_t block_count); +extern int cellFsGetDirectoryEntries(u32 fd, mem_ptr_t entries, u32 entries_size, mem32_t data_count); +extern int cellFsStReadInit(u32 fd, mem_ptr_t ringbuf); +extern int cellFsStReadFinish(u32 fd); +extern int cellFsStReadGetRingBuf(u32 fd, mem_ptr_t ringbuf); +extern int cellFsStReadGetStatus(u32 fd, mem64_t status); +extern int cellFsStReadGetRegid(u32 fd, mem64_t regid); +extern int cellFsStReadStart(u32 fd, u64 offset, u64 size); +extern int cellFsStReadStop(u32 fd); +extern int cellFsStRead(u32 fd, u32 buf_addr, u64 size, mem64_t rsize); +extern int cellFsStReadGetCurrentAddr(u32 fd, mem32_t addr_addr, mem64_t size); +extern int cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size); +extern int cellFsStReadWait(u32 fd, u64 size); +extern int cellFsStReadWaitCallback(u32 fd, u64 size, mem_func_ptr_t func); //cellVideo extern int cellVideoOutGetState(u32 videoOut, u32 deviceIndex, u32 state_addr); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp index 80b425bf02..dfbe386ca0 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp @@ -10,6 +10,39 @@ enum IDFlag_Dir = 2, }; +struct FsRingBuffer +{ + u64 m_ringbuf_size; + u64 m_block_size; + u64 m_transfer_rate; + u32 m_copy; +}; + +struct FsRingBufferConfig +{ + FsRingBuffer m_ring_buffer; + u32 m_buffer; + u64 m_fs_status; + u64 m_regid; + u32 m_alloc_mem_size; + u32 m_current_addr; + + FsRingBufferConfig() + : m_fs_status(CELL_FS_ST_NOT_INITIALIZED) + , m_regid(0) + , m_alloc_mem_size(0) + , m_current_addr(0) + { + memset(&m_ring_buffer, 0, sizeof(FsRingBufferConfig)); + } + + ~FsRingBufferConfig() + { + memset(&m_ring_buffer, 0, sizeof(FsRingBufferConfig)); + } +} m_fs_config; + + int cellFsOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size) { const wxString& path = Memory.ReadString(path_addr); @@ -290,7 +323,7 @@ int cellFsMkdir(u32 path_addr, u32 mode) { const wxString& ps3_path = Memory.ReadString(path_addr); sys_fs.Log("cellFsMkdir(path=\"%s\", mode=0x%x)", ps3_path.wx_str(), mode); - + vfsDir dir; if(dir.IsExists(ps3_path)) return CELL_EEXIST; @@ -484,3 +517,217 @@ int cellFsGetFreeSize(u32 path_addr, mem32_t block_size, mem64_t block_count) return CELL_OK; } + +int cellFsGetDirectoryEntries(u32 fd, mem_ptr_t entries, u32 entries_size, mem32_t data_count) +{ + sys_fs.Log("cellFsGetDirectoryEntries(fd=%d, entries_addr=0x%x, entries_size = 0x%x, data_count_addr=0x%x)", fd, entries.GetAddr(), entries_size, data_count.GetAddr()); + + vfsDirBase* directory; + if(!sys_fs.CheckId(fd, directory)) + return CELL_ESRCH; + if(!entries.IsGood() || !data_count.IsGood()) + return CELL_EFAULT; + + const DirEntryInfo* info = directory->Read(); + if(info) + { + data_count = 1; + Memory.WriteString(entries.GetAddr()+2, info->name.wx_str()); + entries->entry_name.d_namlen = info->name.Length(); + entries->entry_name.d_type = (info->flags & DirEntry_TypeFile) ? CELL_FS_TYPE_REGULAR : CELL_FS_TYPE_DIRECTORY; + + entries->attribute.st_mode = + CELL_FS_S_IRUSR | CELL_FS_S_IWUSR | CELL_FS_S_IXUSR | + CELL_FS_S_IRGRP | CELL_FS_S_IWGRP | CELL_FS_S_IXGRP | + CELL_FS_S_IROTH | CELL_FS_S_IWOTH | CELL_FS_S_IXOTH; + + entries->attribute.st_uid = 0; + entries->attribute.st_gid = 0; + entries->attribute.st_atime_ = 0; //TODO + entries->attribute.st_mtime_ = 0; //TODO + entries->attribute.st_ctime_ = 0; //TODO + entries->attribute.st_blksize = 4096; + } + else + { + data_count = 0; + } + + return CELL_OK; +} + +int cellFsStReadInit(u32 fd, mem_ptr_t ringbuf) +{ + sys_fs.Warning("cellFsStReadInit(fd=%d, ringbuf_addr=0x%x)", fd, ringbuf.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if(!ringbuf.IsGood()) + return CELL_EFAULT; + + FsRingBuffer& buffer = m_fs_config.m_ring_buffer; + + buffer.m_block_size = ringbuf->block_size; + buffer.m_copy = ringbuf->copy; + buffer.m_ringbuf_size = ringbuf->ringbuf_size; + buffer.m_transfer_rate = ringbuf->transfer_rate; + + if(buffer.m_ringbuf_size < 0x40000000) // If the size is less than 1MB + m_fs_config.m_alloc_mem_size = ((ringbuf->ringbuf_size + 64 * 1024 - 1) / (64 * 1024)) * (64 * 1024); + m_fs_config.m_alloc_mem_size = ((ringbuf->ringbuf_size + 1024 * 1024 - 1) / (1024 * 1024)) * (1024 * 1024); + + // alloc memory + m_fs_config.m_buffer = Memory.Alloc(m_fs_config.m_alloc_mem_size, 1024); + memset(Memory + m_fs_config.m_buffer, 0, m_fs_config.m_alloc_mem_size); + + m_fs_config.m_fs_status = CELL_FS_ST_INITIALIZED; + + return CELL_OK; +} + +int cellFsStReadFinish(u32 fd) +{ + sys_fs.Warning("cellFsStReadFinish(fd=%d)", fd); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + Memory.Free(m_fs_config.m_buffer); + m_fs_config.m_fs_status = CELL_FS_ST_NOT_INITIALIZED; + + return CELL_OK; +} + +int cellFsStReadGetRingBuf(u32 fd, mem_ptr_t ringbuf) +{ + sys_fs.Warning("cellFsStReadGetRingBuf(fd=%d, ringbuf_addr=0x%x)", fd, ringbuf.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if(!ringbuf.IsGood()) + return CELL_EFAULT; + + FsRingBuffer& buffer = m_fs_config.m_ring_buffer; + + ringbuf->block_size = buffer.m_block_size; + ringbuf->copy = buffer.m_copy; + ringbuf->ringbuf_size = buffer.m_ringbuf_size; + ringbuf->transfer_rate = buffer.m_transfer_rate; + + sys_fs.Warning("*** fs stream config: block_size=0x%llx, copy=%d, ringbuf_size = 0x%llx, transfer_rate = 0x%llx", ringbuf->block_size, ringbuf->copy, + ringbuf->ringbuf_size, ringbuf->transfer_rate); + return CELL_OK; +} + +int cellFsStReadGetStatus(u32 fd, mem64_t status) +{ + sys_fs.Warning("cellFsStReadGetRingBuf(fd=%d, status_addr=0x%x)", fd, status.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + status = m_fs_config.m_fs_status; + + return CELL_OK; +} + +int cellFsStReadGetRegid(u32 fd, mem64_t regid) +{ + sys_fs.Warning("cellFsStReadGetRingBuf(fd=%d, regid_addr=0x%x)", fd, regid.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + regid = m_fs_config.m_regid; + + return CELL_OK; +} + +int cellFsStReadStart(u32 fd, u64 offset, u64 size) +{ + sys_fs.Warning("TODO: cellFsStReadStart(fd=%d, offset=0x%llx, size=0x%llx)", fd, offset, size); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + m_fs_config.m_current_addr = m_fs_config.m_buffer + (u32)offset; + m_fs_config.m_fs_status = CELL_FS_ST_PROGRESS; + + return CELL_OK; +} + +int cellFsStReadStop(u32 fd) +{ + sys_fs.Warning("cellFsStReadStop(fd=%d)", fd); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + m_fs_config.m_fs_status = CELL_FS_ST_STOP; + + return CELL_OK; +} + +int cellFsStRead(u32 fd, u32 buf_addr, u64 size, mem64_t rsize) +{ + sys_fs.Warning("TODO: cellFsStRead(fd=%d, buf_addr=0x%x, size=0x%llx, rsize_addr = 0x%x)", fd, buf_addr, size, rsize.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if (rsize.GetAddr() && !rsize.IsGood()) return CELL_EFAULT; + + m_fs_config.m_regid += size; + rsize = m_fs_config.m_regid; + + return CELL_OK; +} + +int cellFsStReadGetCurrentAddr(u32 fd, mem32_t addr_addr, mem64_t size) +{ + sys_fs.Warning("TODO: cellFsStReadGetCurrentAddr(fd=%d, addr_addr=0x%x, size_addr = 0x%x)", fd, addr_addr.GetAddr(), size.GetAddr()); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if (!addr_addr.IsGood() && !size.IsGood()) return CELL_EFAULT; + + return CELL_OK; +} + +int cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size) +{ + sys_fs.Warning("TODO: cellFsStReadPutCurrentAddr(fd=%d, addr_addr=0x%x, size = 0x%llx)", fd, addr_addr, size); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + if (!Memory.IsGoodAddr(addr_addr)) return CELL_EFAULT; + + return CELL_OK; +} + +int cellFsStReadWait(u32 fd, u64 size) +{ + sys_fs.Warning("TODO: cellFsStReadWait(fd=%d, size = 0x%llx)", fd, size); + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + return CELL_OK; +} + +int cellFsStReadWaitCallback(u32 fd, u64 size, mem_func_ptr_t func) +{ + sys_fs.Warning("TODO: cellFsStReadWaitCallback(fd=%d, size = 0x%llx, func_addr = 0x%x)", fd, size, func.GetAddr()); + + if (!func.IsGood()) + return CELL_EFAULT; + + vfsStream* file; + if(!sys_fs.CheckId(fd, file)) return CELL_ESRCH; + + return CELL_OK; +} \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h index 58e0af41f8..4029d50201 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h +++ b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.h @@ -56,6 +56,21 @@ enum FsDirentType CELL_FS_TYPE_SYMLINK = 3, }; +enum CellFsRingBufferCopy +{ + CELL_FS_ST_COPY = 0, + CELL_FS_ST_COPYLESS = 1, +}; + +enum cellFsStStatus +{ + CELL_FS_ST_INITIALIZED = 0x0001, + CELL_FS_ST_NOT_INITIALIZED = 0x0002, + CELL_FS_ST_STOP = 0x0100, + CELL_FS_ST_PROGRESS = 0x0200, +}; + + #pragma pack(4) struct CellFsStat @@ -92,4 +107,18 @@ struct CellFsAio be_t buf_addr; be_t size; be_t user_data; -}; \ No newline at end of file +}; + +struct CellFsDirectoryEntry +{ + CellFsStat attribute; + CellFsDirent entry_name; +}; + +struct CellFsRingBuffer +{ + be_t ringbuf_size; + be_t block_size; + be_t transfer_rate; + be_t copy; +}; From 80cfb2eb580256184e875bfae08a76ff9d116fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Wed, 12 Mar 2014 23:34:35 +0100 Subject: [PATCH 12/27] cellGame functions & MULHD(U) warn. disabled --- rpcs3/Emu/Cell/PPUInterpreter.h | 5 ++--- rpcs3/Emu/SysCalls/Modules/cellGame.cpp | 24 ++++++++++++++++++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index ea916d43b1..2f9f4ae792 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -2313,8 +2313,7 @@ private: #ifdef _M_X64 CPU.GPR[rd] = __umulh(CPU.GPR[ra], CPU.GPR[rb]); #else - ConLog.Warning("MULHDU"); - + //ConLog.Warning("MULHDU"); const u64 RA = CPU.GPR[ra]; const u64 RB = CPU.GPR[rb]; @@ -2520,7 +2519,7 @@ private: #ifdef _M_X64 CPU.GPR[rd] = __mulh(CPU.GPR[ra], CPU.GPR[rb]); #else - ConLog.Warning("MULHD"); + //ConLog.Warning("MULHD"); const s64 RA = CPU.GPR[ra]; const s64 RB = CPU.GPR[rb]; diff --git a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp index a42dcb14fe..1b3ad08eae 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp @@ -118,9 +118,15 @@ int cellGameBootCheck(mem32_t type, mem32_t attributes, mem_ptr_thddFreeSizeKB = 40000000; //40 GB, TODO: Use the free space of the computer's HDD where RPCS3 is being run. size->sizeKB = CELL_GAME_SIZEKB_NOTCALC; @@ -150,6 +156,16 @@ int cellGameContentPermit(mem_list_ptr_t contentInfoPath, mem_list_ptr_t buf, u32 bufsize) if(!buf.IsGood()) return CELL_GAME_ERROR_PARAM; - // TODO: Locate the PARAM.SFO. The following path is in most cases wrong. + // TODO: Locate the PARAM.SFO. The following path may be wrong. vfsFile f("/app_home/PARAM.SFO"); PSFLoader psf(f); if(!psf.Load(false)) From 0e437312adb1b02c9e04292c1ba51f5d58acceed Mon Sep 17 00:00:00 2001 From: DH Date: Thu, 13 Mar 2014 02:26:53 +0200 Subject: [PATCH 13/27] Improved OpenAL audio output Implemented LDBRX PPU instruction Enabled FRSQRTE PPU instruction Improved Fragment Program Decompiler Implemented Log lvl selection --- rpcs3/Emu/Audio/AL/OpenALThread.cpp | 136 ++++++++++++----------- rpcs3/Emu/Audio/AL/OpenALThread.h | 41 ++----- rpcs3/Emu/Cell/PPUDisAsm.h | 4 + rpcs3/Emu/Cell/PPUInstrTable.h | 1 + rpcs3/Emu/Cell/PPUInterpreter.h | 7 +- rpcs3/Emu/Cell/PPUOpcodes.h | 2 + rpcs3/Emu/GS/GL/GLFragmentProgram.cpp | 4 +- rpcs3/Emu/GS/GL/GLVertexProgram.cpp | 16 ++- rpcs3/Emu/GS/GL/GLVertexProgram.h | 3 + rpcs3/Emu/SysCalls/Modules/cellAdec.cpp | 2 - rpcs3/Emu/SysCalls/Modules/cellAudio.cpp | 44 ++++---- rpcs3/Gui/AboutDialog.h | 4 +- rpcs3/Gui/ConLog.cpp | 22 ++-- rpcs3/Gui/ConLog.h | 2 +- rpcs3/Gui/MainFrame.cpp | 13 +++ rpcs3/Ini.h | 4 + 16 files changed, 167 insertions(+), 138 deletions(-) diff --git a/rpcs3/Emu/Audio/AL/OpenALThread.cpp b/rpcs3/Emu/Audio/AL/OpenALThread.cpp index e4a461171a..c5255988b6 100644 --- a/rpcs3/Emu/Audio/AL/OpenALThread.cpp +++ b/rpcs3/Emu/Audio/AL/OpenALThread.cpp @@ -4,8 +4,8 @@ ALenum g_last_al_error = AL_NO_ERROR; ALCenum g_last_alc_error = ALC_NO_ERROR; -ALCdevice* pDevice; -ALCcontext* pContext; +#define checkForAlError(sit) if((g_last_al_error = alGetError()) != AL_NO_ERROR) printAlError(g_last_al_error, sit) +#define checkForAlcError(sit) if((g_last_alc_error = alcGetError(m_device)) != ALC_NO_ERROR) printAlcError(g_last_alc_error, sit) void printAlError(ALenum err, const char* situation) { @@ -25,120 +25,124 @@ void printAlcError(ALCenum err, const char* situation) } } +OpenALThread::~OpenALThread() +{ + Quit(); +} + void OpenALThread::Init() { - pDevice = alcOpenDevice(NULL); + m_device = alcOpenDevice(nullptr); checkForAlcError("alcOpenDevice"); - pContext = alcCreateContext(pDevice, NULL); + m_context = alcCreateContext(m_device, nullptr); checkForAlcError("alcCreateContext"); - alcMakeContextCurrent(pContext); + alcMakeContextCurrent(m_context); checkForAlcError("alcMakeContextCurrent"); } void OpenALThread::Quit() { - for (SampleBuffer::iterator i = mBuffers.begin(); i != mBuffers.end(); i++) - alDeleteBuffers(1, &i->second.mBufferID); - - alcMakeContextCurrent(NULL); - alcDestroyContext(pContext); - alcCloseDevice(pDevice); + alcMakeContextCurrent(nullptr); + alcDestroyContext(m_context); + alcCloseDevice(m_device); } void OpenALThread::Play() { - alSourcePlay(mSource); - checkForAlError("alSourcePlay"); + ALint state; + alGetSourcei(m_source, AL_SOURCE_STATE, &state); + checkForAlError("alGetSourcei"); + + if(state != AL_PLAYING) + { + alSourcePlay(m_source); + checkForAlError("alSourcePlay"); + } } void OpenALThread::Close() { - alSourceStop(mSource); + alSourceStop(m_source); checkForAlError("alSourceStop"); - if (alIsSource(mSource)) - alDeleteSources(1, &mSource); + if (alIsSource(m_source)) + alDeleteSources(1, &m_source); + + alDeleteBuffers(g_al_buffers_count, m_buffers); + checkForAlError("alDeleteBuffers"); } void OpenALThread::Stop() { - alSourceStop(mSource); + alSourceStop(m_source); checkForAlError("alSourceStop"); } void OpenALThread::Open(const void* src, ALsizei size) { - alGenSources(1, &mSource); + alGenSources(1, &m_source); checkForAlError("alGenSources"); - alSourcei(mSource, AL_LOOPING, AL_FALSE); + alGenBuffers(g_al_buffers_count, m_buffers); + checkForAlError("alGenBuffers"); + + alSourcei(m_source, AL_LOOPING, AL_FALSE); checkForAlError("alSourcei"); - mProcessed = 0; - mBuffer.mFreq = 48000; - mBuffer.mFormat = AL_FORMAT_STEREO16; + m_buffer_size = size; - for (int i = 0; i < NUM_OF_BUFFERS; i++) + for(uint i=0; i 0) - { - alBufferData(bufferID, mBuffers[bufferID].mFormat, mTempBuffer, - TotalRet, mBuffers[bufferID].mFreq); + alBufferData(buffer_id, AL_FORMAT_STEREO16, src, size, 48000); checkForAlError("alBufferData"); - } - return (ret > 0); + return true; } \ No newline at end of file diff --git a/rpcs3/Emu/Audio/AL/OpenALThread.h b/rpcs3/Emu/Audio/AL/OpenALThread.h index 62a16c42f6..cf65d31919 100644 --- a/rpcs3/Emu/Audio/AL/OpenALThread.h +++ b/rpcs3/Emu/Audio/AL/OpenALThread.h @@ -2,49 +2,28 @@ #include "OpenAL/include/al.h" #include "OpenAL/include/alc.h" -#include - -extern ALenum g_last_al_error; -extern ALCenum g_last_alc_error; - -void printAlError(ALenum err, const char* situation); -void printAlcError(ALCenum err, const char* situation); - -#define checkForAlError(sit) if((g_last_al_error = alGetError()) != AL_NO_ERROR) printAlError(g_last_al_error, sit) -#define checkForAlcError(sit) if((g_last_alc_error = alcGetError(pDevice)) != ALC_NO_ERROR) printAlcError(g_last_alc_error, sit) - -struct SampleInfo -{ - uint mBufferID; - uint mFreq; - uint mFormat; -}; - -typedef std::map SampleBuffer; - -#define NUM_OF_BUFFERS 16 - - -extern ALCdevice* pDevice; -extern ALCcontext* pContext; class OpenALThread { private: - ALuint mSource; - SampleBuffer mBuffers; - SampleInfo mBuffer; - ALint mProcessed; - u16 mTempBuffer[512]; + static const uint g_al_buffers_count = 16; + + ALuint m_source; + ALuint m_buffers[g_al_buffers_count]; + ALCdevice* m_device; + ALCcontext* m_context; + u32 m_buffer_size; public: + ~OpenALThread(); + void Init(); void Quit(); void Play(); void Open(const void* src, ALsizei size); void Close(); void Stop(); - bool AddBlock(ALuint bufferID, ALsizei size, const void* src); + bool AddBlock(const ALuint buffer_id, ALsizei size, const void* src); void AddData(const void* src, ALsizei size); }; diff --git a/rpcs3/Emu/Cell/PPUDisAsm.h b/rpcs3/Emu/Cell/PPUDisAsm.h index a5cbf1775b..218c1baf57 100644 --- a/rpcs3/Emu/Cell/PPUDisAsm.h +++ b/rpcs3/Emu/Cell/PPUDisAsm.h @@ -1606,6 +1606,10 @@ private: { DisAsm_V1_R2("lvlx", vd, ra, rb); } + void LDBRX(u32 rd, u32 ra, u32 rb) + { + DisAsm_R3("ldbrx", rd, ra, rb); + } void LWBRX(u32 rd, u32 ra, u32 rb) { DisAsm_R3("lwbrx", rd, ra, rb); diff --git a/rpcs3/Emu/Cell/PPUInstrTable.h b/rpcs3/Emu/Cell/PPUInstrTable.h index e82c02abdb..9095d44bfe 100644 --- a/rpcs3/Emu/Cell/PPUInstrTable.h +++ b/rpcs3/Emu/Cell/PPUInstrTable.h @@ -527,6 +527,7 @@ namespace PPU_instr /*0x1e9*/bind_instr(g1f_list, DIVD, RD, RA, RB, OE, RC); /*0x1eb*/bind_instr(g1f_list, DIVW, RD, RA, RB, OE, RC); /*0x207*/bind_instr(g1f_list, LVLX, VD, RA, RB); + /*0x214*/bind_instr(g1f_list, LDBRX, RD, RA, RB); /*0x216*/bind_instr(g1f_list, LWBRX, RD, RA, RB); /*0x217*/bind_instr(g1f_list, LFSX, FRD, RA, RB); /*0x218*/bind_instr(g1f_list, SRW, RA, RS, RB, RC); diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index 2f9f4ae792..1cd1dc8eb7 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -2981,6 +2981,10 @@ private: Memory.ReadLeft(CPU.VPR[vd]._u8 + eb, addr, 16 - eb); } + void LDBRX(u32 rd, u32 ra, u32 rb) + { + CPU.GPR[rd] = (u64&)Memory[ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]]; + } void LWBRX(u32 rd, u32 ra, u32 rb) { CPU.GPR[rd] = (u32&)Memory[ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]]; @@ -3758,8 +3762,7 @@ private: } void FRSQRTE(u32 frd, u32 frb, bool rc) { - UNIMPLEMENTED(); - //CPU.FPR[frd] = 1.0f / (float)sqrt(CPU.FPR[frb]); + CPU.FPR[frd] = 1.0f / (float)sqrt(CPU.FPR[frb]); } void FMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { diff --git a/rpcs3/Emu/Cell/PPUOpcodes.h b/rpcs3/Emu/Cell/PPUOpcodes.h index 71a8d3b2f1..5b8475d022 100644 --- a/rpcs3/Emu/Cell/PPUOpcodes.h +++ b/rpcs3/Emu/Cell/PPUOpcodes.h @@ -340,6 +340,7 @@ namespace PPU_opcodes DIVD = 0x1e9, DIVW = 0x1eb, LVLX = 0x207, //Load Vector Left Indexed + LDBRX = 0x214, LWBRX = 0x216, LFSX = 0x217, SRW = 0x218, @@ -729,6 +730,7 @@ public: virtual void DIVD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) = 0; virtual void DIVW(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) = 0; virtual void LVLX(u32 vd, u32 ra, u32 rb) = 0; + virtual void LDBRX(u32 rd, u32 ra, u32 rb) = 0; virtual void LWBRX(u32 rd, u32 ra, u32 rb) = 0; virtual void LFSX(u32 frd, u32 ra, u32 rb) = 0; virtual void SRW(u32 ra, u32 rs, u32 rb, bool rc) = 0; diff --git a/rpcs3/Emu/GS/GL/GLFragmentProgram.cpp b/rpcs3/Emu/GS/GL/GLFragmentProgram.cpp index 4a1103a7bd..b79097942e 100644 --- a/rpcs3/Emu/GS/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/GS/GL/GLFragmentProgram.cpp @@ -5,7 +5,7 @@ void GLFragmentDecompilerThread::AddCode(std::string code, bool append_mask) { if(!src0.exec_if_eq && !src0.exec_if_gr && !src0.exec_if_lt) return; - const std::string mask = GetMask().c_str(); + const std::string mask = GetMask(); std::string cond; if(!src0.exec_if_gr || !src0.exec_if_lt || !src0.exec_if_eq) @@ -227,7 +227,7 @@ std::string GLFragmentDecompilerThread::BuildCode() main += "\t" + m_parr.AddParam(PARAM_OUT, "vec4", "ocol", 0) + " = " + (m_ctrl & 0x40 ? "r0" : "h0") + ";\n"; if(m_ctrl & 0xe) main += "\tgl_FragDepth = r1.z;\n"; - std::string p = ""; + std::string p; for(u32 i=0; i intsCount ? "gl_Position = gl_Position * scaleOffsetMat;" : "") + " return; }", false, true); break; // BRA - case 0x09: AddScaCode("{ " + GetFunc() + "; " + wxString(m_funcs.GetCount() == 1 || m_funcs[1].offset > intsCount ? "gl_Position = gl_Position * scaleOffsetMat;" : "") + " return; }", false, true); break; // BRI : works differently (BRI o[1].x(TR) L0;) + case 0x08: AddScaCode("{ /*BRA*/ " + GetFunc() + "; return; }", false, true); break; // BRA + case 0x09: AddScaCode("{ " + GetFunc() + "; return; }", false, true); break; // BRI : works differently (BRI o[1].x(TR) L0;) case 0x0a: AddScaCode("/*CAL*/ " + GetFunc(), false, true); break; // CAL : works same as BRI case 0x0b: AddScaCode("/*CLI*/ " + GetFunc(), false, true); break; // CLI : works same as BRI - case 0x0c: AddScaCode("{ " + wxString(m_funcs.GetCount() == 1 || m_funcs[1].offset > intsCount ? "gl_Position = gl_Position * scaleOffsetMat;" : "") + "return; }", false, true); break; // RET : works like BRI but shorter (RET o[1].x(TR);) + case 0x0c: AddScaCode("return", false, true); break; // RET : works like BRI but shorter (RET o[1].x(TR);) case 0x0d: AddScaCode("log2(" + GetSRC(2, true) + ")"); break; // LG2 case 0x0e: AddScaCode("exp2(" + GetSRC(2, true) + ")"); break; // EX2 case 0x0f: AddScaCode("sin(" + GetSRC(2, true) + ")"); break; // SIN @@ -429,7 +435,7 @@ void GLVertexDecompilerThread::Task() m_shader = BuildCode(); m_body.Clear(); - m_funcs.RemoveAt(1, m_funcs.GetCount() - 1); + m_funcs.RemoveAt(2, m_funcs.GetCount() - 2); } GLVertexProgram::GLVertexProgram() diff --git a/rpcs3/Emu/GS/GL/GLVertexProgram.h b/rpcs3/Emu/GS/GL/GLVertexProgram.h index fde1ab1079..57a3b12b1d 100644 --- a/rpcs3/Emu/GS/GL/GLVertexProgram.h +++ b/rpcs3/Emu/GS/GL/GLVertexProgram.h @@ -151,6 +151,9 @@ struct GLVertexDecompilerThread : public ThreadBase m_funcs.Add(new FuncInfo()); m_funcs[0].offset = 0; m_funcs[0].name = "main"; + m_funcs.Add(new FuncInfo()); + m_funcs[1].offset = 0; + m_funcs[1].name = "func0"; //m_cur_func->body = "\tgl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n"; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 94a754d8e4..e1781bd82e 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -119,8 +119,6 @@ u32 adecOpen(AudioDecoder* data) case adecDecodeAu: { - int err; - adec.reader.addr = task.au.addr; adec.reader.size = task.au.size; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index 145f3e7f10..f0c1e38588 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -17,9 +17,6 @@ int cellAudioInit() { cellAudio.Warning("cellAudioInit()"); - if(Ini.AudioOutMode.GetValue() == 1) - m_audio_out->Init(); - if (m_config.m_is_audio_initialized) { return CELL_AUDIO_ERROR_ALREADY_INIT; @@ -53,14 +50,21 @@ int cellAudioInit() float buffer[2*256]; // buffer for 2 channels be_t buffer2[8*256]; // buffer for 8 channels (max count) - u16 oal_buffer[2*256]; // buffer for OpenAL + //u16 oal_buffer[2*256]; // buffer for OpenAL - memset(&buffer, 0, sizeof(buffer)); - memset(&buffer2, 0, sizeof(buffer2)); - memset(&oal_buffer, 0, sizeof(oal_buffer)); + uint oal_buffer_offset = 0; + uint oal_buffer_size = 2 * 256; + std::unique_ptr oal_buffer(new u16[oal_buffer_size]); + + memset(buffer, 0, sizeof(buffer)); + memset(buffer2, 0, sizeof(buffer2)); + memset(oal_buffer.get(), 0, oal_buffer_size * sizeof(u16)); if(Ini.AudioOutMode.GetValue() == 1) - m_audio_out->Open(oal_buffer, sizeof(oal_buffer)); + { + m_audio_out->Init(); + m_audio_out->Open(oal_buffer.get(), oal_buffer_size*sizeof(u16)); + } while (m_config.m_is_audio_initialized) { @@ -120,8 +124,10 @@ int cellAudioInit() buffer[i] = buffer2[i]; // convert the data from float to u16 - oal_buffer[i] = (u16)((float)buffer[i] * (1 << 15)); + assert(buffer[i] >= -4.0f && buffer[i] <= 4.0f); + oal_buffer[oal_buffer_offset + i] = (u16)(buffer[i] * ((1 << 13) - 1)); } + first_mix = false; } else @@ -131,7 +137,8 @@ int cellAudioInit() buffer[i] = (buffer[i] + buffer2[i]) * 0.5; // TODO: valid mixing // convert the data from float to u16 - oal_buffer[i] = (u16)((float)buffer[i] * (1 << 15)); + assert(buffer[i] >= -4.0f && buffer[i] <= 4.0f); + oal_buffer[oal_buffer_offset + i] = (u16)(buffer[i] * ((1 << 13) - 1)); } } } @@ -140,8 +147,14 @@ int cellAudioInit() // TODO: check event source Emu.GetEventManager().SendEvent(m_config.event_key, 0x10103000e010e07, 0, 0, 0); - if(Ini.AudioOutMode.GetValue() == 1) - m_audio_out->AddData(oal_buffer, sizeof(oal_buffer)); + oal_buffer_offset += sizeof(buffer) / sizeof(float); + + if(oal_buffer_offset >= oal_buffer_size) + { + m_audio_out->AddData(oal_buffer.get(), oal_buffer_offset * sizeof(u16)); + + oal_buffer_offset = 0; + } if(Ini.AudioDumpToFile.GetValue()) { @@ -160,8 +173,6 @@ abort: m_dump.Finalize(); m_config.m_is_audio_finalized = true; - if(Ini.AudioOutMode.GetValue() == 1) - m_audio_out->Quit(); }); t.detach(); @@ -191,8 +202,6 @@ int cellAudioQuit() Memory.Free(m_config.m_buffer); Memory.Free(m_config.m_indexes); - if(Ini.AudioOutMode.GetValue() == 1) - m_audio_out->Quit(); return CELL_OK; } @@ -301,9 +310,6 @@ int cellAudioPortStart(u32 portNum) m_config.m_ports[portNum].m_is_audio_port_started = true; - if(Ini.AudioOutMode.GetValue() == 1) - m_audio_out->Play(); - return CELL_OK; } diff --git a/rpcs3/Gui/AboutDialog.h b/rpcs3/Gui/AboutDialog.h index fe14d13387..794abf6d9d 100644 --- a/rpcs3/Gui/AboutDialog.h +++ b/rpcs3/Gui/AboutDialog.h @@ -45,8 +45,8 @@ AboutDialog::AboutDialog(wxWindow *parent) //Credits wxBoxSizer* s_panel_credits(new wxBoxSizer(wxHORIZONTAL)); - wxStaticText* t_section1 = new wxStaticText(this, wxID_ANY, "\nDevelopers:\n\nDH\nAlexAltea\nHykem\nOil", wxDefaultPosition, wxSize(156,160)); - wxStaticText* t_section2 = new wxStaticText(this, wxID_ANY, "\nThanks:\n\nBlackDaemon", wxDefaultPosition, wxSize(156,160)); + wxStaticText* t_section1 = new wxStaticText(this, wxID_ANY, "\nDevelopers:\n\nDH\nAlexAltea\nHykem\nOil\nNekotekina\nelisha464\nBigpet", wxDefaultPosition, wxSize(156,160)); + wxStaticText* t_section2 = new wxStaticText(this, wxID_ANY, "\nThanks:\n\nBlackDaemon\nAishou\nkrofna\nxsacha", wxDefaultPosition, wxSize(156,160)); s_panel_credits->AddSpacer(12); s_panel_credits->Add(t_section1); diff --git a/rpcs3/Gui/ConLog.cpp b/rpcs3/Gui/ConLog.cpp index 7b5ee9300c..e284983695 100644 --- a/rpcs3/Gui/ConLog.cpp +++ b/rpcs3/Gui/ConLog.cpp @@ -14,6 +14,11 @@ std::mutex g_cs_conlog; static const uint max_item_count = 500; static const uint buffer_size = 1024 * 64; +static const std::string g_log_colors[] = +{ + "Black", "Green", "White", "Yellow", "Red", +}; + struct LogPacket { std::string m_prefix; @@ -112,7 +117,7 @@ LogWriter::LogWriter() } } -void LogWriter::WriteToLog(std::string prefix, std::string value, std::string colour/*, wxColour bgcolour*/) +void LogWriter::WriteToLog(std::string prefix, std::string value, u8 lvl/*, wxColour bgcolour*/) { if(!prefix.empty()) { @@ -125,7 +130,8 @@ void LogWriter::WriteToLog(std::string prefix, std::string value, std::string co if(m_logfile.IsOpened()) m_logfile.Write(wxString(prefix.empty() ? "" : std::string("[" + prefix + "]: ") + value + "\n").wx_str()); - if(!ConLogFrame) return; + if(!ConLogFrame || Ini.HLELogLvl.GetValue() == 4 || (lvl != 0 && lvl <= Ini.HLELogLvl.GetValue())) + return; std::lock_guard lock(g_cs_conlog); @@ -156,7 +162,7 @@ void LogWriter::WriteToLog(std::string prefix, std::string value, std::string co //if(LogBuffer.put == LogBuffer.get) LogBuffer.Flush(); - LogBuffer.Push(LogPacket(prefix, value, colour)); + LogBuffer.Push(LogPacket(prefix, value, g_log_colors[lvl])); } void LogWriter::Write(const wxString fmt, ...) @@ -169,7 +175,7 @@ void LogWriter::Write(const wxString fmt, ...) va_end(list); - WriteToLog("!", (const char *)frmt.ToAscii(), "White"); + WriteToLog("!", (const char *)frmt.ToAscii(), 2); } void LogWriter::Error(const wxString fmt, ...) @@ -182,7 +188,7 @@ void LogWriter::Error(const wxString fmt, ...) va_end(list); - WriteToLog("E", static_cast(frmt), "Red"); + WriteToLog("E", static_cast(frmt), 4); } void LogWriter::Warning(const wxString fmt, ...) @@ -195,7 +201,7 @@ void LogWriter::Warning(const wxString fmt, ...) va_end(list); - WriteToLog("W", static_cast(frmt), "Yellow"); + WriteToLog("W", static_cast(frmt), 3); } void LogWriter::Success(const wxString fmt, ...) @@ -208,12 +214,12 @@ void LogWriter::Success(const wxString fmt, ...) va_end(list); - WriteToLog("S", static_cast(frmt), "Green"); + WriteToLog("S", static_cast(frmt), 1); } void LogWriter::SkipLn() { - WriteToLog("", "", "Black"); + WriteToLog("", "", 0); } BEGIN_EVENT_TABLE(LogFrame, wxPanel) diff --git a/rpcs3/Gui/ConLog.h b/rpcs3/Gui/ConLog.h index 6d2535e04f..fec015d43a 100644 --- a/rpcs3/Gui/ConLog.h +++ b/rpcs3/Gui/ConLog.h @@ -11,7 +11,7 @@ class LogWriter std::string m_prefix; std::string m_value; - virtual void WriteToLog(std::string prefix, std::string value, std::string colour); + virtual void WriteToLog(std::string prefix, std::string value, u8 lvl); public: LogWriter(); diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index f56c305934..653664072e 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -346,6 +346,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxStaticBoxSizer* s_round_audio_out( new wxStaticBoxSizer( wxVERTICAL, &diag, _("Audio Out") ) ); wxStaticBoxSizer* s_round_hle( new wxStaticBoxSizer( wxVERTICAL, &diag, _("HLE / Misc.") ) ); + wxStaticBoxSizer* s_round_hle_log_lvl( new wxStaticBoxSizer( wxVERTICAL, &diag, _("Log lvl") ) ); wxComboBox* cbox_cpu_decoder = new wxComboBox(&diag, wxID_ANY); wxComboBox* cbox_gs_render = new wxComboBox(&diag, wxID_ANY); @@ -355,6 +356,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxComboBox* cbox_keyboard_handler = new wxComboBox(&diag, wxID_ANY); wxComboBox* cbox_mouse_handler = new wxComboBox(&diag, wxID_ANY); wxComboBox* cbox_audio_out = new wxComboBox(&diag, wxID_ANY); + wxComboBox* cbox_hle_loglvl = new wxComboBox(&diag, wxID_ANY); wxCheckBox* chbox_cpu_ignore_rwerrors = new wxCheckBox(&diag, wxID_ANY, "Ignore Read/Write errors"); wxCheckBox* chbox_gs_log_prog = new wxCheckBox(&diag, wxID_ANY, "Log vertex/fragment programs"); @@ -397,6 +399,12 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_audio_out->Append("Null"); cbox_audio_out->Append("OpenAL"); + cbox_hle_loglvl->Append("All"); + cbox_hle_loglvl->Append("Success"); + cbox_hle_loglvl->Append("Warnings"); + cbox_hle_loglvl->Append("Errors"); + cbox_hle_loglvl->Append("Nothing"); + chbox_cpu_ignore_rwerrors->SetValue(Ini.CPUIgnoreRWErrors.GetValue()); chbox_gs_log_prog->SetValue(Ini.GSLogPrograms.GetValue()); chbox_gs_dump_depth->SetValue(Ini.GSDumpDepthBuffer.GetValue()); @@ -408,6 +416,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) chbox_hle_exitonstop->SetValue(Ini.HLEExitOnStop.GetValue()); chbox_audio_dump->Enable(Emu.IsStopped()); + cbox_audio_out->Enable(Emu.IsStopped()); chbox_hle_logging->Enable(Emu.IsStopped()); cbox_cpu_decoder->SetSelection(Ini.CPUDecoderMode.GetValue() ? Ini.CPUDecoderMode.GetValue() - 1 : 0); @@ -418,6 +427,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_keyboard_handler->SetSelection(Ini.KeyboardHandlerMode.GetValue()); cbox_mouse_handler->SetSelection(Ini.MouseHandlerMode.GetValue()); cbox_audio_out->SetSelection(Ini.AudioOutMode.GetValue()); + cbox_hle_loglvl->SetSelection(Ini.HLELogLvl.GetValue()); s_round_cpu_decoder->Add(cbox_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_cpu->Add(s_round_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -445,6 +455,8 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_round_audio_out->Add(chbox_audio_dump, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_audio->Add(s_round_audio_out, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_hle_log_lvl->Add(cbox_hle_loglvl, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_hle->Add(s_round_hle_log_lvl, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_hle->Add(chbox_hle_logging, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_hle->Add(chbox_hle_savetty, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_hle->Add(chbox_hle_exitonstop, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -487,6 +499,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) Ini.HLELogging.SetValue(chbox_hle_logging->GetValue()); Ini.HLESaveTTY.SetValue(chbox_hle_savetty->GetValue()); Ini.HLEExitOnStop.SetValue(chbox_hle_exitonstop->GetValue()); + Ini.HLELogLvl.SetValue(cbox_hle_loglvl->GetSelection()); Ini.Save(); } diff --git a/rpcs3/Ini.h b/rpcs3/Ini.h index 65d41cee73..778228b97b 100644 --- a/rpcs3/Ini.h +++ b/rpcs3/Ini.h @@ -109,6 +109,7 @@ public: IniEntry HLELogging; IniEntry HLESaveTTY; IniEntry HLEExitOnStop; + IniEntry HLELogLvl; IniEntry PadHandlerLeft; IniEntry PadHandlerDown; @@ -176,6 +177,7 @@ public: HLELogging.Init("HLELogging", path); HLESaveTTY.Init("HLESaveTTY", path); HLEExitOnStop.Init("HLEExitOnStop", path); + HLELogLvl.Init("HLELogLvl", path); } void Load() @@ -197,6 +199,7 @@ public: HLELogging.Load(false); HLESaveTTY.Load(false); HLEExitOnStop.Load(false); + HLELogLvl.Load(0); PadHandlerLeft.Load(static_cast('A')); PadHandlerDown.Load(static_cast('S')); @@ -235,6 +238,7 @@ public: HLELogging.Save(); HLESaveTTY.Save(); HLEExitOnStop.Save(); + HLELogLvl.Save(); PadHandlerLeft.Save(); PadHandlerDown.Save(); From 8cc6a287a7a599df34581fbd937e45ef2ccc8685 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 13 Mar 2014 13:17:45 +0400 Subject: [PATCH 14/27] Update --- rpcs3/Emu/CPU/CPUThread.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/cellAdec.cpp | 117 +++++++++++++++++++----- rpcs3/Emu/SysCalls/Modules/cellAdec.h | 3 + rpcs3/Emu/SysCalls/Modules/cellDmux.cpp | 81 +++++++++------- rpcs3/Emu/SysCalls/Modules/cellDmux.h | 83 +++++++---------- rpcs3/Emu/SysCalls/Modules/cellVdec.cpp | 30 +++--- rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp | 1 + 7 files changed, 198 insertions(+), 119 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index ec21cc80a1..9df0cc6a9e 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -393,7 +393,7 @@ s64 CPUThread::ExecAsCallback(u64 pc, bool wait, u64 a1, u64 a2, u64 a3, u64 a4) { if (Emu.IsStopped()) { - ConLog.Warning("ExecAsCallback(wait=%s) aborted", wxString(wait ? "true" : false).wx_str()); + ConLog.Warning("ExecAsCallback(wait=%s) aborted", wxString(wait ? "true" : "false").wx_str()); return CELL_EABORT; // doesn't mean anything } Sleep(1); diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 94a754d8e4..4147d21aaa 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -20,14 +20,66 @@ int adecRead(void* opaque, u8* buf, int buf_size) { AudioDecoder& adec = *(AudioDecoder*)opaque; - if (adec.reader.size < (u32)buf_size) + int res = 0; + +next: + if (adec.reader.size < (u32)buf_size /*&& !vdec.just_started*/) + { + while (adec.job.IsEmpty()) + { + if (Emu.IsStopped()) + { + ConLog.Warning("vdecRead() aborted"); + return 0; + } + Sleep(1); + } + + switch (adec.job.Peek().type) + { + case adecEndSeq: + { + buf_size = adec.reader.size; + } + break; + case adecDecodeAu: + { + if (!Memory.CopyToReal(buf, adec.reader.addr, adec.reader.size)) + { + ConLog.Error("adecRead: data reading failed (reader.size=0x%x)", adec.reader.size); + Emu.Pause(); + return 0; + } + + buf += adec.reader.size; + buf_size -= adec.reader.size; + res += adec.reader.size; + + adec.adecCb->ExecAsCallback(adec.cbFunc, false, adec.id, CELL_ADEC_MSG_TYPE_AUDONE, adec.task.au.auInfo_addr, adec.cbArg); + + adec.job.Pop(adec.task); + + adec.reader.addr = adec.task.au.addr; + adec.reader.size = adec.task.au.size; + + adec.last_pts = adec.task.au.pts; + } + break; + default: + ConLog.Error("adecRead(): sequence error (task %d)", adec.job.Peek().type); + return 0; + } + + goto next; + } + else if (adec.reader.size < (u32)buf_size) { buf_size = adec.reader.size; } if (!buf_size) { - return 0; + return res; } else if (!Memory.CopyToReal(buf, adec.reader.addr, buf_size)) { @@ -39,7 +91,7 @@ int adecRead(void* opaque, u8* buf, int buf_size) { adec.reader.addr += buf_size; adec.reader.size -= buf_size; - return 0 + buf_size; + return res + buf_size; } } @@ -59,7 +111,7 @@ u32 adecOpen(AudioDecoder* data) { ConLog.Write("Audio Decoder enter()"); - AdecTask task; + AdecTask& task = adec.task; while (true) { @@ -119,12 +171,12 @@ u32 adecOpen(AudioDecoder* data) case adecDecodeAu: { - int err; + int err = 0; adec.reader.addr = task.au.addr; adec.reader.size = task.au.size; - u64 last_pts = task.au.pts; + adec.last_pts = task.au.pts; struct AVPacketHolder : AVPacket { @@ -160,7 +212,7 @@ u32 adecOpen(AudioDecoder* data) if (Memory.CopyToReal(buf, task.au.addr, task.au.size)) dump.Write(buf, task.au.size); free(buf); dump.Close(); - } + }*/ if (adec.just_started) // deferred initialization { @@ -171,6 +223,13 @@ u32 adecOpen(AudioDecoder* data) Emu.Pause(); break; } + AVCodec* codec = avcodec_find_decoder(AV_CODEC_ID_ATRAC3P); // ??? + if (!codec) + { + ConLog.Error("adecDecodeAu: avcodec_find_decoder() failed"); + Emu.Pause(); + break; + } err = avformat_find_stream_info(adec.fmt, NULL); if (err) { @@ -185,16 +244,8 @@ u32 adecOpen(AudioDecoder* data) break; } adec.ctx = adec.fmt->streams[0]->codec; // TODO: check data - - AVCodec* codec = avcodec_find_decoder(adec.ctx->codec_id); // ??? - if (!codec) - { - ConLog.Error("adecDecodeAu: avcodec_find_decoder() failed"); - Emu.Pause(); - break; - } - AVDictionary* opts; + AVDictionary* opts = nullptr; av_dict_set(&opts, "refcounted_frames", "1", 0); { SMutexGeneralLocker lock(g_mutex_avcodec_open2); @@ -210,9 +261,17 @@ u32 adecOpen(AudioDecoder* data) adec.just_started = false; } - while (av_read_frame(adec.fmt, &au) >= 0)*/ while (true) + bool last_frame = false; + + while (true) { - if (!adec.ctx) // fake + if (Emu.IsStopped()) + { + ConLog.Warning("adecDecodeAu aborted"); + return; + } + + /*if (!adec.ctx) // fake { AdecFrame frame; frame.pts = task.au.pts; @@ -223,13 +282,18 @@ u32 adecOpen(AudioDecoder* data) frame.data = nullptr; adec.frames.Push(frame); - /*Callback cb; - cb.SetAddr(adec.cbFunc); - cb.Handle(adec.id, CELL_ADEC_MSG_TYPE_PCMOUT, CELL_OK, adec.cbArg); - cb.Branch(false);*/ adec.adecCb->ExecAsCallback(adec.cbFunc, false, adec.id, CELL_ADEC_MSG_TYPE_PCMOUT, CELL_OK, adec.cbArg); break; + }*/ + + last_frame = av_read_frame(adec.fmt, &au) < 0; + if (last_frame) + { + //break; + av_free(au.data); + au.data = NULL; + au.size = 0; } struct VdecFrameHolder : AdecFrame @@ -261,10 +325,13 @@ u32 adecOpen(AudioDecoder* data) int decode = avcodec_decode_audio4(adec.ctx, frame.data, &got_frame, &au); - if (decode < 0) + if (decode <= 0) { - ConLog.Error("adecDecodeAu: AU decoding error(0x%x)", decode); - break; + if (!last_frame && decode < 0) + { + ConLog.Error("adecDecodeAu: AU decoding error(0x%x)", decode); + } + if (!got_frame && adec.reader.size == 0) break; } if (got_frame) diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.h b/rpcs3/Emu/SysCalls/Modules/cellAdec.h index bab8ccd6c9..793a78905a 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.h @@ -1064,6 +1064,9 @@ public: const u32 cbArg; u32 memBias; + AdecTask task; + u64 last_pts; + CPUThread* adecCb; AudioDecoder(AudioCodecType type, u32 addr, u32 size, u32 func, u32 arg) diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index 36b8ffef44..bc09f6777b 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -18,7 +18,7 @@ void dmuxQueryEsAttr(u32 info_addr /* may be 0 */, const mem_ptr_t attr) { if (esFilterId->filterIdMajor >= 0xe0) - attr->memSize = 0x1000000; // 0x45fa49 from ps3 + attr->memSize = 0x3000000; // 0x45fa49 from ps3 else attr->memSize = 0x200000; // 0x73d9 from ps3 @@ -156,6 +156,16 @@ u32 dmuxOpen(Demuxer* data) //ConLog.Write("*** AT3+ AU sent (pts=0x%llx, dts=0x%llx)", pes.pts, pes.dts); + stream.skip(4); + len -= 4; + u32 abc; + stream.peek(abc); + if (abc == 0x5548D00F) + { + stream.skip(8); + len -= 8; + } + es.push(stream, len - pes.size - 3, pes); es.finish(stream); @@ -231,7 +241,7 @@ u32 dmuxOpen(Demuxer* data) continue; } - //hack: reconstruction of MPEG2-PS stream for vdec module (seems it works without it too) + //reconstruction of MPEG2-PS stream for vdec module stream = backup; es.push(stream, len + 6 /*- pes.size - 3*/, pes); } @@ -288,18 +298,32 @@ u32 dmuxOpen(Demuxer* data) { case dmuxSetStream: { + if (stream.discontinuity) + { + for (u32 i = 0; i < 192; i++) + { + if (esALL[i]) + { + esALL[i]->reset(); + } + } + updates_count = 0; + updates_signaled = 0; + } + + if (updates_count != updates_signaled) + { + ConLog.Error("dmuxSetStream: stream update inconsistency (input=%d, signaled=%d)", updates_count, updates_signaled); + return; + } + + updates_count++; stream = task.stream; ConLog.Write("*** stream updated(addr=0x%x, size=0x%x, discont=%d, userdata=0x%llx)", stream.addr, stream.size, stream.discontinuity, stream.userdata); - if (stream.discontinuity) for (u32 i = 0; i < 192; i++) - { - if (esALL[i]) - { - esALL[i]->reset(); - } - } - updates_count++; + dmux.is_running = true; + dmux.fbSetStream.Push(task.stream.addr); // feedback } break; @@ -592,12 +616,12 @@ int cellDmuxSetStream(u32 demuxerHandle, const u32 streamAddress, u32 streamSize return CELL_DMUX_ERROR_FATAL; } - while (dmux->is_running) // !!! + if (dmux->is_running) { if (Emu.IsStopped()) { ConLog.Warning("cellDmuxSetStream(%d) aborted (waiting)", demuxerHandle); - break; + return CELL_OK; } Sleep(1); return CELL_DMUX_ERROR_BUSY; @@ -612,14 +636,16 @@ int cellDmuxSetStream(u32 demuxerHandle, const u32 streamAddress, u32 streamSize dmux->job.Push(task); - while (!dmux->is_running) + u32 addr; + if (!dmux->fbSetStream.Pop(addr)) { - if (Emu.IsStopped()) - { - ConLog.Warning("cellDmuxSetStream(%d) aborted", demuxerHandle); - break; - } - Sleep(1); + ConLog.Warning("cellDmuxSetStream(%d) aborted (fbSetStream.Pop())", demuxerHandle); + return CELL_OK; + } + if (addr != info.addr) + { + ConLog.Error("cellDmuxSetStream(%d): wrong stream queued (right=0x%x, queued=0x%x)", demuxerHandle, info.addr, addr); + Emu.Pause(); } return CELL_OK; } @@ -921,7 +947,7 @@ int cellDmuxPeekAuEx(u32 esHandle, mem32_t auInfoEx_ptr, mem32_t auSpecificInfo_ int cellDmuxReleaseAu(u32 esHandle) { - cellDmux.Log("cellDmuxReleaseAu(esHandle=0x%x)", esHandle); + cellDmux.Log("(disabled) cellDmuxReleaseAu(esHandle=0x%x)", esHandle); return CELL_OK; @@ -931,21 +957,8 @@ int cellDmuxReleaseAu(u32 esHandle) return CELL_DMUX_ERROR_ARG; } - if (!es->canrelease()) - { - cellDmux.Error("cellDmuxReleaseAu: no AU"); - return CELL_DMUX_ERROR_SEQ; - } - - /*DemuxerTask task(dmuxReleaseAu); - task.es.es = esHandle; - task.es.es_ptr = es; - - es->dmux->job.Push(task);*/ - if (!es->release()) { - cellDmux.Error("cellDmuxReleaseAu failed"); return CELL_DMUX_ERROR_SEQ; } return CELL_OK; @@ -953,7 +966,7 @@ int cellDmuxReleaseAu(u32 esHandle) int cellDmuxFlushEs(u32 esHandle) { - cellDmux.Log("cellDmuxFlushEs(esHandle=0x%x)", esHandle); + cellDmux.Warning("cellDmuxFlushEs(esHandle=0x%x)", esHandle); ElementaryStream* es; if (!Emu.GetIdManager().GetIDData(esHandle, es)) diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.h b/rpcs3/Emu/SysCalls/Modules/cellDmux.h index cc504fe2f0..ce55c27eb5 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.h +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.h @@ -304,11 +304,6 @@ enum PRIVATE_STREAM_2 = 0x000001bf, }; -enum -{ - MAX_AU = 640 * 1024 + 128, // 640 KB -}; - struct DemuxerStream { u32 addr; @@ -385,7 +380,7 @@ struct PesHeader stream.get(v); if (v != 0xFF) break; // skip padding bytes empty++; - if (empty = size) return; + if (empty == size) return; }; if ((v & 0xF0) == 0x20 && (size - empty) >= 5) // pts only @@ -460,7 +455,8 @@ struct DemuxerTask class Demuxer { public: - SQueue job; + SQueue job; + SQueue fbSetStream; const u32 memAddr; const u32 memSize; const u32 cbFunc; @@ -491,6 +487,26 @@ class ElementaryStream u32 last_addr; // AU that is being written now u32 last_size; // number of bytes written (after 128b header) u32 peek_addr; // AU that will be obtained by GetAu(Ex)/PeekAu(Ex) + + bool is_full() + { + if (first_addr) + { + if (first_addr >= last_addr) + { + return (first_addr - last_addr) <= GetMaxAU(); + } + else + { + // probably, always false + return (last_addr + GetMaxAU()) > (memAddr + memSize); + } + } + else + { + return false; + } + } public: Demuxer* dmux; @@ -523,6 +539,11 @@ public: { } + const u32 GetMaxAU() const + { + return 640 * 1024 + 128; + } + volatile bool hasunseen() { return peek_addr; @@ -536,21 +557,7 @@ public: bool isfull() { SMutexLocker lock(mutex); - if (first_addr) - { - if (first_addr > last_addr) - { - return (first_addr - last_addr) < MAX_AU; - } - else - { - return (first_addr + MAX_AU) > (memAddr + memSize); - } - } - else - { - return false; - } + return is_full(); } void finish(DemuxerStream& stream) // not multithread-safe @@ -565,8 +572,9 @@ public: { peek_addr = last_addr; } + u32 new_addr = a128(last_addr + 128 + last_size); - if ((new_addr + MAX_AU) > (memAddr + memSize)) + if ((new_addr + GetMaxAU()) > (memAddr + memSize)) { last_addr = memAddr; } @@ -581,24 +589,8 @@ public: { SMutexLocker lock(mutex); //ConLog.Write("es::push(): peek=0x%x, first=0x%x, last=0x%x, size=0x%x", peek_addr, first_addr, last_addr, last_size); - bool is_full; - if (first_addr) - { - if (first_addr > last_addr) - { - is_full = (first_addr - last_addr) < MAX_AU; - } - else - { - is_full = (first_addr + MAX_AU) > (memAddr + memSize); - } - } - else - { - is_full = false; - } - if (is_full) + if (is_full()) { ConLog.Error("ElementaryStream::push(): buffer is full"); Emu.Pause(); @@ -646,16 +638,11 @@ public: } } - volatile bool canrelease() - { - return first_addr; - } - bool release() { SMutexLocker lock(mutex); //ConLog.Write("es::release(): peek=0x%x, first=0x%x, last=0x%x, size=0x%x", peek_addr, first_addr, last_addr, last_size); - if (!canrelease()) + if (!first_addr) { ConLog.Error("ElementaryStream::release(): buffer is empty"); return false; @@ -675,7 +662,7 @@ public: { first_addr = 0; } - else if ((new_addr + MAX_AU) > (memAddr + memSize)) + else if ((new_addr + GetMaxAU()) > (memAddr + memSize)) { first_addr = memAddr; } @@ -706,7 +693,7 @@ public: { peek_addr = 0; } - else if ((new_addr + MAX_AU) > (memAddr + memSize)) + else if ((new_addr + GetMaxAU()) > (memAddr + memSize)) { peek_addr = memAddr; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp index 31fab366d6..5ea762662f 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp @@ -23,7 +23,8 @@ int vdecRead(void* opaque, u8* buf, int buf_size) int res = 0; - if (vdec.reader.size < (u32)buf_size && !vdec.just_started) +next: + if (vdec.reader.size < (u32)buf_size /*&& !vdec.just_started*/) { while (vdec.job.IsEmpty()) { @@ -74,6 +75,8 @@ int vdecRead(void* opaque, u8* buf, int buf_size) ConLog.Error("vdecRead(): sequence error (task %d)", vdec.job.Peek().type); return 0; } + + goto next; } else if (vdec.reader.size < (u32)buf_size) { @@ -235,14 +238,21 @@ u32 vdecOpen(VideoDecoder* data) if (vdec.just_started) // deferred initialization { - err = avformat_open_input(&vdec.fmt, NULL, NULL, NULL); + err = avformat_open_input(&vdec.fmt, NULL, av_find_input_format("mpeg"), NULL); if (err) { ConLog.Error("vdecDecodeAu: avformat_open_input() failed"); Emu.Pause(); break; } - err = avformat_find_stream_info(vdec.fmt, NULL); + AVCodec* codec = avcodec_find_decoder(AV_CODEC_ID_H264); // ??? + if (!codec) + { + ConLog.Error("vdecDecodeAu: avcodec_find_decoder() failed"); + Emu.Pause(); + break; + } + /*err = avformat_find_stream_info(vdec.fmt, NULL); if (err) { ConLog.Error("vdecDecodeAu: avformat_find_stream_info() failed"); @@ -254,17 +264,15 @@ u32 vdecOpen(VideoDecoder* data) ConLog.Error("vdecDecodeAu: no stream found"); Emu.Pause(); break; - } - vdec.ctx = vdec.fmt->streams[0]->codec; // TODO: check data - - AVCodec* codec = avcodec_find_decoder(vdec.ctx->codec_id); // ??? - if (!codec) + }*/ + if (!avformat_new_stream(vdec.fmt, codec)) { - ConLog.Error("vdecDecodeAu: avcodec_find_decoder() failed"); + ConLog.Error("vdecDecodeAu: avformat_new_stream() failed"); Emu.Pause(); break; } - + vdec.ctx = vdec.fmt->streams[0]->codec; // TODO: check data + AVDictionary* opts = nullptr; av_dict_set(&opts, "refcounted_frames", "1", 0); { @@ -292,6 +300,7 @@ u32 vdecOpen(VideoDecoder* data) ConLog.Warning("vdecDecodeAu aborted"); return; } + last_frame = av_read_frame(vdec.fmt, &au) < 0; if (last_frame) { @@ -335,7 +344,6 @@ u32 vdecOpen(VideoDecoder* data) if (!last_frame && decode < 0) { ConLog.Error("vdecDecodeAu: AU decoding error(0x%x)", decode); - break; } if (!got_picture && vdec.reader.size == 0) break; // video end? } diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp index 10cd0af5ff..ab987cb8cd 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp @@ -198,6 +198,7 @@ bool SleepQueue::finalize() } } + m_mutex.unlock(); return true; } From 2c447f686dc575d3264b8b7a26eb2e829a9fc2bb Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 13 Mar 2014 20:11:16 +0400 Subject: [PATCH 15/27] sys_spinlock implemented --- rpcs3/Emu/SysCalls/Modules/cellAdec.cpp | 20 ++++---- rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp | 44 ++++++++--------- rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp | 5 ++ rpcs3/Emu/SysCalls/SysCalls.h | 7 +++ rpcs3/Emu/SysCalls/lv2/SC_Spinlock.cpp | 51 ++++++++++++++++++++ rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h | 6 +++ rpcs3/rpcs3.vcxproj | 1 + rpcs3/rpcs3.vcxproj.filters | 3 ++ 8 files changed, 105 insertions(+), 32 deletions(-) create mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Spinlock.cpp create mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 4147d21aaa..a2805567c4 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -23,13 +23,13 @@ int adecRead(void* opaque, u8* buf, int buf_size) int res = 0; next: - if (adec.reader.size < (u32)buf_size /*&& !vdec.just_started*/) + if (adec.reader.size < (u32)buf_size /*&& !adec.just_started*/) { while (adec.job.IsEmpty()) { if (Emu.IsStopped()) { - ConLog.Warning("vdecRead() aborted"); + ConLog.Warning("adecRead() aborted"); return 0; } Sleep(1); @@ -212,7 +212,7 @@ u32 adecOpen(AudioDecoder* data) if (Memory.CopyToReal(buf, task.au.addr, task.au.size)) dump.Write(buf, task.au.size); free(buf); dump.Close(); - }*/ + } if (adec.just_started) // deferred initialization { @@ -259,7 +259,7 @@ u32 adecOpen(AudioDecoder* data) break; } adec.just_started = false; - } + }*/ bool last_frame = false; @@ -271,7 +271,7 @@ u32 adecOpen(AudioDecoder* data) return; } - /*if (!adec.ctx) // fake + if (!adec.ctx) // fake { AdecFrame frame; frame.pts = task.au.pts; @@ -285,7 +285,7 @@ u32 adecOpen(AudioDecoder* data) adec.adecCb->ExecAsCallback(adec.cbFunc, false, adec.id, CELL_ADEC_MSG_TYPE_PCMOUT, CELL_OK, adec.cbArg); break; - }*/ + } last_frame = av_read_frame(adec.fmt, &au) < 0; if (last_frame) @@ -296,14 +296,14 @@ u32 adecOpen(AudioDecoder* data) au.size = 0; } - struct VdecFrameHolder : AdecFrame + struct AdecFrameHolder : AdecFrame { - VdecFrameHolder() + AdecFrameHolder() { data = av_frame_alloc(); } - ~VdecFrameHolder() + ~AdecFrameHolder() { if (data) { @@ -336,7 +336,7 @@ u32 adecOpen(AudioDecoder* data) if (got_frame) { - ConLog.Write("got_frame (%d, vdec: pts=0x%llx, dts=0x%llx)", got_frame, au.pts, au.dts); + ConLog.Write("got_frame (%d, pts=0x%llx, dts=0x%llx)", got_frame, au.pts, au.dts); frame.pts = task.au.pts; // ??? frame.auAddr = task.au.addr; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp index aca92144af..c211fa07d3 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp @@ -9,7 +9,7 @@ Module cellSpurs(0x000a, cellSpurs_init); int _cellSpursAttributeInitialize(mem_ptr_t attr, int nSpus, int spuPriority, int ppuPriority, bool exitIfNoWork) { - cellSpurs.Warning("cellSpursAttributeInitialize(attr_addr=0x%x, nSpus=%u, spuPriority=%u, ppuPriority=%u, exitIfNoWork=%u)", + cellSpurs.Error("_cellSpursAttributeInitialize(attr_addr=0x%x, nSpus=%u, spuPriority=%u, ppuPriority=%u, exitIfNoWork=%u)", attr.GetAddr(), nSpus, spuPriority, ppuPriority, exitIfNoWork); if(!attr.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -18,7 +18,7 @@ int _cellSpursAttributeInitialize(mem_ptr_t attr, int nSpus, int cellSpursAttributeSetMemoryContainerForSpuThread(mem_ptr_t attr, u32 container) { - cellSpurs.Warning("cellSpursAttributeSetMemoryContainerForSpuThread(attr_addr=0x%x, container=0x%x)", + cellSpurs.Error("cellSpursAttributeSetMemoryContainerForSpuThread(attr_addr=0x%x, container=0x%x)", attr.GetAddr(), container); if(!attr.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -27,7 +27,7 @@ int cellSpursAttributeSetMemoryContainerForSpuThread(mem_ptr_t attr, const mem8_t prefix, u32 size) { - cellSpurs.Warning("cellSpursAttributeSetNamePrefix(attr_addr=0x%x, prefix_addr=0x%x, size=0x%x)", + cellSpurs.Error("cellSpursAttributeSetNamePrefix(attr_addr=0x%x, prefix_addr=0x%x, size=0x%x)", attr.GetAddr(), prefix.GetAddr(), size); if(!attr.IsGood() || !prefix.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; if(size > 15) return CELL_SPURS_CORE_ERROR_INVAL; @@ -37,7 +37,7 @@ int cellSpursAttributeSetNamePrefix(mem_ptr_t attr, const me int cellSpursAttributeEnableSpuPrintfIfAvailable(mem_ptr_t attr) { - cellSpurs.Warning("cellSpursAttributeEnableSpuPrintfIfAvailable(attr_addr=0x%x)", attr.GetAddr()); + cellSpurs.Error("cellSpursAttributeEnableSpuPrintfIfAvailable(attr_addr=0x%x)", attr.GetAddr()); if(!attr.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; return CELL_OK; @@ -45,7 +45,7 @@ int cellSpursAttributeEnableSpuPrintfIfAvailable(mem_ptr_t a int cellSpursAttributeSetSpuThreadGroupType(mem_ptr_t attr, int type) { - cellSpurs.Warning("cellSpursAttributeSetSpuThreadGroupType(attr_addr=0x%x, type=%u)", attr.GetAddr(), type); + cellSpurs.Error("cellSpursAttributeSetSpuThreadGroupType(attr_addr=0x%x, type=%u)", attr.GetAddr(), type); if(!attr.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; return CELL_OK; @@ -54,7 +54,7 @@ int cellSpursAttributeSetSpuThreadGroupType(mem_ptr_t attr, int cellSpursAttributeEnableSystemWorkload(mem_ptr_t attr, const u8 priority[8], uint maxSpu, const bool isPreemptible[8]) { - cellSpurs.Warning("cellSpursAttributeEnableSystemWorkload(attr_addr=0x%x, priority[%u], maxSpu=%u, isPreemptible[%u])", + cellSpurs.Error("cellSpursAttributeEnableSystemWorkload(attr_addr=0x%x, priority[%u], maxSpu=%u, isPreemptible[%u])", attr.GetAddr(), priority, maxSpu, isPreemptible); if(!attr.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; for (int i=0; i<8; i++) @@ -65,7 +65,7 @@ int cellSpursAttributeEnableSystemWorkload(mem_ptr_t attr, c int cellSpursInitializeWithAttribute2(mem_ptr_t spurs, const mem_ptr_t attr) { - cellSpurs.Warning("cellSpursInitializeWithAttribute2(spurs_addr=0x%x, spurs_addr=0x%x)", + cellSpurs.Error("cellSpursInitializeWithAttribute2(spurs_addr=0x%x, spurs_addr=0x%x)", spurs.GetAddr(), attr.GetAddr()); if(!attr.IsGood() || !spurs.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -74,7 +74,7 @@ int cellSpursInitializeWithAttribute2(mem_ptr_t spurs, const mem_ptr int cellSpursFinalize(mem_ptr_t spurs) { - cellSpurs.Warning("cellSpursFinalize(spurs_addr=0x%x)", spurs.GetAddr()); + cellSpurs.Error("cellSpursFinalize(spurs_addr=0x%x)", spurs.GetAddr()); if(!spurs.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; return CELL_OK; @@ -82,7 +82,7 @@ int cellSpursFinalize(mem_ptr_t spurs) int cellSpursGetSpuThreadGroupId(mem_ptr_t spurs, mem32_t group) { - cellSpurs.Warning("cellSpursGetSpuThreadGroupId(spurs_addr=0x%x, group_addr=0x%x)", + cellSpurs.Error("cellSpursGetSpuThreadGroupId(spurs_addr=0x%x, group_addr=0x%x)", spurs.GetAddr(), group.GetAddr()); if(!spurs.IsGood() || group.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -91,7 +91,7 @@ int cellSpursGetSpuThreadGroupId(mem_ptr_t spurs, mem32_t group) int cellSpursGetNumSpuThread(mem_ptr_t spurs, mem32_t nThreads) { - cellSpurs.Warning("cellSpursGetNumSpuThread(spurs_addr=0x%x, nThreads_addr=0x%x)", + cellSpurs.Error("cellSpursGetNumSpuThread(spurs_addr=0x%x, nThreads_addr=0x%x)", spurs.GetAddr(), nThreads.GetAddr()); if(!spurs.IsGood() || nThreads.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -100,7 +100,7 @@ int cellSpursGetNumSpuThread(mem_ptr_t spurs, mem32_t nThreads) int cellSpursGetSpuThreadId(mem_ptr_t spurs, mem32_t thread, mem32_t nThreads) { - cellSpurs.Warning("cellSpursGetSpuThreadId(spurs_addr=0x%x, thread_addr=0x%x, nThreads_addr=0x%x)", + cellSpurs.Error("cellSpursGetSpuThreadId(spurs_addr=0x%x, thread_addr=0x%x, nThreads_addr=0x%x)", spurs.GetAddr(), thread.GetAddr(), nThreads.GetAddr()); if(!spurs.IsGood() || !thread.IsGood() || nThreads.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -109,7 +109,7 @@ int cellSpursGetSpuThreadId(mem_ptr_t spurs, mem32_t thread, mem32_t int cellSpursSetMaxContention(mem_ptr_t spurs, uint workloadId, uint maxContention) { - cellSpurs.Warning("cellSpursSetMaxContention(spurs_addr=0x%x, workloadId=%u, maxContention=%u)", + cellSpurs.Error("cellSpursSetMaxContention(spurs_addr=0x%x, workloadId=%u, maxContention=%u)", spurs.GetAddr(), workloadId, maxContention); if(!spurs.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -118,7 +118,7 @@ int cellSpursSetMaxContention(mem_ptr_t spurs, uint workloadId, uint int cellSpursSetPriorities(mem_ptr_t spurs, uint workloadId, const u8 priorities[CELL_SPURS_MAX_SPU]) { - cellSpurs.Warning("cellSpursSetPriorities(spurs_addr=0x%x, workloadId=%u, priorities[%u])", + cellSpurs.Error("cellSpursSetPriorities(spurs_addr=0x%x, workloadId=%u, priorities[%u])", spurs.GetAddr(), workloadId, priorities); if(!spurs.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -127,7 +127,7 @@ int cellSpursSetPriorities(mem_ptr_t spurs, uint workloadId, const u8 int cellSpursSetPriority(mem_ptr_t spurs, uint workloadId, uint spuId, uint priority) { - cellSpurs.Warning("cellSpursSetPriority(spurs_addr=0x%x, workloadId=%u, spuId=%u, priority=%u)", + cellSpurs.Error("cellSpursSetPriority(spurs_addr=0x%x, workloadId=%u, spuId=%u, priority=%u)", spurs.GetAddr(), workloadId, spuId, priority); if(!spurs.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -136,7 +136,7 @@ int cellSpursSetPriority(mem_ptr_t spurs, uint workloadId, uint spuId int cellSpursSetPreemptionVictimHints(mem_ptr_t spurs, const bool isPreemptible[8]) { - cellSpurs.Warning("cellSpursSetPreemptionVictimHints(spurs_addr=0x%x, isPreemptible[%u])", + cellSpurs.Error("cellSpursSetPreemptionVictimHints(spurs_addr=0x%x, isPreemptible[%u])", spurs.GetAddr(), isPreemptible); if(!spurs.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -145,7 +145,7 @@ int cellSpursSetPreemptionVictimHints(mem_ptr_t spurs, const bool isP int cellSpursAttachLv2EventQueue(mem_ptr_t spurs, u32 queue, mem8_t port, int isDynamic) { - cellSpurs.Warning("cellSpursAttachLv2EventQueue(spurs_addr=0x%x, queue=0x%x, port_addr=0x%x, isDynamic=%u)", + cellSpurs.Error("cellSpursAttachLv2EventQueue(spurs_addr=0x%x, queue=0x%x, port_addr=0x%x, isDynamic=%u)", spurs.GetAddr(), queue, port.GetAddr(), isDynamic); if(!spurs.IsGood() || !port.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -154,7 +154,7 @@ int cellSpursAttachLv2EventQueue(mem_ptr_t spurs, u32 queue, mem8_t p int cellSpursDetachLv2EventQueue(mem_ptr_t spurs, u8 port) { - cellSpurs.Warning("cellSpursDetachLv2EventQueue(spurs_addr=0x%x, port=0x%x)", spurs.GetAddr(), port); + cellSpurs.Error("cellSpursDetachLv2EventQueue(spurs_addr=0x%x, port=0x%x)", spurs.GetAddr(), port); if(!spurs.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; return CELL_OK; @@ -162,7 +162,7 @@ int cellSpursDetachLv2EventQueue(mem_ptr_t spurs, u8 port) int cellSpursEnableExceptionEventHandler(mem_ptr_t spurs, bool flag) { - cellSpurs.Warning("cellSpursEnableExceptionEventHandler(spurs_addr=0x%x, flag=%u)", spurs.GetAddr(), flag); + cellSpurs.Error("cellSpursEnableExceptionEventHandler(spurs_addr=0x%x, flag=%u)", spurs.GetAddr(), flag); if(!spurs.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; return CELL_OK; @@ -171,7 +171,7 @@ int cellSpursEnableExceptionEventHandler(mem_ptr_t spurs, bool flag) int cellSpursSetGlobalExceptionEventHandler(mem_ptr_t spurs, mem_func_ptr_t eaHandler, mem_ptr_t arg) { - cellSpurs.Warning("cellSpursEnableExceptionEventHandler(spurs_addr=0x%x, eaHandler_addr=0x%x, arg_addr=0x%x,)", + cellSpurs.Error("cellSpursEnableExceptionEventHandler(spurs_addr=0x%x, eaHandler_addr=0x%x, arg_addr=0x%x,)", spurs.GetAddr(), eaHandler.GetAddr(), arg.GetAddr()); if(!spurs.IsGood() || eaHandler.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -180,7 +180,7 @@ int cellSpursSetGlobalExceptionEventHandler(mem_ptr_t spurs, int cellSpursUnsetGlobalExceptionEventHandler(mem_ptr_t spurs) { - cellSpurs.Warning("cellSpursUnsetGlobalExceptionEventHandler(spurs_addr=0x%x)", spurs.GetAddr()); + cellSpurs.Error("cellSpursUnsetGlobalExceptionEventHandler(spurs_addr=0x%x)", spurs.GetAddr()); if(!spurs.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; return CELL_OK; @@ -188,7 +188,7 @@ int cellSpursUnsetGlobalExceptionEventHandler(mem_ptr_t spurs) int cellSpursGetInfo(mem_ptr_t spurs, mem_ptr_t info) { - cellSpurs.Warning("cellSpursGetInfo(spurs_addr=0x%x, info_addr=0x%x)", spurs.GetAddr(), info.GetAddr()); + cellSpurs.Error("cellSpursGetInfo(spurs_addr=0x%x, info_addr=0x%x)", spurs.GetAddr(), info.GetAddr()); if(!spurs.IsGood() || !info.IsGood()) return CELL_SPURS_CORE_ERROR_NULL_POINTER; return CELL_OK; @@ -197,7 +197,7 @@ int cellSpursGetInfo(mem_ptr_t spurs, mem_ptr_t info) // Task functions int cellSpursGetTasksetId(mem_ptr_t taskset, mem32_t workloadId) { - cellSpurs.Warning("cellSpursGetTasksetId(taskset_addr=0x%x, workloadId_addr=0x%x)", taskset.GetAddr(), workloadId.GetAddr()); + cellSpurs.Error("cellSpursGetTasksetId(taskset_addr=0x%x, workloadId_addr=0x%x)", taskset.GetAddr(), workloadId.GetAddr()); if(!taskset.IsGood() || !taskset.IsGood()) return CELL_SPURS_TASK_ERROR_NULL_POINTER; return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp index 175ea47fb5..945e925063 100644 --- a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp @@ -185,6 +185,11 @@ void sysPrxForUser_init() sysPrxForUser.AddFunc(0x52aadadf, sys_lwcond_signal_to); sysPrxForUser.AddFunc(0x2a6d9d51, sys_lwcond_wait); + sysPrxForUser.AddFunc(0x8c2bb498, sys_spinlock_initialize); + sysPrxForUser.AddFunc(0xa285139d, sys_spinlock_lock); + sysPrxForUser.AddFunc(0x722a0254, sys_spinlock_trylock); + sysPrxForUser.AddFunc(0x5267cb35, sys_spinlock_unlock); + sysPrxForUser.AddFunc(0x67f9fedb, sys_game_process_exitspawn2); sysPrxForUser.AddFunc(0xfc52a7a9, sys_game_process_exitspawn); diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index 9d75580371..0b06490c51 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -9,6 +9,7 @@ #include "lv2/SC_Lwcond.h" #include "lv2/SC_Event_flag.h" #include "lv2/SC_Condition.h" +#include "lv2/SC_Spinlock.h" #include "Emu/event.h" //#define SYSCALLS_DEBUG @@ -200,6 +201,12 @@ extern int sys_rwlock_wlock(u32 rw_lock_id, u64 timeout); extern int sys_rwlock_trywlock(u32 rw_lock_id); extern int sys_rwlock_wunlock(u32 rw_lock_id); +//sys_spinlock +extern void sys_spinlock_initialize(mem_ptr_t lock); +extern void sys_spinlock_lock(mem_ptr_t lock); +extern int sys_spinlock_trylock(mem_ptr_t lock); +extern void sys_spinlock_unlock(mem_ptr_t lock); + //ppu_thread extern void sys_ppu_thread_exit(u64 errorcode); extern int sys_ppu_thread_yield(); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.cpp new file mode 100644 index 0000000000..90d9a35a3a --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.cpp @@ -0,0 +1,51 @@ +#include "stdafx.h" +#include "Emu/SysCalls/SysCalls.h" +#include "Emu/SysCalls/lv2/SC_Spinlock.h" + +SysCallBase sys_spinlock("sys_spinlock"); + +void sys_spinlock_initialize(mem_ptr_t lock) +{ + sys_spinlock.Log("sys_spinlock_initialize(lock_addr=0x%x)", lock.GetAddr()); + + lock->mutex.initialize(); +} + +void sys_spinlock_lock(mem_ptr_t lock) +{ + sys_spinlock.Log("sys_spinlock_lock(lock_addr=0x%x)", lock.GetAddr()); + + be_t tid = GetCurrentPPUThread().GetId(); + switch (lock->mutex.lock(tid)) + { + case SMR_ABORT: ConLog.Warning("sys_spinlock_lock(0x%x) aborted", lock.GetAddr()); break; + case SMR_DEADLOCK: ConLog.Error("sys_spinlock_lock(0x%x) reached deadlock", lock.GetAddr()); break; // ??? + default: break; + } +} + +int sys_spinlock_trylock(mem_ptr_t lock) +{ + sys_spinlock.Log("sys_spinlock_trylock(lock_addr=0x%x)", lock.GetAddr()); + + be_t tid = GetCurrentPPUThread().GetId(); + switch (lock->mutex.trylock(tid)) + { + case SMR_FAILED: return CELL_EBUSY; + case SMR_ABORT: ConLog.Warning("sys_spinlock_trylock(0x%x) aborted", lock.GetAddr()); break; + case SMR_DEADLOCK: ConLog.Error("sys_spinlock_trylock(0x%x) reached deadlock", lock.GetAddr()); break; + default: break; + } + + return CELL_OK; +} + +void sys_spinlock_unlock(mem_ptr_t lock) +{ + sys_spinlock.Log("sys_spinlock_unlock(lock_addr=0x%x)", lock.GetAddr()); + + switch (lock->mutex.unlock(lock->mutex.GetOwner())) + { + default: break; + } +} \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h b/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h new file mode 100644 index 0000000000..0ff4af4029 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/SC_Spinlock.h @@ -0,0 +1,6 @@ +#pragma once + +struct spinlock +{ + SMutexBE mutex; +}; \ No newline at end of file diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 1dfb346159..a02f6bf916 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -277,6 +277,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index b10d1cb470..7e4015ba55 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -466,6 +466,9 @@ Emu\SysCalls\Modules + + Emu\SysCalls\lv2 + From b0f6b03c38016a5534235f17a2d2c0d1456f5f11 Mon Sep 17 00:00:00 2001 From: O1L Date: Fri, 14 Mar 2014 17:53:37 +0300 Subject: [PATCH 16/27] Fixed crash on using NUll Audio Output, fixed possible crash in OpenAL exit and minor changes in cellAudioEventQueue functions. --- rpcs3/Emu/Audio/AL/OpenALThread.cpp | 2 ++ rpcs3/Emu/Audio/cellAudio.h | 2 +- rpcs3/Emu/SysCalls/Modules/cellAudio.cpp | 22 +++++++++++++--------- rpcs3/Gui/MainFrame.cpp | 2 +- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/rpcs3/Emu/Audio/AL/OpenALThread.cpp b/rpcs3/Emu/Audio/AL/OpenALThread.cpp index c5255988b6..af49d5a01a 100644 --- a/rpcs3/Emu/Audio/AL/OpenALThread.cpp +++ b/rpcs3/Emu/Audio/AL/OpenALThread.cpp @@ -44,6 +44,8 @@ void OpenALThread::Init() void OpenALThread::Quit() { + m_context = alcGetCurrentContext(); + m_device = alcGetContextsDevice(m_context); alcMakeContextCurrent(nullptr); alcDestroyContext(m_context); alcCloseDevice(m_device); diff --git a/rpcs3/Emu/Audio/cellAudio.h b/rpcs3/Emu/Audio/cellAudio.h index e5ea8545fe..7d492b0ba9 100644 --- a/rpcs3/Emu/Audio/cellAudio.h +++ b/rpcs3/Emu/Audio/cellAudio.h @@ -139,7 +139,7 @@ struct AudioConfig //custom structure : m_is_audio_initialized(false) , m_is_audio_finalized(false) , m_port_in_use(0) - , event_key(0) + , event_key(0x80004d494f323221) , counter(0) { memset(&m_ports, 0, sizeof(AudioPortConfig) * AUDIO_PORT_COUNT); diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index f0c1e38588..1fb6dc72ff 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -60,7 +60,7 @@ int cellAudioInit() memset(buffer2, 0, sizeof(buffer2)); memset(oal_buffer.get(), 0, oal_buffer_size * sizeof(u16)); - if(Ini.AudioOutMode.GetValue() == 1) + if(m_audio_out) { m_audio_out->Init(); m_audio_out->Open(oal_buffer.get(), oal_buffer_size*sizeof(u16)); @@ -151,7 +151,10 @@ int cellAudioInit() if(oal_buffer_offset >= oal_buffer_size) { - m_audio_out->AddData(oal_buffer.get(), oal_buffer_offset * sizeof(u16)); + if(m_audio_out) + { + m_audio_out->AddData(oal_buffer.get(), oal_buffer_offset * sizeof(u16)); + } oal_buffer_offset = 0; } @@ -438,21 +441,22 @@ int cellAudioCreateNotifyEventQueue(mem32_t id, mem64_t key) { cellAudio.Warning("cellAudioCreateNotifyEventQueue(id_addr=0x%x, key_addr=0x%x)", id.GetAddr(), key.GetAddr()); - if (Emu.GetEventManager().CheckKey(0x80004d494f323221)) + while (Emu.GetEventManager().CheckKey(m_config.event_key)) { - return CELL_AUDIO_ERROR_EVENT_QUEUE; + m_config.event_key++; // experimental + //return CELL_AUDIO_ERROR_EVENT_QUEUE; } - EventQueue* eq = new EventQueue(SYS_SYNC_FIFO, SYS_PPU_QUEUE, 0x80004d494f323221, 0x80004d494f323221, 32); + EventQueue* eq = new EventQueue(SYS_SYNC_FIFO, SYS_PPU_QUEUE, m_config.event_key, m_config.event_key, 32); - if (!Emu.GetEventManager().RegisterKey(eq, 0x80004d494f323221)) + if (!Emu.GetEventManager().RegisterKey(eq, m_config.event_key)) { delete eq; return CELL_AUDIO_ERROR_EVENT_QUEUE; } id = cellAudio.GetNewId(eq); - key = 0x80004d494f323221; + key = m_config.event_key; return CELL_OK; } @@ -467,7 +471,7 @@ int cellAudioSetNotifyEventQueue(u64 key) { cellAudio.Warning("cellAudioSetNotifyEventQueue(key=0x%llx)", key); - m_config.event_key = key; + //m_config.event_key = key; /*EventQueue* eq; if (!Emu.GetEventManager().GetEventQueue(key, eq)) @@ -496,7 +500,7 @@ int cellAudioRemoveNotifyEventQueue(u64 key) return CELL_AUDIO_ERROR_PARAM; } - m_config.event_key = 0; + m_config.event_key = 0x80004d494f323221; // TODO: disconnect port diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index 653664072e..fc6ac9f582 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -416,7 +416,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) chbox_hle_exitonstop->SetValue(Ini.HLEExitOnStop.GetValue()); chbox_audio_dump->Enable(Emu.IsStopped()); - cbox_audio_out->Enable(Emu.IsStopped()); + //cbox_audio_out->Enable(Emu.IsStopped()); chbox_hle_logging->Enable(Emu.IsStopped()); cbox_cpu_decoder->SetSelection(Ini.CPUDecoderMode.GetValue() ? Ini.CPUDecoderMode.GetValue() - 1 : 0); From 6c4a980d36f727340ca599b662178da250476173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Fri, 14 Mar 2014 18:12:12 +0100 Subject: [PATCH 17/27] Minor changes * Fixed identation * Make some parts of the code more readable. --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 17 ++++-------- rpcs3/Emu/GS/RSXTexture.cpp | 4 +-- rpcs3/Emu/GS/RSXThread.cpp | 28 +++++--------------- rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/sys_net.cpp | 2 +- 5 files changed, 15 insertions(+), 38 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index 699e23da97..cabcd745d7 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -375,33 +375,24 @@ bool GLGSRender::LoadProgram() if(!m_cur_shader_prog) { ConLog.Warning("LoadProgram: m_cur_shader_prog == NULL"); - return false; } - m_fp_buf_num = m_prog_buffer.SearchFp(*m_cur_shader_prog, m_shader_prog); - - if(m_fp_buf_num == -1) m_shader_prog.Decompile(*m_cur_shader_prog); - if(!m_cur_vertex_prog) { ConLog.Warning("LoadProgram: m_cur_vertex_prog == NULL"); - return false; } - //ConLog.Write("Create program"); + m_fp_buf_num = m_prog_buffer.SearchFp(*m_cur_shader_prog, m_shader_prog); m_vp_buf_num = m_prog_buffer.SearchVp(*m_cur_vertex_prog, m_vertex_prog); - if(m_vp_buf_num == -1) - { - ConLog.Warning("VP not found in buffer!"); - m_vertex_prog.Decompile(*m_cur_vertex_prog); - } + //ConLog.Write("Create program"); if(m_fp_buf_num == -1) { ConLog.Warning("FP not found in buffer!"); + m_shader_prog.Decompile(*m_cur_shader_prog); m_shader_prog.Wait(); m_shader_prog.Compile(); checkForGlError("m_shader_prog.Compile"); @@ -412,6 +403,8 @@ bool GLGSRender::LoadProgram() if(m_vp_buf_num == -1) { + ConLog.Warning("VP not found in buffer!"); + m_vertex_prog.Decompile(*m_cur_vertex_prog); m_vertex_prog.Wait(); m_vertex_prog.Compile(); checkForGlError("m_vertex_prog.Compile"); diff --git a/rpcs3/Emu/GS/RSXTexture.cpp b/rpcs3/Emu/GS/RSXTexture.cpp index 966e97a0af..1b150a95ac 100644 --- a/rpcs3/Emu/GS/RSXTexture.cpp +++ b/rpcs3/Emu/GS/RSXTexture.cpp @@ -3,12 +3,12 @@ RSXTexture::RSXTexture() { - m_index = 0; + m_index = 0; } RSXTexture::RSXTexture(u8 index) { - m_index = index; + m_index = index; } void RSXTexture::Init() diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index c16bc64cef..4868845eb0 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -333,29 +333,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 m_surface_width = (a0 >> 16) & 0xff; m_surface_height = (a0 >> 24) & 0xff; - if(count >= 2) + switch (min((u32)6, count)) { - m_surface_pitch_a = ARGS(1); - - if(count >= 3) - { - m_surface_offset_a = ARGS(2); - - if(count >= 4) - { - m_surface_offset_z = ARGS(3); - - if(count >= 5) - { - m_surface_offset_b = ARGS(4); - - if(count >= 6) - { - m_surface_pitch_b = ARGS(5); - } - } - } - } + case 6: m_surface_pitch_b = ARGS(5); + case 5: m_surface_offset_b = ARGS(4); + case 4: m_surface_offset_z = ARGS(3); + case 3: m_surface_offset_a = ARGS(2); + case 2: m_surface_pitch_a = ARGS(1); } gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(m_gcm_buffers_addr); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp index 991ffab7cf..38b4ad53db 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp @@ -166,7 +166,7 @@ int cellSysmoduleLoadModule(u16 id) return CELL_SYSMODULE_ERROR_UNKNOWN; } - if(m->IsLoaded()) + if(m->IsLoaded() && id != 0x10) // CELL_SYSMODULE_GCM_SYS and CELL_SYSMODULE_GCM share the same ID { return CELL_SYSMODULE_ERROR_DUPLICATED; } diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp index a171925f52..aaeb73cf19 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp @@ -287,7 +287,7 @@ int sys_net_shutdown(s32 s, s32 how) int sys_net_socket(s32 family, s32 type, s32 protocol) { - sys_net.Warning("socket(family=%d, type=%d, protocol=%d", family, type, protocol); + sys_net.Warning("socket(family=%d, type=%d, protocol=%d)", family, type, protocol); int ret = socket(family, type, protocol); g_lastError = getLastError(); return ret; From 60d922da110d71d3ab701fb8f4312687583670d2 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sat, 15 Mar 2014 19:43:14 +0400 Subject: [PATCH 18/27] DMA List commands cellAudio: multiple queue support sys_cond simplified cellFsMkdir (?) --- rpcs3/Emu/Audio/cellAudio.h | 4 +- rpcs3/Emu/Cell/MFC.h | 5 +- rpcs3/Emu/Cell/SPUThread.h | 117 ++++++++++++++++++++++- rpcs3/Emu/SysCalls/Modules/cellAudio.cpp | 56 ++++++++--- rpcs3/Emu/SysCalls/lv2/SC_Condition.cpp | 112 ++-------------------- rpcs3/Emu/SysCalls/lv2/SC_Condition.h | 1 + rpcs3/Emu/SysCalls/lv2/SC_Event.cpp | 2 +- rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp | 7 +- rpcs3/Emu/SysCalls/lv2/SC_Mutex.cpp | 31 +----- rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp | 30 +----- rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h | 25 +++++ 11 files changed, 215 insertions(+), 175 deletions(-) diff --git a/rpcs3/Emu/Audio/cellAudio.h b/rpcs3/Emu/Audio/cellAudio.h index 7d492b0ba9..dc371c9c67 100644 --- a/rpcs3/Emu/Audio/cellAudio.h +++ b/rpcs3/Emu/Audio/cellAudio.h @@ -121,6 +121,7 @@ struct AudioPortConfig struct AudioConfig //custom structure { + std::mutex m_mutex; enum { AUDIO_PORT_COUNT = 8, @@ -131,15 +132,14 @@ struct AudioConfig //custom structure bool m_is_audio_initialized; bool m_is_audio_finalized; u32 m_port_in_use; - u64 event_key; u64 counter; u64 start_time; + Array m_keys; AudioConfig() : m_is_audio_initialized(false) , m_is_audio_finalized(false) , m_port_in_use(0) - , event_key(0x80004d494f323221) , counter(0) { memset(&m_ports, 0, sizeof(AudioPortConfig) * AUDIO_PORT_COUNT); diff --git a/rpcs3/Emu/Cell/MFC.h b/rpcs3/Emu/Cell/MFC.h index 6016924ae5..bef241c7b8 100644 --- a/rpcs3/Emu/Cell/MFC.h +++ b/rpcs3/Emu/Cell/MFC.h @@ -18,6 +18,7 @@ enum MFC_BARRIER_MASK = 0x01, MFC_FENCE_MASK = 0x02, + MFC_LIST_MASK = 0x04, MFC_MASK_CMD = 0xffff, }; @@ -165,7 +166,7 @@ struct DMAC //returns true if the command should be deleted from the queue if (cmd & (MFC_BARRIER_MASK | MFC_FENCE_MASK)) _mm_mfence(); - switch(cmd & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK)) + switch(cmd & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK | MFC_LIST_MASK)) { case MFC_PUT_CMD: Memory.Copy(ea, ls_offset + lsa, size); @@ -176,7 +177,7 @@ struct DMAC return true; default: - ConLog.Error("Unknown DMA cmd."); + ConLog.Error("DMAC::ProcessCmd(): Unknown DMA cmd."); return true; } } diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index fcaccd72c9..cfed36752e 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -1,6 +1,7 @@ #pragma once #include "PPCThread.h" #include "Emu/event.h" +#include "Emu/SysCalls/lv2/SC_SPU_Thread.h" #include "MFC.h" #include @@ -484,6 +485,22 @@ public: Channel<1> AtomicStat; } Prxy; + struct StalledList + { + u32 lsa; + u64 ea; + u16 tag; + u16 size; + u32 cmd; + MFCReg* MFCArgs; + + StalledList() + : MFCArgs(nullptr) + { + } + } StallList[32]; + Channel<1> StallStat; + struct { Channel<1> Out_MBox; @@ -505,6 +522,66 @@ public: DMAC dmac; + void ListCmd(u32 lsa, u64 ea, u16 tag, u16 size, u32 cmd, MFCReg& MFCArgs) + { + u32 list_addr = ea & 0x3ffff; + u32 list_size = size / 8; + lsa &= 0x3fff0; + + struct list_element + { + be_t s; // Stall-and-Notify bit (0x8000) + be_t ts; // List Transfer Size + be_t ea; // External Address Low + }; + + u32 result = MFC_PPU_DMA_CMD_SEQUENCE_ERROR; + + for (u32 i = 0; i < list_size; i++) + { + mem_ptr_t rec(dmac.ls_offset + list_addr + i * 8); + + u32 size = rec->ts; + if (size < 16 && size != 1 && size != 2 && size != 4 && size != 8) + { + ConLog.Error("DMA List: invalid transfer size(%d)", size); + return; + } + + u32 addr = rec->ea; + result = dmac.Cmd(cmd, tag, lsa | (addr & 0xf), addr, size); + if (result == MFC_PPU_DMA_CMD_SEQUENCE_ERROR) + { + break; + } + + if (Ini.HLELogging.GetValue() || rec->s) + ConLog.Write("*** list element(%d/%d): s = 0x%x, ts = 0x%x, low ea = 0x%x (lsa = 0x%x)", + i, list_size, (u16)rec->s, (u16)rec->ts, (u32)rec->ea, lsa | (addr & 0xf)); + + lsa += max(size, (u32)16); + + if (rec->s & se16(0x8000)) + { + StallStat.PushUncond_OR(1 << tag); + + if (StallList[tag].MFCArgs) + { + ConLog.Error("DMA List: existing stalled list found (tag=%d)", tag); + } + StallList[tag].MFCArgs = &MFCArgs; + StallList[tag].cmd = cmd; + StallList[tag].ea = (ea & ~0xffffffff) | (list_addr + (i + 1) * 8); + StallList[tag].lsa = lsa; + StallList[tag].size = (list_size - i - 1) * 8; + + return; + } + } + + MFCArgs.CMDStatus.SetValue(result); + } + void EnqMfcCmd(MFCReg& MFCArgs) { u32 cmd = MFCArgs.CMDStatus.GetValue(); @@ -528,7 +605,7 @@ public: lsa, ea, tag, size, cmd); if (op & MFC_PUT_CMD) { - SMutexLocker lock(reservation.mutex); + SMutexLocker lock(reservation.mutex); // should be removed MFCArgs.CMDStatus.SetValue(dmac.Cmd(cmd, tag, lsa, ea, size)); if ((reservation.addr + reservation.size > ea && reservation.addr <= ea + size) || (ea + size > reservation.addr && ea <= reservation.addr + reservation.size)) @@ -543,6 +620,19 @@ public: } break; + case MFC_PUTL_CMD: + case MFC_GETL_CMD: + { + if (Ini.HLELogging.GetValue()) ConLog.Write("DMA %s%s%s: lsa = 0x%x, list = 0x%llx, tag = 0x%x, size = 0x%x, cmd = 0x%x", + wxString(op & MFC_PUT_CMD ? "PUTL" : "GETL").wx_str(), + wxString(op & MFC_BARRIER_MASK ? "B" : "").wx_str(), + wxString(op & MFC_FENCE_MASK ? "F" : "").wx_str(), + lsa, ea, tag, size, cmd); + + ListCmd(lsa, ea, tag, size, cmd, MFCArgs); + } + break; + case MFC_GETLLAR_CMD: case MFC_PUTLLC_CMD: case MFC_PUTLLUC_CMD: @@ -628,6 +718,9 @@ public: case MFC_RdTagStat: return Prxy.TagStatus.GetCount(); + case MFC_RdListStallStat: + return StallStat.GetCount(); + case MFC_WrTagUpdate: return Prxy.TagStatus.GetCount(); // hack @@ -751,6 +844,24 @@ public: EnqMfcCmd(MFC1); break; + case MFC_WrListStallAck: + { + if (v >= 32) + { + ConLog.Error("MFC_WrListStallAck error: invalid tag(%d)", v); + return; + } + StalledList temp = StallList[v]; + if (!temp.MFCArgs) + { + ConLog.Error("MFC_WrListStallAck error: empty tag(%d)", v); + return; + } + StallList[v].MFCArgs = nullptr; + ListCmd(temp.lsa, temp.ea, temp.tag, temp.size, temp.cmd, *temp.MFCArgs); + } + break; + default: ConLog.Error("%s error: unknown/illegal channel (%d [%s]).", wxString(__FUNCTION__).wx_str(), ch, wxString(spu_ch_name[ch]).wx_str()); break; @@ -790,6 +901,10 @@ public: while (!Prxy.AtomicStat.Pop(v) && !Emu.IsStopped()) Sleep(1); break; + case MFC_RdListStallStat: + while (!StallStat.Pop(v) && !Emu.IsStopped()) Sleep(1); + break; + default: ConLog.Error("%s error: unknown/illegal channel (%d [%s]).", wxString(__FUNCTION__).wx_str(), ch, wxString(spu_ch_name[ch]).wx_str()); break; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index 1fb6dc72ff..f6ff6404b2 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -60,6 +60,8 @@ int cellAudioInit() memset(buffer2, 0, sizeof(buffer2)); memset(oal_buffer.get(), 0, oal_buffer_size * sizeof(u16)); + Array keys; + if(m_audio_out) { m_audio_out->Init(); @@ -144,8 +146,16 @@ int cellAudioInit() } // send aftermix event (normal audio event) - // TODO: check event source - Emu.GetEventManager().SendEvent(m_config.event_key, 0x10103000e010e07, 0, 0, 0); + { + std::lock_guard lock(m_config.m_mutex); + keys.SetCount(m_config.m_keys.GetCount()); + memcpy(keys.GetPtr(), m_config.m_keys.GetPtr(), sizeof(u64) * keys.GetCount()); + } + for (u32 i = 0; i < keys.GetCount(); i++) + { + // TODO: check event source + Emu.GetEventManager().SendEvent(keys[i], 0x10103000e010e07, 0, 0, 0); + } oal_buffer_offset += sizeof(buffer) / sizeof(float); @@ -441,22 +451,27 @@ int cellAudioCreateNotifyEventQueue(mem32_t id, mem64_t key) { cellAudio.Warning("cellAudioCreateNotifyEventQueue(id_addr=0x%x, key_addr=0x%x)", id.GetAddr(), key.GetAddr()); - while (Emu.GetEventManager().CheckKey(m_config.event_key)) + std::lock_guard lock(m_config.m_mutex); + + u64 event_key = 0; + while (Emu.GetEventManager().CheckKey((event_key << 48) | 0x80004d494f323221)) { - m_config.event_key++; // experimental + event_key++; // experimental //return CELL_AUDIO_ERROR_EVENT_QUEUE; } + event_key = (event_key << 48) | 0x80004d494f323221; // left part: 0x8000, 0x8001, 0x8002 ... - EventQueue* eq = new EventQueue(SYS_SYNC_FIFO, SYS_PPU_QUEUE, m_config.event_key, m_config.event_key, 32); + EventQueue* eq = new EventQueue(SYS_SYNC_FIFO, SYS_PPU_QUEUE, event_key, event_key, 32); - if (!Emu.GetEventManager().RegisterKey(eq, m_config.event_key)) + if (!Emu.GetEventManager().RegisterKey(eq, event_key)) { delete eq; return CELL_AUDIO_ERROR_EVENT_QUEUE; } + m_config.m_keys.AddCpy(event_key); id = cellAudio.GetNewId(eq); - key = m_config.event_key; + key = event_key; return CELL_OK; } @@ -471,7 +486,9 @@ int cellAudioSetNotifyEventQueue(u64 key) { cellAudio.Warning("cellAudioSetNotifyEventQueue(key=0x%llx)", key); - //m_config.event_key = key; + std::lock_guard lock(m_config.m_mutex); + + m_config.m_keys.AddCpy(key); /*EventQueue* eq; if (!Emu.GetEventManager().GetEventQueue(key, eq)) @@ -494,13 +511,30 @@ int cellAudioRemoveNotifyEventQueue(u64 key) { cellAudio.Warning("cellAudioRemoveNotifyEventQueue(key=0x%llx)", key); - EventQueue* eq; - if (!Emu.GetEventManager().GetEventQueue(key, eq)) + std::lock_guard lock(m_config.m_mutex); + + bool found = false; + for (u32 i = 0; i < m_config.m_keys.GetCount(); i++) { + if (m_config.m_keys[i] == key) + { + m_config.m_keys.RemoveAt(i); + found = true; + break; + } + } + + if (!found) + { + // ??? return CELL_AUDIO_ERROR_PARAM; } - m_config.event_key = 0x80004d494f323221; + /*EventQueue* eq; + if (!Emu.GetEventManager().GetEventQueue(key, eq)) + { + return CELL_AUDIO_ERROR_PARAM; + }*/ // TODO: disconnect port diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Condition.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Condition.cpp index 8f0785ab96..cc6a1d7c9d 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Condition.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Condition.cpp @@ -71,48 +71,15 @@ int sys_cond_signal(u32 cond_id) } Mutex* mutex = cond->mutex; - u32 tid = GetCurrentPPUThread().GetId(); - - bool was_locked = (mutex->m_mutex.GetOwner() == tid); if (u32 target = (mutex->protocol == SYS_SYNC_PRIORITY ? cond->m_queue.pop_prio() : cond->m_queue.pop())) { - CPUThread* tt = Emu.GetCPU().GetThread(target); - bool valid = tt && tt->IsAlive(); - if (!valid) - { - sys_cond.Error("sys_cond_signal(%d): signal to invalid thread(%d)", cond_id, target); - return CELL_OK; - } + cond->cond.lock(target); - if (!was_locked) // mutex hasn't been locked (don't care about mutex state) + if (Emu.IsStopped()) { - if (u32 owner = mutex->m_mutex.GetOwner()) - { - tt = Emu.GetCPU().GetThread(owner); - valid = tt && tt->IsAlive(); - if (!valid) - { - sys_cond.Error("sys_cond_signal(%d): deadlock on invalid thread(%d)", cond_id, owner); - return CELL_OK; - } - } - mutex->m_mutex.lock(tid); - mutex->recursive = 1; - mutex->m_mutex.unlock(tid, target); + ConLog.Warning("sys_cond_signal(id=%d) aborted", cond_id); } - else // mutex has been locked (should preserve original mutex state) - { - mutex->recursive = 1; - mutex->m_mutex.unlock(tid, target); - mutex->m_mutex.lock(tid); - mutex->recursive = 1; - } - } - - if (Emu.IsStopped()) - { - ConLog.Warning("sys_cond_signal(id=%d) aborted", cond_id); } return CELL_OK; @@ -129,43 +96,10 @@ int sys_cond_signal_all(u32 cond_id) } Mutex* mutex = cond->mutex; - u32 tid = GetCurrentPPUThread().GetId(); - - bool was_locked = (mutex->m_mutex.GetOwner() == tid); while (u32 target = (mutex->protocol == SYS_SYNC_PRIORITY ? cond->m_queue.pop_prio() : cond->m_queue.pop())) { - CPUThread* tt = Emu.GetCPU().GetThread(target); - bool valid = tt && tt->IsAlive(); - if (!valid) - { - sys_cond.Error("sys_cond_signal_all(%d): signal to invalid thread(%d)", cond_id, target); - return CELL_OK; - } - - if (!was_locked) - { - if (u32 owner = mutex->m_mutex.GetOwner()) - { - tt = Emu.GetCPU().GetThread(owner); - valid = tt && tt->IsAlive(); - if (!valid) - { - sys_cond.Error("sys_cond_signal_all(%d): deadlock on invalid thread(%d)", cond_id, owner); - return CELL_OK; - } - } - mutex->m_mutex.lock(tid); - mutex->recursive = 1; - mutex->m_mutex.unlock(tid, target); - } - else - { - mutex->recursive = 1; - mutex->m_mutex.unlock(tid, target); - mutex->m_mutex.lock(tid); - mutex->recursive = 1; - } + cond->cond.lock(target); if (Emu.IsStopped()) { @@ -197,35 +131,10 @@ int sys_cond_signal_to(u32 cond_id, u32 thread_id) } Mutex* mutex = cond->mutex; - u32 tid = GetCurrentPPUThread().GetId(); - - bool was_locked = (mutex->m_mutex.GetOwner() == tid); u32 target = thread_id; { - if (!was_locked) - { - if (u32 owner = mutex->m_mutex.GetOwner()) - { - CPUThread* tt = Emu.GetCPU().GetThread(owner); - bool valid = tt && tt->IsAlive(); - if (!valid) - { - sys_cond.Error("sys_cond_signal_to(%d): deadlock on invalid thread(%d)", cond_id, owner); - return CELL_OK; - } - } - mutex->m_mutex.lock(tid); - mutex->recursive = 1; - mutex->m_mutex.unlock(tid, target); - } - else - { - mutex->recursive = 1; - mutex->m_mutex.unlock(tid, target); - mutex->m_mutex.lock(tid); - mutex->recursive = 1; - } + cond->cond.lock(target); } if (Emu.IsStopped()) @@ -264,15 +173,11 @@ int sys_cond_wait(u32 cond_id, u64 timeout) while (true) { - /* switch (mutex->m_mutex.trylock(tid)) + if (cond->cond.GetOwner() == tid) { - case SMR_OK: mutex->m_mutex.unlock(tid); break; - case SMR_SIGNAL: mutex->recursive = 1; return CELL_OK; - } */ - if (mutex->m_mutex.GetOwner() == tid) - { - _mm_mfence(); + mutex->m_mutex.lock(tid); mutex->recursive = 1; + cond->cond.unlock(tid); return CELL_OK; } @@ -281,6 +186,7 @@ int sys_cond_wait(u32 cond_id, u64 timeout) if (counter++ > max_counter) { cond->m_queue.invalidate(tid); + GetCurrentPPUThread().owned_mutexes--; return CELL_ETIMEDOUT; } if (Emu.IsStopped()) diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Condition.h b/rpcs3/Emu/SysCalls/lv2/SC_Condition.h index dc849948b4..460923a504 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Condition.h +++ b/rpcs3/Emu/SysCalls/lv2/SC_Condition.h @@ -16,6 +16,7 @@ struct sys_cond_attribute struct Cond { Mutex* mutex; // associated with mutex + SMutex cond; SleepQueue m_queue; Cond(Mutex* mutex, u64 name) diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Event.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Event.cpp index b662ee10c5..d6ea1a26a3 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Event.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Event.cpp @@ -203,7 +203,7 @@ int sys_event_queue_receive(u32 equeue_id, mem_ptr_t event, u64 eq->owner.unlock(tid); sys_event.Log(" *** event received: source=0x%llx, d1=0x%llx, d2=0x%llx, d3=0x%llx", (u64)event->source, (u64)event->data1, (u64)event->data2, (u64)event->data3); - /* HACK: passing event data in registers */ + /* passing event data in registers */ PPUThread& t = GetCurrentPPUThread(); t.GPR[4] = event->source; t.GPR[5] = event->data1; diff --git a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp index dfbe386ca0..c006439d1e 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_FileSystem.cpp @@ -324,10 +324,15 @@ int cellFsMkdir(u32 path_addr, u32 mode) const wxString& ps3_path = Memory.ReadString(path_addr); sys_fs.Log("cellFsMkdir(path=\"%s\", mode=0x%x)", ps3_path.wx_str(), mode); - vfsDir dir; + /*vfsDir dir; if(dir.IsExists(ps3_path)) return CELL_EEXIST; if(!dir.Create(ps3_path)) + return CELL_EBUSY;*/ + + if(Emu.GetVFS().ExistsDir(ps3_path)) + return CELL_EEXIST; + if(!Emu.GetVFS().CreateDir(ps3_path)) return CELL_EBUSY; return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Mutex.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Mutex.cpp index ce1b3f51d3..d0d2b3f962 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Mutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Mutex.cpp @@ -98,8 +98,9 @@ int sys_mutex_lock(u32 mutex_id, u64 timeout) PPUThread& t = GetCurrentPPUThread(); u32 tid = t.GetId(); - u32 owner = mutex->m_mutex.GetOwner(); + _mm_mfence(); + u32 owner = mutex->m_mutex.GetOwner(); if (owner == tid) { if (mutex->is_recursive) @@ -119,22 +120,10 @@ int sys_mutex_lock(u32 mutex_id, u64 timeout) { if (CPUThread* tt = Emu.GetCPU().GetThread(owner)) { - if (!tt->IsAlive()) - { - if (owner == mutex->m_mutex.GetOwner()) sys_mtx.Error("sys_mutex_lock(%d): deadlock on invalid thread(%d)", mutex_id, owner); - /*mutex->m_mutex.unlock(owner, tid); - mutex->recursive = 1; - t.owned_mutexes++; - return CELL_OK;*/ - } } else { sys_mtx.Error("sys_mutex_lock(%d): deadlock on invalid thread(%d)", mutex_id, owner); - /*mutex->m_mutex.unlock(owner, tid); - mutex->recursive = 1; - t.owned_mutexes++; - return CELL_OK;*/ } } @@ -180,8 +169,9 @@ int sys_mutex_trylock(u32 mutex_id) PPUThread& t = GetCurrentPPUThread(); u32 tid = t.GetId(); - u32 owner = mutex->m_mutex.GetOwner(); + _mm_mfence(); + u32 owner = mutex->m_mutex.GetOwner(); if (owner == tid) { if (mutex->is_recursive) @@ -201,22 +191,10 @@ int sys_mutex_trylock(u32 mutex_id) { if (CPUThread* tt = Emu.GetCPU().GetThread(owner)) { - if (!tt->IsAlive()) - { - if (owner == mutex->m_mutex.GetOwner()) sys_mtx.Error("sys_mutex_trylock(%d): deadlock on invalid thread(%d)", mutex_id, owner); - /*mutex->m_mutex.unlock(owner, tid); - mutex->recursive = 1; - t.owned_mutexes++; - return CELL_OK;*/ - } } else { sys_mtx.Error("sys_mutex_trylock(%d): deadlock on invalid thread(%d)", mutex_id, owner); - /*mutex->m_mutex.unlock(owner, tid); - mutex->recursive = 1; - t.owned_mutexes++; - return CELL_OK;*/ } } @@ -241,6 +219,7 @@ int sys_mutex_unlock(u32 mutex_id) PPUThread& t = GetCurrentPPUThread(); u32 tid = t.GetId(); + _mm_mfence(); if (mutex->m_mutex.GetOwner() == tid) { if (!mutex->recursive || (mutex->recursive != 1 && !mutex->is_recursive)) diff --git a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp b/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp index 02b898207e..170343883c 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp @@ -9,32 +9,6 @@ static SysCallBase sc_spu("sys_spu"); extern SysCallBase sys_event; -static const u32 g_spu_group_thr_max = 255; - -struct SpuGroupInfo -{ - Array list; - std::atomic lock; - wxString m_name; - int m_prio; - int m_type; - int m_ct; - - SpuGroupInfo(wxString name, u32 num, int prio, int type, u32 ct) - : m_name(name) - , m_prio(prio) - , m_type(type) - , m_ct(ct) - , lock(0) - { - list.SetCount(num); - for (u32 i = 0; i < num; i++) - { - list[i] = 0; - } - } -}; - u32 LoadSpuImage(vfsStream& stream, u32& spu_ep) { ELFLoader l(stream); @@ -114,7 +88,7 @@ int sys_spu_thread_initialize(mem32_t thread, u32 group, u32 spu_num, mem_ptr_t< return CELL_EFAULT; } - if(spu_num >= g_spu_group_thr_max) + if(spu_num >= group_info->list.GetCount()) { return CELL_EINVAL; } @@ -287,7 +261,7 @@ int sys_spu_thread_group_create(mem32_t id, u32 num, int prio, mem_ptr_tname_addr, attr->name_len)) return CELL_EFAULT; - if (num > g_spu_group_thr_max) return CELL_EINVAL; + if (num > 256) return CELL_EINVAL; if (prio < 16 || prio > 255) return CELL_EINVAL; diff --git a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h b/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h index 7d674155e4..1721b9c232 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h +++ b/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.h @@ -55,3 +55,28 @@ struct sys_spu_segment be_t size; be_t src; }; + +struct SpuGroupInfo +{ + Array list; + std::atomic lock; + wxString m_name; + int m_prio; + int m_type; + int m_ct; + + SpuGroupInfo(wxString name, u32 num, int prio, int type, u32 ct) + : m_name(name) + , m_prio(prio) + , m_type(type) + , m_ct(ct) + , lock(0) + { + num = 256; + list.SetCount(num); + for (u32 i = 0; i < num; i++) + { + list[i] = 0; + } + } +}; \ No newline at end of file From c4a9c874d197a42ed99a520c6b0a3834fec7c282 Mon Sep 17 00:00:00 2001 From: Hykem Date: Sat, 15 Mar 2014 19:45:43 +0000 Subject: [PATCH 19/27] Improved FRES and FRSQRTE results (tested with ppu_fpu). Implemented and improved several SC_Memory syscalls. Started working in sceNp module. --- rpcs3/Emu/Cell/PPUInterpreter.h | 60 +-- rpcs3/Emu/SysCalls/Modules/sceNp.cpp | 34 ++ rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp | 2 + rpcs3/Emu/SysCalls/SysCalls.cpp | 29 +- rpcs3/Emu/SysCalls/SysCalls.h | 19 +- rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp | 513 ++++++++++++++----- rpcs3/Emu/SysCalls/lv2/SC_Memory.h | 120 +++-- 7 files changed, 517 insertions(+), 260 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index 5ebb8a36f4..4baa3ec1bf 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -3404,62 +3404,11 @@ private: } void FRES(u32 frd, u32 frb, bool rc) { - double res; - -#ifdef _MSC_VER - if(_fpclass(CPU.FPR[frb]) >= _FPCLASS_NZ) -#else - if(_fpclass(CPU.FPR[frb]) == FP_ZERO || std::signbit(CPU.FPR[frb]) == 0) -#endif - { - res = static_cast(1.0 / CPU.FPR[frb]); - if(FPRdouble::IsINF(res) && CPU.FPR[frb] != 0.0) - { - if(res > 0.0) - { - (u64&)res = 0x47EFFFFFE0000000ULL; - } - else - { - (u64&)res = 0xC7EFFFFFE0000000ULL; - } - } - } - else - { - u64 v = CPU.FPR[frb]; - - if(v == 0ULL) - { - v = 0x7FF0000000000000ULL; - } - else if(v == 0x8000000000000000ULL) - { - v = 0xFFF0000000000000ULL; - } - else if(FPRdouble::IsNaN(CPU.FPR[frb])) - { - v = 0x7FF8000000000000ULL; - } - else if(CPU.FPR[frb] < 0.0) - { - v = 0x8000000000000000ULL; - } - else - { - v = 0ULL; - } - - res = (double&)v; - } - if(CPU.FPR[frb] == 0.0) { CPU.SetFPSCRException(FPSCR_ZX); } - - CPU.FPR[frd] = res; - + CPU.FPR[frd] = static_cast(1.0 / CPU.FPR[frb]); if(rc) UNK("fres.");//CPU.UpdateCR1(CPU.FPR[frd]); } void FMULS(u32 frd, u32 fra, u32 frc, bool rc) @@ -3790,7 +3739,12 @@ private: } void FRSQRTE(u32 frd, u32 frb, bool rc) { - CPU.FPR[frd] = 1.0f / (float)sqrt(CPU.FPR[frb]); + if(CPU.FPR[frb] == 0.0) + { + CPU.SetFPSCRException(FPSCR_ZX); + } + CPU.FPR[frd] = static_cast(1.0 / sqrt(CPU.FPR[frb])); + if(rc) UNK("frsqrte.");//CPU.UpdateCR1(CPU.FPR[frd]); } void FMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { diff --git a/rpcs3/Emu/SysCalls/Modules/sceNp.cpp b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp index 3732beb5f1..e024f0712e 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNp.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp @@ -7,6 +7,37 @@ void sceNp_init(); Module sceNp(0x0016, sceNp_init); +int sceNpInit(u32 mem_size, u32 mem_addr) +{ + sceNp.Log("sceNpInit(mem_size=0x%x, mem_addr=0x%x)", mem_size, mem_addr); + return CELL_OK; +} + +int sceNpTerm() +{ + sceNp.Log("sceNpTerm"); + return CELL_OK; +} + +int sceNpDrmIsAvailable(u32 k_licensee_addr, u32 drm_path_addr) +{ + sceNp.Warning("sceNpDrmIsAvailable(k_licensee_addr=0x%x, drm_path_addr=0x%x)", k_licensee_addr, drm_path_addr); + + wxString k_licensee_str; + wxString drm_path = Memory.ReadString(drm_path_addr); + u8 k_licensee[0x10]; + for(int i = 0; i < 0x10; i++) + { + k_licensee[i] = Memory.Read8(k_licensee_addr + i); + k_licensee_str += wxString::Format("%02x", k_licensee[i]); + } + + sceNp.Warning("sceNpDrmIsAvailable: Found DRM license file at %s", drm_path.c_str()); + sceNp.Warning("sceNpDrmIsAvailable: Using k_licensee 0x%s", k_licensee_str); + + return CELL_OK; +} + int sceNpManagerGetStatus(mem32_t status) { sceNp.Log("sceNpManagerGetStatus(status_addr=0x%x)", status.GetAddr()); @@ -22,5 +53,8 @@ int sceNpManagerGetStatus(mem32_t status) void sceNp_init() { + sceNp.AddFunc(0xbd28fdbf, sceNpInit); + sceNp.AddFunc(0x4885aa18, sceNpTerm); + sceNp.AddFunc(0xad218faf, sceNpDrmIsAvailable); sceNp.AddFunc(0xa7bff757, sceNpManagerGetStatus); } diff --git a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp index 945e925063..ca91624905 100644 --- a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp @@ -167,7 +167,9 @@ void sysPrxForUser_init() sysPrxForUser.AddFunc(0x44265c08, _sys_heap_memalign); sysPrxForUser.AddFunc(0xb257540b, sys_mmapper_allocate_memory); + sysPrxForUser.AddFunc(0x70258515, sys_mmapper_allocate_memory_from_container); sysPrxForUser.AddFunc(0xdc578057, sys_mmapper_map_memory); + sysPrxForUser.AddFunc(0x4643ba6e, sys_mmapper_unmap_memory); sysPrxForUser.AddFunc(0x409ad939, sys_mmapper_free_memory); sysPrxForUser.AddFunc(0x1ed454ce, sys_spu_elf_get_information); diff --git a/rpcs3/Emu/SysCalls/SysCalls.cpp b/rpcs3/Emu/SysCalls/SysCalls.cpp index aad96f9329..f6903a3115 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.cpp +++ b/rpcs3/Emu/SysCalls/SysCalls.cpp @@ -148,13 +148,28 @@ static func_caller* sc_table[1024] = bind_func(sys_vm_get_statistics), //312 (0x138) null_func, null_func, //314 null_func, null_func, null_func, null_func, null_func, //319 - null_func, null_func, null_func, null_func, bind_func(sys_memory_container_create), //324 - bind_func(sys_memory_container_destroy), null_func, null_func, null_func, null_func, //329 - bind_func(sys_mmapper_allocate_address), null_func, null_func, null_func, null_func, //334 - null_func, null_func, null_func, null_func, null_func, //339 - null_func, bind_func(sys_memory_container_create), bind_func(sys_memory_container_destroy), null_func, null_func, //344 - null_func, null_func, null_func, bind_func(sys_memory_allocate), bind_func(sys_memory_free), //349 - null_func, bind_func(sys_memory_get_page_attribute), bind_func(sys_memory_get_user_memory_size), null_func, null_func, //354 + null_func, null_func, null_func, null_func, //323 + bind_func(sys_memory_container_create), //324 + bind_func(sys_memory_container_destroy), //325 + bind_func(sys_mmapper_allocate_fixed_address), //326 + bind_func(sys_mmapper_enable_page_fault_notification), //327 + null_func, null_func, //329 + bind_func(sys_mmapper_allocate_address), //330 + bind_func(sys_mmapper_free_address), //331 + null_func, null_func, null_func, null_func, //335 + bind_func(sys_mmapper_change_address_access_right), //336 + bind_func(sys_mmapper_search_and_map), //337 + null_func, null_func, null_func, //340 + bind_func(sys_memory_container_create), //341 + bind_func(sys_memory_container_destroy), //342 + bind_func(sys_memory_container_get_size), //343 + null_func, null_func, null_func, null_func, //347 + bind_func(sys_memory_allocate), //348 + bind_func(sys_memory_free), //349 + bind_func(sys_memory_allocate_from_container), //350 + bind_func(sys_memory_get_page_attribute), //351 + bind_func(sys_memory_get_user_memory_size), //352 + null_func, null_func, //354 null_func, null_func, null_func, null_func, null_func, //359 null_func, null_func, null_func, null_func, null_func, //364 null_func, null_func, null_func, null_func, null_func, //369 diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index 0b06490c51..64c6646f1b 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -223,16 +223,25 @@ extern void sys_ppu_thread_once(u32 once_ctrl_addr, u32 entry); extern int sys_ppu_thread_get_id(const u32 id_addr); //memory +extern int sys_memory_allocate(u32 size, u32 flags, u32 alloc_addr_addr); +extern int sys_memory_allocate_from_container(u32 size, u32 cid, u32 flags, u32 alloc_addr_addr); +extern int sys_memory_free(u32 start_addr); +extern int sys_memory_get_page_attribute(u32 addr, mem_ptr_t attr); +extern int sys_memory_get_user_memory_size(u32 mem_info_addr); extern int sys_memory_container_create(mem32_t cid, u32 yield_size); extern int sys_memory_container_destroy(u32 cid); -extern int sys_memory_allocate(u32 size, u32 flags, u32 alloc_addr_addr); -extern int sys_memory_free(u32 start_addr); -extern int sys_memory_get_user_memory_size(u32 mem_info_addr); -extern int sys_memory_get_page_attribute(u32 addr, mem_ptr_t a); +extern int sys_memory_container_get_size(u32 mem_info_addr, u32 cid); extern int sys_mmapper_allocate_address(u32 size, u64 flags, u32 alignment, u32 alloc_addr); +extern int sys_mmapper_allocate_fixed_address(); extern int sys_mmapper_allocate_memory(u32 size, u64 flags, mem32_t mem_id); -extern int sys_mmapper_map_memory(u32 start_addr, u32 mem_id, u64 flags); +extern int sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, mem32_t mem_id); +extern int sys_mmapper_change_address_access_right(u32 start_addr, u64 flags); +extern int sys_mmapper_free_address(u32 start_addr); extern int sys_mmapper_free_memory(u32 mem_id); +extern int sys_mmapper_map_memory(u32 start_addr, u32 mem_id, u64 flags); +extern int sys_mmapper_search_and_map(u32 start_addr, u32 mem_id, u64 flags, u32 alloc_addr); +extern int sys_mmapper_unmap_memory(u32 start_addr, u32 mem_id_addr); +extern int sys_mmapper_enable_page_fault_notification(u32 start_addr, u32 q_id); //vm extern int sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, u32 addr); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp index 5c4f5b9761..09e297ab27 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp @@ -3,50 +3,13 @@ #include "SC_Memory.h" SysCallBase sc_mem("memory"); - -int sys_memory_container_create(mem32_t cid, u32 yield_size) -{ - sc_mem.Warning("sys_memory_container_create(cid_addr=0x%x, yield_size=0x%x)", cid.GetAddr(), yield_size); - - if (!cid.IsGood()) - { - return CELL_EFAULT; - } - - yield_size &= ~0xfffff; //round down to 1 MB granularity - - u64 addr = Memory.Alloc(yield_size, 0x100000); //1 MB alignment - - if(!addr) - { - return CELL_ENOMEM; - } - - cid = sc_mem.GetNewId(new MemoryContainerInfo(addr, yield_size)); - sc_mem.Warning("*** memory_container created(addr=0x%llx): id = %d", addr, cid.GetValue()); - return CELL_OK; -} - -int sys_memory_container_destroy(u32 cid) -{ - sc_mem.Warning("sys_memory_container_destroy(cid=%d)", cid); - - MemoryContainerInfo* ct; - - if(!sc_mem.CheckId(cid, ct)) - { - return CELL_ESRCH; - } - - Memory.Free(ct->addr); - Emu.GetIdManager().RemoveID(cid); - return CELL_OK; -} +std::map mmapper_info_map; int sys_memory_allocate(u32 size, u32 flags, u32 alloc_addr_addr) { - //0x30000100; sc_mem.Log("sys_memory_allocate(size=0x%x, flags=0x%x)", size, flags); + + // Check page size. u32 addr; switch(flags) { @@ -63,119 +26,64 @@ int sys_memory_allocate(u32 size, u32 flags, u32 alloc_addr_addr) default: return CELL_EINVAL; } - if(!addr) return CELL_ENOMEM; + if(!addr) + return CELL_ENOMEM; + + // Write back the start address of the allocated area. sc_mem.Log("Memory allocated! [addr: 0x%x, size: 0x%x]", addr, size); Memory.Write32(alloc_addr_addr, addr); return CELL_OK; } +int sys_memory_allocate_from_container(u32 size, u32 cid, u32 flags, u32 alloc_addr_addr) +{ + sc_mem.Log("sys_memory_allocate_from_container(size=0x%x, cid=0x%x, flags=0x%x)", size, cid, flags); + + // Check if this container ID is valid. + MemoryContainerInfo* ct; + if(!sc_mem.CheckId(cid, ct)) + return CELL_ESRCH; + + // Check page size. + switch(flags) + { + case SYS_MEMORY_PAGE_SIZE_1M: + if(size & 0xfffff) return CELL_EALIGN; + ct->addr = Memory.Alloc(size, 0x100000); + break; + + case SYS_MEMORY_PAGE_SIZE_64K: + if(size & 0xffff) return CELL_EALIGN; + ct->addr = Memory.Alloc(size, 0x10000); + break; + + default: return CELL_EINVAL; + } + + // Store the address and size in the container. + if(!ct->addr) + return CELL_ENOMEM; + ct->size = size; + + // Write back the start address of the allocated area. + sc_mem.Log("Memory allocated! [addr: 0x%x, size: 0x%x]", ct->addr, ct->size); + Memory.Write32(alloc_addr_addr, ct->addr); + + return CELL_OK; +} + int sys_memory_free(u32 start_addr) { sc_mem.Log("sys_memory_free(start_addr=0x%x)", start_addr); - if(!Memory.Free(start_addr)) return CELL_EFAULT; + // Release the allocated memory. + if(!Memory.Free(start_addr)) + return CELL_EFAULT; return CELL_OK; } -int sys_mmapper_allocate_address(u32 size, u64 flags, u32 alignment, u32 alloc_addr) -{ - sc_mem.Warning("sys_mmapper_allocate_address(size=0x%x, flags=0x%llx, alignment=0x%x, alloc_addr=0x%x)", size, flags, alignment, alloc_addr); - - if(!Memory.IsGoodAddr(alloc_addr)) return CELL_EFAULT; - - if(!alignment) - alignment = 1; - - u32 addr; - - switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) - { - default: - case SYS_MEMORY_PAGE_SIZE_1M: - if(Memory.AlignAddr(size, alignment) & 0xfffff) return CELL_EALIGN; - addr = Memory.Alloc(size, 0x100000); - break; - - case SYS_MEMORY_PAGE_SIZE_64K: - if(Memory.AlignAddr(size, alignment) & 0xffff) return CELL_EALIGN; - addr = Memory.Alloc(size, 0x10000); - break; - } - - Memory.Write32(alloc_addr, addr); - - return CELL_OK; -} - -int sys_mmapper_allocate_memory(u32 size, u64 flags, mem32_t mem_id) -{ - sc_mem.Warning("sys_mmapper_allocate_memory(size=0x%x, flags=0x%llx, mem_id_addr=0x%x)", size, flags, mem_id.GetAddr()); - - if(!mem_id.IsGood()) return CELL_EFAULT; - - u32 addr; - switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) - { - case SYS_MEMORY_PAGE_SIZE_1M: - if(size & 0xfffff) return CELL_EALIGN; - addr = Memory.Alloc(size, 0x100000); - break; - - case SYS_MEMORY_PAGE_SIZE_64K: - if(size & 0xffff) return CELL_EALIGN; - addr = Memory.Alloc(size, 0x10000); - break; - - default: - return CELL_EINVAL; - } - - if(!addr) - return CELL_ENOMEM; - - mem_id = sc_mem.GetNewId(new mmapper_info(addr, size, flags)); - - return CELL_OK; -} - -int sys_mmapper_map_memory(u32 start_addr, u32 mem_id, u64 flags) -{ - sc_mem.Warning("sys_mmapper_map_memory(start_addr=0x%x, mem_id=0x%x, flags=0x%llx)", start_addr, mem_id, flags); - - mmapper_info* info; - if(!sc_mem.CheckId(mem_id, info)) return CELL_ESRCH; - - if(!Memory.Map(start_addr, info->addr, info->size)) - { - sc_mem.Error("sys_mmapper_map_memory failed!"); - } - - return CELL_OK; -} - -int sys_mmapper_free_memory(u32 mem_id) -{ - sc_mem.Warning("sys_mmapper_free_memory(mem_id=0x%x)", mem_id); - - mmapper_info* info; - if(!sc_mem.CheckId(mem_id, info)) return CELL_ESRCH; - - Memory.Free(info->addr); - return CELL_OK; -} - -int sys_memory_get_user_memory_size(u32 mem_info_addr) -{ - sc_mem.Warning("sys_memory_get_user_memory_size(mem_info_addr=0x%x)", mem_info_addr); - sys_memory_info info; - info.total_user_memory = re(Memory.GetUserMemTotalSize()); - info.available_user_memory = re(Memory.GetUserMemAvailSize()); - Memory.WriteData(mem_info_addr, info); - return CELL_OK; -} - int sys_memory_get_page_attribute(u32 addr, mem_ptr_t attr) { sc_mem.Warning("sys_memory_get_page_attribute(addr=0x%x, attr_addr=0x%x)", addr, attr.GetAddr()); @@ -183,10 +91,335 @@ int sys_memory_get_page_attribute(u32 addr, mem_ptr_t attr) if (!attr.IsGood()) return CELL_EFAULT; + // TODO: Implement per thread page attribute setting. attr->attribute = 0; attr->page_size = 0; attr->access_right = 0; attr->pad = 0; return CELL_OK; -} \ No newline at end of file +} + +int sys_memory_get_user_memory_size(u32 mem_info_addr) +{ + sc_mem.Warning("sys_memory_get_user_memory_size(mem_info_addr=0x%x)", mem_info_addr); + + // Fetch the user memory available. + sys_memory_info info; + info.total_user_memory = re(Memory.GetUserMemTotalSize()); + info.available_user_memory = re(Memory.GetUserMemAvailSize()); + + Memory.WriteData(mem_info_addr, info); + + return CELL_OK; +} + +int sys_memory_container_create(mem32_t cid, u32 yield_size) +{ + sc_mem.Warning("sys_memory_container_create(cid_addr=0x%x, yield_size=0x%x)", cid.GetAddr(), yield_size); + + if (!cid.IsGood()) + return CELL_EFAULT; + + yield_size &= ~0xfffff; //round down to 1 MB granularity + u64 addr = Memory.Alloc(yield_size, 0x100000); //1 MB alignment + + if(!addr) + return CELL_ENOMEM; + + // Wrap the allocated memory in a memory container. + MemoryContainerInfo *ct = new MemoryContainerInfo(addr, yield_size); + cid = sc_mem.GetNewId(ct); + + sc_mem.Warning("*** memory_container created(addr=0x%llx): id = %d", addr, cid.GetValue()); + + return CELL_OK; +} + +int sys_memory_container_destroy(u32 cid) +{ + sc_mem.Warning("sys_memory_container_destroy(cid=%d)", cid); + + // Check if this container ID is valid. + MemoryContainerInfo* ct; + if(!sc_mem.CheckId(cid, ct)) + return CELL_ESRCH; + + // Release the allocated memory and remove the ID. + Memory.Free(ct->addr); + Emu.GetIdManager().RemoveID(cid); + + return CELL_OK; +} + +int sys_memory_container_get_size(u32 mem_info_addr, u32 cid) +{ + sc_mem.Warning("sys_memory_container_get_size(mem_info_addr=0x%x, cid=%d)", mem_info_addr, cid); + + // Check if this container ID is valid. + MemoryContainerInfo* ct; + if(!sc_mem.CheckId(cid, ct)) + return CELL_ESRCH; + + // HACK: Return all memory. + sys_memory_info info; + info.total_user_memory = re(ct->size); + info.available_user_memory = re(ct->size); + + Memory.WriteData(mem_info_addr, info); + + return CELL_OK; +} + +int sys_mmapper_allocate_address(u32 size, u64 flags, u32 alignment, u32 alloc_addr) +{ + sc_mem.Warning("sys_mmapper_allocate_address(size=0x%x, flags=0x%llx, alignment=0x%x, alloc_addr=0x%x)", + size, flags, alignment, alloc_addr); + + if(!Memory.IsGoodAddr(alloc_addr)) + return CELL_EFAULT; + + // Check for valid alignment. + if(alignment > 0x80000000) + return CELL_EALIGN; + + // Check page size. + u32 addr; + switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) + { + default: + case SYS_MEMORY_PAGE_SIZE_1M: + if(Memory.AlignAddr(size, alignment) & 0xfffff) + return CELL_EALIGN; + addr = Memory.Alloc(size, 0x100000); + break; + + case SYS_MEMORY_PAGE_SIZE_64K: + if(Memory.AlignAddr(size, alignment) & 0xffff) + return CELL_EALIGN; + addr = Memory.Alloc(size, 0x10000); + break; + } + + // Write back the start address of the allocated area. + Memory.Write32(alloc_addr, addr); + + return CELL_OK; +} + +int sys_mmapper_allocate_fixed_address() +{ + sc_mem.Warning("sys_mmapper_allocate_fixed_address"); + + // Allocate a fixed size from user memory. + if (!Memory.Alloc(SYS_MMAPPER_FIXED_SIZE, 0x100000)) + return CELL_EEXIST; + + return CELL_OK; +} + +int sys_mmapper_allocate_memory(u32 size, u64 flags, mem32_t mem_id) +{ + sc_mem.Warning("sys_mmapper_allocate_memory(size=0x%x, flags=0x%llx, mem_id_addr=0x%x)", size, flags, mem_id.GetAddr()); + + if(!mem_id.IsGood()) + return CELL_EFAULT; + + // Check page granularity. + u32 addr; + switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) + { + case SYS_MEMORY_PAGE_SIZE_1M: + if(size & 0xfffff) + return CELL_EALIGN; + addr = Memory.Alloc(size, 0x100000); + break; + + case SYS_MEMORY_PAGE_SIZE_64K: + if(size & 0xffff) + return CELL_EALIGN; + addr = Memory.Alloc(size, 0x10000); + break; + + default: + return CELL_EINVAL; + } + + if(!addr) + return CELL_ENOMEM; + + // Generate a new mem ID. + mem_id = sc_mem.GetNewId(new mmapper_info(addr, size, flags)); + + return CELL_OK; +} + +int sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, mem32_t mem_id) +{ + sc_mem.Warning("sys_mmapper_allocate_memory_from_container(size=0x%x, cid=%d, flags=0x%llx, mem_id_addr=0x%x)", + size, cid, flags, mem_id.GetAddr()); + + if(!mem_id.IsGood()) + return CELL_EFAULT; + + // Check if this container ID is valid. + MemoryContainerInfo* ct; + if(!sc_mem.CheckId(cid, ct)) + return CELL_ESRCH; + + // Check page granularity. + switch(flags & (SYS_MEMORY_PAGE_SIZE_1M | SYS_MEMORY_PAGE_SIZE_64K)) + { + case SYS_MEMORY_PAGE_SIZE_1M: + if(size & 0xfffff) + return CELL_EALIGN; + ct->addr = Memory.Alloc(size, 0x100000); + break; + + case SYS_MEMORY_PAGE_SIZE_64K: + if(size & 0xffff) + return CELL_EALIGN; + ct->addr = Memory.Alloc(size, 0x10000); + break; + + default: + return CELL_EINVAL; + } + + if(!ct->addr) + return CELL_ENOMEM; + ct->size = size; + + // Generate a new mem ID. + mem_id = sc_mem.GetNewId(new mmapper_info(ct->addr, ct->size, flags)); + + return CELL_OK; +} + +int sys_mmapper_change_address_access_right(u32 start_addr, u64 flags) +{ + sc_mem.Warning("sys_mmapper_change_address_access_right(start_addr=0x%x, flags=0x%llx)", start_addr, flags); + + if (!Memory.IsGoodAddr(start_addr)) + return CELL_EINVAL; + + // TODO + + return CELL_OK; +} + +int sys_mmapper_free_address(u32 start_addr) +{ + sc_mem.Warning("sys_mmapper_free_address(start_addr=0x%x)", start_addr); + + if(!Memory.IsGoodAddr(start_addr)) + return CELL_EINVAL; + + // Free the address. + Memory.Free(start_addr); + return CELL_OK; +} + +int sys_mmapper_free_memory(u32 mem_id) +{ + sc_mem.Warning("sys_mmapper_free_memory(mem_id=0x%x)", mem_id); + + // Check if this mem ID is valid. + mmapper_info* info; + if(!sc_mem.CheckId(mem_id, info)) + return CELL_ESRCH; + + // Release the allocated memory and remove the ID. + Memory.Free(info->addr); + Emu.GetIdManager().RemoveID(mem_id); + + return CELL_OK; +} + +int sys_mmapper_map_memory(u32 start_addr, u32 mem_id, u64 flags) +{ + sc_mem.Warning("sys_mmapper_map_memory(start_addr=0x%x, mem_id=0x%x, flags=0x%llx)", start_addr, mem_id, flags); + + // Check if this mem ID is valid. + mmapper_info* info; + if(!sc_mem.CheckId(mem_id, info)) + return CELL_ESRCH; + + // Map the memory into the process address. + if(!Memory.Map(start_addr, info->addr, info->size)) + sc_mem.Error("sys_mmapper_map_memory failed!"); + + // Keep track of mapped addresses. + mmapper_info_map[mem_id] = start_addr; + + return CELL_OK; +} + +int sys_mmapper_search_and_map(u32 start_addr, u32 mem_id, u64 flags, u32 alloc_addr) +{ + sc_mem.Warning("sys_mmapper_search_and_map(start_addr=0x%x, mem_id=0x%x, flags=0x%llx, alloc_addr=0x%x)", + start_addr, mem_id, flags, alloc_addr); + + if(!Memory.IsGoodAddr(alloc_addr)) + return CELL_EFAULT; + + // Check if this mem ID is valid. + mmapper_info* info; + if(!sc_mem.CheckId(mem_id, info)) + return CELL_ESRCH; + + // Search for a mappable address. + u32 addr; + bool found; + for (int i = 0; i < SYS_MMAPPER_FIXED_SIZE; i += 0x100000) + { + addr = start_addr + i; + found = Memory.Map(addr, info->addr, info->size); + if(found) + { + sc_mem.Warning("Found and mapped address 0x%x", addr); + break; + } + } + + // Check if the address is valid. + if (!Memory.IsGoodAddr(addr) || !found) + return CELL_ENOMEM; + + // Write back the start address of the allocated area. + Memory.Write32(alloc_addr, addr); + + // Keep track of mapped addresses. + mmapper_info_map[mem_id] = addr; + + return CELL_OK; +} + +int sys_mmapper_unmap_memory(u32 start_addr, u32 mem_id_addr) +{ + sc_mem.Warning("sys_mmapper_unmap_memory(start_addr=0x%x, mem_id_addr=0x%x)", start_addr, mem_id_addr); + + if (!Memory.IsGoodAddr(start_addr)) + return CELL_EINVAL; + + if (!Memory.IsGoodAddr(mem_id_addr)) + return CELL_EFAULT; + + // Write back the mem ID of the unmapped area. + u32 mem_id = mmapper_info_map.find(start_addr)->first; + Memory.Write32(mem_id_addr, mem_id); + + return CELL_OK; +} + +int sys_mmapper_enable_page_fault_notification(u32 start_addr, u32 q_id) +{ + sc_mem.Warning("sys_mmapper_enable_page_fault_notification(start_addr=0x%x, q_id=0x%x)", start_addr, q_id); + + if (!Memory.IsGoodAddr(start_addr)) + return CELL_EINVAL; + + // TODO + + return CELL_OK; +} diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Memory.h b/rpcs3/Emu/SysCalls/lv2/SC_Memory.h index 3f6b7e0dd4..5a09b05016 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Memory.h +++ b/rpcs3/Emu/SysCalls/lv2/SC_Memory.h @@ -1,53 +1,71 @@ -#pragma once - -#define SYS_MEMORY_CONTAINER_ID_INVALID 0xFFFFFFFF +#pragma once + +#define SYS_MEMORY_CONTAINER_ID_INVALID 0xFFFFFFFF +#define SYS_MEMORY_ACCESS_RIGHT_NONE 0x00000000000000F0ULL +#define SYS_MEMORY_ACCESS_RIGHT_PPU_THREAD 0x0000000000000008ULL +#define SYS_MEMORY_ACCESS_RIGHT_HANDLER 0x0000000000000004ULL +#define SYS_MEMORY_ACCESS_RIGHT_SPU_THREAD 0x0000000000000002ULL +#define SYS_MEMORY_ACCESS_RIGHT_SPU_RAW 0x0000000000000001ULL +#define SYS_MEMORY_ATTR_READ_ONLY 0x0000000000080000ULL +#define SYS_MEMORY_ATTR_READ_WRITE 0x0000000000040000ULL +#define SYS_MMAPPER_FIXED_ADDR 0xB0000000 +#define SYS_MMAPPER_FIXED_SIZE 0x10000000 #define SYS_VM_TEST_INVALID 0x0000ULL #define SYS_VM_TEST_UNUSED 0x0001ULL #define SYS_VM_TEST_ALLOCATED 0x0002ULL -#define SYS_VM_TEST_STORED 0x0004ULL - -enum -{ - SYS_MEMORY_PAGE_SIZE_1M = 0x400, - SYS_MEMORY_PAGE_SIZE_64K = 0x200, -}; - -struct MemoryContainerInfo -{ - u64 addr; - u32 size; - - MemoryContainerInfo(u64 addr, u32 size) - : addr(addr) - , size(size) - { - } -}; - -struct mmapper_info -{ - u64 addr; - u32 size; - u32 flags; - - mmapper_info(u64 _addr, u32 _size, u32 _flags) - : addr(_addr) - , size(_size) - , flags(_flags) - { - } - - mmapper_info() - { - } -}; - -struct sys_memory_info -{ - u32 total_user_memory; - u32 available_user_memory; -}; - +#define SYS_VM_TEST_STORED 0x0004ULL + +enum +{ + SYS_MEMORY_PAGE_SIZE_1M = 0x400, + SYS_MEMORY_PAGE_SIZE_64K = 0x200, +}; + +struct sys_memory_info +{ + u32 total_user_memory; + u32 available_user_memory; +}; + + +struct sys_page_attr_t +{ + u64 attribute; + u64 access_right; + u32 page_size; + u32 pad; +}; + +struct MemoryContainerInfo +{ + u64 addr; + u32 size; + + MemoryContainerInfo(u64 addr, u32 size) + : addr(addr) + , size(size) + { + } +}; + +struct mmapper_info +{ + u64 addr; + u32 size; + u32 flags; + + mmapper_info(u64 _addr, u32 _size, u32 _flags) + : addr(_addr) + , size(_size) + , flags(_flags) + { + } + + mmapper_info() + { + } +}; + struct sys_vm_statistics { u64 vm_crash_ppu; u64 vm_crash_spu; @@ -56,12 +74,4 @@ struct sys_vm_statistics { u32 physical_mem_size; u32 physical_mem_used; u64 timestamp; -}; - -struct sys_page_attr_t -{ - u64 attribute; - u64 access_right; - u32 page_size; - u32 pad; }; \ No newline at end of file From 0a35c4f2c4d01eab7036ee41f5bcb0d0d19b0611 Mon Sep 17 00:00:00 2001 From: Hykem Date: Sat, 15 Mar 2014 20:37:29 +0000 Subject: [PATCH 20/27] Added missing change. --- rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp index 09e297ab27..32ac3b7bf1 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "Emu/SysCalls/SysCalls.h" #include "SC_Memory.h" +#include SysCallBase sc_mem("memory"); std::map mmapper_info_map; From a00f47b5e4e62b696e2ad2a86dde624760087521 Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 16 Mar 2014 22:49:05 +1000 Subject: [PATCH 21/27] Linux build fix --- rpcs3/Emu/SysCalls/Modules/sceNp.cpp | 4 ++-- rpcs3/Emu/SysCalls/Modules/sys_net.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/SysCalls/Modules/sceNp.cpp b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp index e024f0712e..2846199ff8 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNp.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp @@ -32,8 +32,8 @@ int sceNpDrmIsAvailable(u32 k_licensee_addr, u32 drm_path_addr) k_licensee_str += wxString::Format("%02x", k_licensee[i]); } - sceNp.Warning("sceNpDrmIsAvailable: Found DRM license file at %s", drm_path.c_str()); - sceNp.Warning("sceNpDrmIsAvailable: Using k_licensee 0x%s", k_licensee_str); + sceNp.Warning("sceNpDrmIsAvailable: Found DRM license file at %s", drm_path.wx_str()); + sceNp.Warning("sceNpDrmIsAvailable: Using k_licensee 0x%s", k_licensee_str.wx_str()); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp index aaeb73cf19..754d7e49eb 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp @@ -6,7 +6,7 @@ #ifdef _WIN32 #include -#elif +#else #include #include #endif @@ -296,7 +296,11 @@ int sys_net_socket(s32 family, s32 type, s32 protocol) int sys_net_socketclose(s32 s) { sys_net.Warning("socket(s=%d)", s); +#ifdef _WIN32 int ret = closesocket(s); +#else + int ret = close(s); +#endif g_lastError = getLastError(); return ret; } @@ -321,8 +325,6 @@ int sys_net_initialize_network_ex(mem_ptr_t param) WSADATA wsaData; WORD wVersionRequested = MAKEWORD(1,1); WSAStartup(wVersionRequested, &wsaData); -#elif - // TODO ? #endif return CELL_OK; } @@ -454,8 +456,6 @@ int sys_net_finalize_network() g_lastError.SetAddr(NULL); #ifdef _WIN32 WSACleanup(); -#else - // TODO ? #endif return CELL_OK; } @@ -539,4 +539,4 @@ void sys_net_init() sys_net.AddFunc(0xc9157d30, _sys_net_h_errno_loc); sys_net.AddFunc(0xe2434507, sys_net_set_netemu_test_param); sys_net.AddFunc(0xfdb8f926, sys_net_free_thread_context); -} \ No newline at end of file +} From 6968137bbcf58789a8ce2354fe47c57fa2bdc2db Mon Sep 17 00:00:00 2001 From: Sacha Date: Mon, 17 Mar 2014 23:41:15 +1000 Subject: [PATCH 22/27] Fix slashes for Linux --- rpcs3/Emu/FS/VFS.cpp | 13 ++++++------- rpcs3/Emu/FS/vfsDevice.cpp | 10 +++++----- rpcs3/Emu/FS/vfsLocalFile.cpp | 4 ++-- rpcs3/Emu/GS/GL/GLGSRender.h | 2 +- rpcs3/Emu/HDD/HDD.h | 2 +- rpcs3/Emu/System.cpp | 8 ++++---- rpcs3/Gui/MainFrame.cpp | 2 +- 7 files changed, 20 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/FS/VFS.cpp b/rpcs3/Emu/FS/VFS.cpp index 48174ebe77..fc2c69f7e5 100644 --- a/rpcs3/Emu/FS/VFS.cpp +++ b/rpcs3/Emu/FS/VFS.cpp @@ -226,7 +226,6 @@ vfsDevice* VFS::GetDevice(const wxString& ps3_path, wxString& path) const } if(max_i < 0) return nullptr; - path = vfsDevice::GetWinPath(m_devices[max_i].GetLocalPath(), ps3_path(max_eq, ps3_path.Len() - max_eq)); return &m_devices[max_i]; } @@ -303,27 +302,27 @@ void VFS::SaveLoadDevices(Array& res, bool is_load) { int idx; idx = res.Move(new VFSManagerEntry()); - res[idx].path = "$(EmulatorDir)\\dev_hdd0\\"; + res[idx].path = "$(EmulatorDir)/dev_hdd0/"; res[idx].mount = "/dev_hdd0/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); - res[idx].path = "$(EmulatorDir)\\dev_hdd1\\"; + res[idx].path = "$(EmulatorDir)/dev_hdd1/"; res[idx].mount = "/dev_hdd1/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); - res[idx].path = "$(EmulatorDir)\\dev_flash\\"; + res[idx].path = "$(EmulatorDir)/dev_flash/"; res[idx].mount = "/dev_flash/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); - res[idx].path = "$(EmulatorDir)\\dev_usb000\\"; + res[idx].path = "$(EmulatorDir)/dev_usb000/"; res[idx].mount = "/dev_usb000/"; res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); - res[idx].path = "$(EmulatorDir)\\dev_usb000\\"; + res[idx].path = "$(EmulatorDir)/dev_usb000/"; res[idx].mount = "/dev_usb/"; res[idx].device = vfsDevice_LocalFile; @@ -333,7 +332,7 @@ void VFS::SaveLoadDevices(Array& res, bool is_load) res[idx].device = vfsDevice_LocalFile; idx = res.Move(new VFSManagerEntry()); - res[idx].path = "$(GameDir)\\..\\"; + res[idx].path = "$(GameDir)/../"; res[idx].mount = "/dev_bdvd/"; res[idx].device = vfsDevice_LocalFile; diff --git a/rpcs3/Emu/FS/vfsDevice.cpp b/rpcs3/Emu/FS/vfsDevice.cpp index df79fcdfb4..bc1014607b 100644 --- a/rpcs3/Emu/FS/vfsDevice.cpp +++ b/rpcs3/Emu/FS/vfsDevice.cpp @@ -48,8 +48,8 @@ u32 vfsDevice::CmpLocalPath(const wxString& local_path) wxFileName path0(m_local_path); path0.Normalize(); - wxArrayString arr0 = wxSplit(path0.GetFullPath(), '\\'); - wxArrayString arr1 = wxSplit(local_path, '\\'); + wxArrayString arr0 = wxSplit(path0.GetFullPath(), '/'); + wxArrayString arr1 = wxSplit(local_path, '/'); const u32 lim = min(arr0.GetCount(), arr1.GetCount()); u32 ret = 0; @@ -168,7 +168,7 @@ wxString vfsDevice::GetWinPath(const wxString& p, bool is_dir) { if(!is_ls) { - ret += '\\'; + ret += '/'; is_ls = true; } @@ -179,7 +179,7 @@ wxString vfsDevice::GetWinPath(const wxString& p, bool is_dir) ret += p[i]; } - if(is_dir && ret[ret.Len() - 1] != '\\') ret += '\\'; + if(is_dir && ret[ret.Len() - 1] != '/') ret += '/'; wxFileName res(ret); res.Normalize(); @@ -191,7 +191,7 @@ wxString vfsDevice::GetWinPath(const wxString& l, const wxString& r) if(l.IsEmpty()) return GetWinPath(r, false); if(r.IsEmpty()) return GetWinPath(l); - return GetWinPath(l + '\\' + r, false); + return GetWinPath(l + '/' + r, false); } wxString vfsDevice::GetPs3Path(const wxString& p, bool is_dir) diff --git a/rpcs3/Emu/FS/vfsLocalFile.cpp b/rpcs3/Emu/FS/vfsLocalFile.cpp index 3746f94f41..ef953b4f49 100644 --- a/rpcs3/Emu/FS/vfsLocalFile.cpp +++ b/rpcs3/Emu/FS/vfsLocalFile.cpp @@ -56,7 +56,7 @@ bool vfsLocalFile::Create(const wxString& path) for(uint p=1; p < path.Len() && path[p] != '\0' ; p++) { for(; p < path.Len() && path[p] != '\0'; p++) - if(path[p] == '\\') break; + if(path[p] == '/') break; if(p == path.Len() || path[p] == '\0') break; @@ -70,7 +70,7 @@ bool vfsLocalFile::Create(const wxString& path) } //create file - if(path(path.Len() - 1, 1) != '\\' && !wxFileExists(path)) + if(path(path.Len() - 1, 1) != '/' && !wxFileExists(path)) { wxFile f; return f.Create(path); diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index 4bd83f26e0..3f8dc8ac39 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -302,7 +302,7 @@ public: void Save(RSXTexture& tex) { static const wxString& dir_path = "textures"; - static const wxString& file_fmt = dir_path + "\\" + "tex[%d].png"; + static const wxString& file_fmt = dir_path + "/" + "tex[%d].png"; if(!wxDirExists(dir_path)) wxMkdir(dir_path); diff --git a/rpcs3/Emu/HDD/HDD.h b/rpcs3/Emu/HDD/HDD.h index ed3650ed54..0535a018c0 100644 --- a/rpcs3/Emu/HDD/HDD.h +++ b/rpcs3/Emu/HDD/HDD.h @@ -695,7 +695,7 @@ public: do { - if(s[pos] == '\\' || s[pos] == '\0') + if(s[pos] == '/' || s[pos] == '\0') { if(file_pos != -1) { diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 7c92cb7e3d..9e73da3995 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -141,7 +141,7 @@ void Emulator::Load() m_path = elf_path; } - ConLog.Write("Loading '%s'...", m_path.wx_str()); + ConLog.Write("Loading '%s'...", m_path.ToStdString().c_str()); GetInfo().Reset(); m_vfs.Init(m_path); @@ -149,7 +149,7 @@ void Emulator::Load() ConLog.Write("Mount info:"); for(uint i=0; i %s", m_vfs.m_devices[i].GetPs3Path().wx_str(), m_vfs.m_devices[i].GetLocalPath().wx_str()); + ConLog.Write("%s -> %s", m_vfs.m_devices[i].GetPs3Path().ToStdString().c_str(), m_vfs.m_devices[i].GetLocalPath().ToStdString().c_str()); } ConLog.SkipLn(); @@ -162,7 +162,7 @@ void Emulator::Load() if(!f.IsOpened()) { - ConLog.Error("Elf not found! (%s - %s)", m_path.wx_str(), m_elf_path.wx_str()); + ConLog.Error("Elf not found! (%s - %s)", m_path.ToStdString().c_str(), m_elf_path.ToStdString().c_str()); return; } @@ -441,7 +441,7 @@ void Emulator::LoadPoints(const std::string& path) if(version != bpdb_version || (sizeof(u16) + break_count * sizeof(u64) + sizeof(u32) + marked_count * sizeof(u64) + sizeof(u32)) != length) { - ConLog.Error("'%s' is broken", wxString(path).wx_str()); + ConLog.Error("'%s' is broken", path.c_str()); return; } diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index fc6ac9f582..80941fbaf8 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -202,7 +202,7 @@ void MainFrame::BootGame(wxCommandEvent& WXUNUSED(event)) } else { - ConLog.Error("Ps3 executable not found in selected folder (%s)", ctrl.GetPath().wx_str()); + ConLog.Error("Ps3 executable not found in selected folder (%s)", ctrl.GetPath().ToStdString().c_str()); } } From cf4501fe41685a14d29eca99c6e9c10b3262c640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Mon, 17 Mar 2014 20:34:19 +0100 Subject: [PATCH 23/27] cellGame, cellSysutil and TRP installer improved * TRP Loader and sceNpTrophyRegisterContext improved. * cellSysutil constants moved to cellSysutil.h * cellGameBootCheck bug fixed that makes size->hddFreeSizeKB be 0. * Added system language selector (this is *not* RPCS3's language). cellSysutilGetSystemParamInt(0x111) will return the selected language. NOTE: The problems caused by the last commit (pull request #104 merged) are not yet fixed. --- rpcs3/Emu/SysCalls/Modules/cellGame.cpp | 17 ++- rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp | 142 +-------------------- rpcs3/Emu/SysCalls/Modules/cellSysutil.h | 142 +++++++++++++++++++++ rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp | 38 ++++-- rpcs3/Gui/MainFrame.cpp | 31 +++++ rpcs3/Ini.h | 6 + rpcs3/Loader/TRP.cpp | 50 +++++++- rpcs3/Loader/TRP.h | 6 + 8 files changed, 270 insertions(+), 162 deletions(-) create mode 100644 rpcs3/Emu/SysCalls/Modules/cellSysutil.h diff --git a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp index 1b3ad08eae..2f0539052f 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp @@ -116,14 +116,10 @@ int cellGameBootCheck(mem32_t type, mem32_t attributes, mem_ptr_thddFreeSizeKB may be 0."); return CELL_GAME_ERROR_PARAM; - - // TODO: Locate the PARAM.SFO. The following path may be wrong. - vfsFile f("/app_home/PARAM.SFO"); - PSFLoader psf(f); - if(!psf.Load(false)) - return CELL_GAME_ERROR_FAILURE; - wxString dir = psf.m_info.serial(0,4) + psf.m_info.serial(5,5); + } // TODO: Only works for HDD games type = CELL_GAME_GAMETYPE_HDD; @@ -131,6 +127,13 @@ int cellGameBootCheck(mem32_t type, mem32_t attributes, mem_ptr_thddFreeSizeKB = 40000000; //40 GB, TODO: Use the free space of the computer's HDD where RPCS3 is being run. size->sizeKB = CELL_GAME_SIZEKB_NOTCALC; size->sysSizeKB = 0; + + // TODO: Locate the PARAM.SFO. The following path may be wrong. + vfsFile f("/app_home/PARAM.SFO"); + PSFLoader psf(f); + if(!psf.Load(false)) + return CELL_GAME_ERROR_FAILURE; + wxString dir = psf.m_info.serial(0,4) + psf.m_info.serial(5,5); Memory.WriteString(dirName.GetAddr(), dir); return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index 033dec04c5..d984f910c7 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -3,145 +3,7 @@ #include "Emu/SysCalls/SC_FUNC.h" #include "Emu/Audio/sysutil_audio.h" -// Parameter IDs -enum -{ - //Integers - CELL_SYSUTIL_SYSTEMPARAM_ID_LANG = 0x0111, - CELL_SYSUTIL_SYSTEMPARAM_ID_ENTER_BUTTON_ASSIGN = 0x0112, - CELL_SYSUTIL_SYSTEMPARAM_ID_DATE_FORMAT = 0x0114, - CELL_SYSUTIL_SYSTEMPARAM_ID_TIME_FORMAT = 0x0115, - CELL_SYSUTIL_SYSTEMPARAM_ID_TIMEZONE = 0x0116, - CELL_SYSUTIL_SYSTEMPARAM_ID_SUMMERTIME = 0x0117, - CELL_SYSUTIL_SYSTEMPARAM_ID_GAME_PARENTAL_LEVEL = 0x0121, - CELL_SYSUTIL_SYSTEMPARAM_ID_GAME_PARENTAL_LEVEL0_RESTRICT = 0x0123, - CELL_SYSUTIL_SYSTEMPARAM_ID_CURRENT_USER_HAS_NP_ACCOUNT = 0x0141, - CELL_SYSUTIL_SYSTEMPARAM_ID_CAMERA_PLFREQ = 0x0151, - CELL_SYSUTIL_SYSTEMPARAM_ID_PAD_RUMBLE = 0x0152, - CELL_SYSUTIL_SYSTEMPARAM_ID_KEYBOARD_TYPE = 0x0153, - CELL_SYSUTIL_SYSTEMPARAM_ID_JAPANESE_KEYBOARD_ENTRY_METHOD = 0x0154, - CELL_SYSUTIL_SYSTEMPARAM_ID_CHINESE_KEYBOARD_ENTRY_METHOD = 0x0155, - CELL_SYSUTIL_SYSTEMPARAM_ID_PAD_AUTOOFF = 0x0156, - - //Strings - CELL_SYSUTIL_SYSTEMPARAM_ID_NICKNAME = 0x113, - CELL_SYSUTIL_SYSTEMPARAM_ID_CURRENT_USERNAME = 0x131, -}; - -enum -{ - CELL_SYSUTIL_LANG_JAPANESE = 0, - CELL_SYSUTIL_LANG_ENGLISH_US = 1, - CELL_SYSUTIL_LANG_FRENCH = 2, - CELL_SYSUTIL_LANG_SPANISH = 3, - CELL_SYSUTIL_LANG_GERMAN = 4, - CELL_SYSUTIL_LANG_ITALIAN = 5, - CELL_SYSUTIL_LANG_DUTCH = 6, - CELL_SYSUTIL_LANG_PORTUGUESE_PT = 7, - CELL_SYSUTIL_LANG_RUSSIAN = 8, - CELL_SYSUTIL_LANG_KOREAN = 9, - CELL_SYSUTIL_LANG_CHINESE_T = 10, - CELL_SYSUTIL_LANG_CHINESE_S = 11, - CELL_SYSUTIL_LANG_FINNISH = 12, - CELL_SYSUTIL_LANG_SWEDISH = 13, - CELL_SYSUTIL_LANG_DANISH = 14, - CELL_SYSUTIL_LANG_NORWEGIAN = 15, - CELL_SYSUTIL_LANG_POLISH = 16, - CELL_SYSUTIL_LANG_PORTUGUESE_BR = 17, - CELL_SYSUTIL_LANG_ENGLISH_GB = 18, -}; - -enum -{ - CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CIRCLE = 0, - CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CROSS = 1, -}; - -enum -{ - CELL_SYSUTIL_DATE_FMT_YYYYMMDD = 0, - CELL_SYSUTIL_DATE_FMT_DDMMYYYY = 1, - CELL_SYSUTIL_DATE_FMT_MMDDYYYY = 2, -}; - -enum -{ - CELL_SYSUTIL_TIME_FMT_CLOCK12 = 0, - CELL_SYSUTIL_TIME_FMT_CLOCK24 = 1, -}; - -enum -{ - CELL_SYSUTIL_GAME_PARENTAL_OFF = 0, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL01 = 1, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL02 = 2, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL03 = 3, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL04 = 4, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL05 = 5, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL06 = 6, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL07 = 7, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL08 = 8, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL09 = 9, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL10 = 10, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL11 = 11, -}; - -enum -{ - CELL_SYSUTIL_GAME_PARENTAL_LEVEL0_RESTRICT_OFF = 0, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL0_RESTRICT_ON = 1, -}; - -enum -{ - CELL_SYSUTIL_CAMERA_PLFREQ_DISABLED = 0, - CELL_SYSUTIL_CAMERA_PLFREQ_50HZ = 1, - CELL_SYSUTIL_CAMERA_PLFREQ_60HZ = 2, - CELL_SYSUTIL_CAMERA_PLFREQ_DEVCIE_DEPEND = 4, -}; - -enum -{ - CELL_SYSUTIL_PAD_RUMBLE_OFF = 0, - CELL_SYSUTIL_PAD_RUMBLE_ON = 1, -}; - - -enum -{ - CELL_MSGDIALOG_BUTTON_NONE = -1, - CELL_MSGDIALOG_BUTTON_INVALID = 0, - CELL_MSGDIALOG_BUTTON_OK = 1, - CELL_MSGDIALOG_BUTTON_YES = 1, - CELL_MSGDIALOG_BUTTON_NO = 2, - CELL_MSGDIALOG_BUTTON_ESCAPE = 3, -}; - -enum{ - CELL_SYSCACHE_RET_OK_CLEARED = 0, - CELL_SYSCACHE_RET_OK_RELAYED = 1, - - CELL_SYSCACHE_ID_SIZE = 32, - CELL_SYSCACHE_PATH_MAX = 1055, - - CELL_SYSCACHE_ERROR_ACCESS_ERROR = 0x8002bc01,//I don't think we need this - CELL_SYSCACHE_ERROR_INTERNAL = 0x8002bc02,//not really useful, if we run out of HD space sysfs should handle that - - CELL_SYSCACHE_ERROR_PARAM = 0x8002bc03, - CELL_SYSCACHE_ERROR_NOTMOUNTED = 0x8002bc04,//we don't really need to simulate the mounting, so this is probably useless -}; - -enum CellMsgDialogType -{ - CELL_MSGDIALOG_DIALOG_TYPE_ERROR = 0x00000000, - CELL_MSGDIALOG_DIALOG_TYPE_NORMAL = 0x00000001, - - CELL_MSGDIALOG_BUTTON_TYPE_NONE = 0x00000000, - CELL_MSGDIALOG_BUTTON_TYPE_YESNO = 0x00000010, - - CELL_MSGDIALOG_DEFAULT_CURSOR_YES = 0x00000000, - CELL_MSGDIALOG_DEFAULT_CURSOR_NO = 0x00000100, -}; +#include "cellSysutil.h" typedef void (*CellMsgDialogCallback)(int buttonType, mem_ptr_t userData); @@ -161,7 +23,7 @@ int cellSysutilGetSystemParamInt(int id, mem32_t value) { case CELL_SYSUTIL_SYSTEMPARAM_ID_LANG: cellSysutil.Warning("cellSysutilGetSystemParamInt: CELL_SYSUTIL_SYSTEMPARAM_ID_LANG"); - value = CELL_SYSUTIL_LANG_ENGLISH_US; + value = Ini.SysLanguage.GetValue(); break; case CELL_SYSUTIL_SYSTEMPARAM_ID_ENTER_BUTTON_ASSIGN: diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.h b/rpcs3/Emu/SysCalls/Modules/cellSysutil.h new file mode 100644 index 0000000000..62860307cd --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.h @@ -0,0 +1,142 @@ +#pragma once + +// Parameter IDs +enum +{ + // Integers + CELL_SYSUTIL_SYSTEMPARAM_ID_LANG = 0x0111, + CELL_SYSUTIL_SYSTEMPARAM_ID_ENTER_BUTTON_ASSIGN = 0x0112, + CELL_SYSUTIL_SYSTEMPARAM_ID_DATE_FORMAT = 0x0114, + CELL_SYSUTIL_SYSTEMPARAM_ID_TIME_FORMAT = 0x0115, + CELL_SYSUTIL_SYSTEMPARAM_ID_TIMEZONE = 0x0116, + CELL_SYSUTIL_SYSTEMPARAM_ID_SUMMERTIME = 0x0117, + CELL_SYSUTIL_SYSTEMPARAM_ID_GAME_PARENTAL_LEVEL = 0x0121, + CELL_SYSUTIL_SYSTEMPARAM_ID_GAME_PARENTAL_LEVEL0_RESTRICT = 0x0123, + CELL_SYSUTIL_SYSTEMPARAM_ID_CURRENT_USER_HAS_NP_ACCOUNT = 0x0141, + CELL_SYSUTIL_SYSTEMPARAM_ID_CAMERA_PLFREQ = 0x0151, + CELL_SYSUTIL_SYSTEMPARAM_ID_PAD_RUMBLE = 0x0152, + CELL_SYSUTIL_SYSTEMPARAM_ID_KEYBOARD_TYPE = 0x0153, + CELL_SYSUTIL_SYSTEMPARAM_ID_JAPANESE_KEYBOARD_ENTRY_METHOD = 0x0154, + CELL_SYSUTIL_SYSTEMPARAM_ID_CHINESE_KEYBOARD_ENTRY_METHOD = 0x0155, + CELL_SYSUTIL_SYSTEMPARAM_ID_PAD_AUTOOFF = 0x0156, + + // Strings + CELL_SYSUTIL_SYSTEMPARAM_ID_NICKNAME = 0x113, + CELL_SYSUTIL_SYSTEMPARAM_ID_CURRENT_USERNAME = 0x131, +}; + +enum +{ + CELL_SYSUTIL_LANG_JAPANESE = 0, + CELL_SYSUTIL_LANG_ENGLISH_US = 1, + CELL_SYSUTIL_LANG_FRENCH = 2, + CELL_SYSUTIL_LANG_SPANISH = 3, + CELL_SYSUTIL_LANG_GERMAN = 4, + CELL_SYSUTIL_LANG_ITALIAN = 5, + CELL_SYSUTIL_LANG_DUTCH = 6, + CELL_SYSUTIL_LANG_PORTUGUESE_PT = 7, + CELL_SYSUTIL_LANG_RUSSIAN = 8, + CELL_SYSUTIL_LANG_KOREAN = 9, + CELL_SYSUTIL_LANG_CHINESE_T = 10, + CELL_SYSUTIL_LANG_CHINESE_S = 11, + CELL_SYSUTIL_LANG_FINNISH = 12, + CELL_SYSUTIL_LANG_SWEDISH = 13, + CELL_SYSUTIL_LANG_DANISH = 14, + CELL_SYSUTIL_LANG_NORWEGIAN = 15, + CELL_SYSUTIL_LANG_POLISH = 16, + CELL_SYSUTIL_LANG_PORTUGUESE_BR = 17, + CELL_SYSUTIL_LANG_ENGLISH_GB = 18, +}; + +enum +{ + CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CIRCLE = 0, + CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CROSS = 1, +}; + +enum +{ + CELL_SYSUTIL_DATE_FMT_YYYYMMDD = 0, + CELL_SYSUTIL_DATE_FMT_DDMMYYYY = 1, + CELL_SYSUTIL_DATE_FMT_MMDDYYYY = 2, +}; + +enum +{ + CELL_SYSUTIL_TIME_FMT_CLOCK12 = 0, + CELL_SYSUTIL_TIME_FMT_CLOCK24 = 1, +}; + +enum +{ + CELL_SYSUTIL_GAME_PARENTAL_OFF = 0, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL01 = 1, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL02 = 2, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL03 = 3, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL04 = 4, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL05 = 5, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL06 = 6, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL07 = 7, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL08 = 8, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL09 = 9, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL10 = 10, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL11 = 11, +}; + +enum +{ + CELL_SYSUTIL_GAME_PARENTAL_LEVEL0_RESTRICT_OFF = 0, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL0_RESTRICT_ON = 1, +}; + +enum +{ + CELL_SYSUTIL_CAMERA_PLFREQ_DISABLED = 0, + CELL_SYSUTIL_CAMERA_PLFREQ_50HZ = 1, + CELL_SYSUTIL_CAMERA_PLFREQ_60HZ = 2, + CELL_SYSUTIL_CAMERA_PLFREQ_DEVCIE_DEPEND = 4, +}; + +enum +{ + CELL_SYSUTIL_PAD_RUMBLE_OFF = 0, + CELL_SYSUTIL_PAD_RUMBLE_ON = 1, +}; + + +enum +{ + CELL_MSGDIALOG_BUTTON_NONE = -1, + CELL_MSGDIALOG_BUTTON_INVALID = 0, + CELL_MSGDIALOG_BUTTON_OK = 1, + CELL_MSGDIALOG_BUTTON_YES = 1, + CELL_MSGDIALOG_BUTTON_NO = 2, + CELL_MSGDIALOG_BUTTON_ESCAPE = 3, +}; + +enum +{ + CELL_SYSCACHE_RET_OK_CLEARED = 0, + CELL_SYSCACHE_RET_OK_RELAYED = 1, + + CELL_SYSCACHE_ID_SIZE = 32, + CELL_SYSCACHE_PATH_MAX = 1055, + + CELL_SYSCACHE_ERROR_ACCESS_ERROR = 0x8002bc01, // I don't think we need this + CELL_SYSCACHE_ERROR_INTERNAL = 0x8002bc02, // Not really useful, if we run out of HDD space sys_fs should handle that + + CELL_SYSCACHE_ERROR_PARAM = 0x8002bc03, + CELL_SYSCACHE_ERROR_NOTMOUNTED = 0x8002bc04, // We don't really need to simulate the mounting, so this is probably useless +}; + +enum CellMsgDialogType +{ + CELL_MSGDIALOG_DIALOG_TYPE_ERROR = 0x00000000, + CELL_MSGDIALOG_DIALOG_TYPE_NORMAL = 0x00000001, + + CELL_MSGDIALOG_BUTTON_TYPE_NONE = 0x00000000, + CELL_MSGDIALOG_BUTTON_TYPE_YESNO = 0x00000010, + + CELL_MSGDIALOG_DEFAULT_CURSOR_YES = 0x00000000, + CELL_MSGDIALOG_DEFAULT_CURSOR_NO = 0x00000100, +}; diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index 872c25556d..7f02dd1e6f 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -4,6 +4,7 @@ #include "sceNp.h" #include "sceNpTrophy.h" + #include "Loader/TRP.h" void sceNpTrophy_unload(); @@ -116,23 +117,44 @@ int sceNpTrophyRegisterContext(u32 context, u32 handle, u32 statusCb_addr, u32 a // TODO: There are other possible errors sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; - if (!ctxt.trp_stream) return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST; - int ret; TRPLoader trp(*(ctxt.trp_stream)); + if (!trp.LoadHeader()) + return SCE_NP_TROPHY_ERROR_ILLEGAL_UPDATE; + + // Rename or discard certain entries based on the files found + char target [32]; + sprintf(target, "TROP_%02d.SFM", Ini.SysLanguage.GetValue()); + + if (trp.ContainsEntry(target)) { + trp.RemoveEntry("TROPCONF.SFM"); + trp.RemoveEntry("TROP.SFM"); + trp.RenameEntry(target, "TROPCONF.SFM"); + } + else if (trp.ContainsEntry("TROP.SFM")) { + trp.RemoveEntry("TROPCONF.SFM"); + trp.RenameEntry("TROP.SFM", "TROPCONF.SFM"); + } + else if (!trp.ContainsEntry("TROPCONF.SFM")) { + return SCE_NP_TROPHY_ERROR_ILLEGAL_UPDATE; + } + + // Discard unnecessary TROP_XX.SFM files + for (int i=0; i<=18; i++) { + sprintf(target, "TROP_%02d.SFM", i); + if (i != Ini.SysLanguage.GetValue()) + trp.RemoveEntry(target); + } // 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; + if (!trp.Install("/dev_hdd0/home/00000001/trophy/" + ctxt.trp_name)) + return SCE_NP_TROPHY_ERROR_ILLEGAL_UPDATE; // TODO: Callbacks - trp.Close(); - return ret; + return CELL_OK; } int sceNpTrophyGetGameProgress() diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index 80941fbaf8..f66c4e89a8 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -328,6 +328,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxBoxSizer* s_panel(new wxBoxSizer(wxHORIZONTAL)); wxBoxSizer* s_subpanel1(new wxBoxSizer(wxVERTICAL)); wxBoxSizer* s_subpanel2(new wxBoxSizer(wxVERTICAL)); + wxBoxSizer* s_subpanel3(new wxBoxSizer(wxVERTICAL)); wxStaticBoxSizer* s_round_cpu( new wxStaticBoxSizer( wxVERTICAL, &diag, _("CPU") ) ); wxStaticBoxSizer* s_round_cpu_decoder( new wxStaticBoxSizer( wxVERTICAL, &diag, _("Decoder") ) ); @@ -348,6 +349,9 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxStaticBoxSizer* s_round_hle( new wxStaticBoxSizer( wxVERTICAL, &diag, _("HLE / Misc.") ) ); wxStaticBoxSizer* s_round_hle_log_lvl( new wxStaticBoxSizer( wxVERTICAL, &diag, _("Log lvl") ) ); + wxStaticBoxSizer* s_round_sys( new wxStaticBoxSizer( wxVERTICAL, &diag, _("System") ) ); + wxStaticBoxSizer* s_round_sys_lang( new wxStaticBoxSizer( wxVERTICAL, &diag, _("Language") ) ); + wxComboBox* cbox_cpu_decoder = new wxComboBox(&diag, wxID_ANY); wxComboBox* cbox_gs_render = new wxComboBox(&diag, wxID_ANY); wxComboBox* cbox_gs_resolution = new wxComboBox(&diag, wxID_ANY); @@ -357,6 +361,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxComboBox* cbox_mouse_handler = new wxComboBox(&diag, wxID_ANY); wxComboBox* cbox_audio_out = new wxComboBox(&diag, wxID_ANY); wxComboBox* cbox_hle_loglvl = new wxComboBox(&diag, wxID_ANY); + wxComboBox* cbox_sys_lang = new wxComboBox(&diag, wxID_ANY); wxCheckBox* chbox_cpu_ignore_rwerrors = new wxCheckBox(&diag, wxID_ANY, "Ignore Read/Write errors"); wxCheckBox* chbox_gs_log_prog = new wxCheckBox(&diag, wxID_ANY, "Log vertex/fragment programs"); @@ -405,6 +410,25 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_hle_loglvl->Append("Errors"); cbox_hle_loglvl->Append("Nothing"); + cbox_sys_lang->Append("Japanese"); + cbox_sys_lang->Append("English (US)"); + cbox_sys_lang->Append("French"); + cbox_sys_lang->Append("Spanish"); + cbox_sys_lang->Append("German"); + cbox_sys_lang->Append("Italian"); + cbox_sys_lang->Append("Dutch"); + cbox_sys_lang->Append("Portuguese (PT)"); + cbox_sys_lang->Append("Russian"); + cbox_sys_lang->Append("Korean"); + cbox_sys_lang->Append("Chinese (Trad.)"); + cbox_sys_lang->Append("Chinese (Simp.)"); + cbox_sys_lang->Append("Finnish"); + cbox_sys_lang->Append("Swedish"); + cbox_sys_lang->Append("Danish"); + cbox_sys_lang->Append("Norwegian"); + cbox_sys_lang->Append("Polish"); + cbox_sys_lang->Append("English (UK)"); + chbox_cpu_ignore_rwerrors->SetValue(Ini.CPUIgnoreRWErrors.GetValue()); chbox_gs_log_prog->SetValue(Ini.GSLogPrograms.GetValue()); chbox_gs_dump_depth->SetValue(Ini.GSDumpDepthBuffer.GetValue()); @@ -428,6 +452,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_mouse_handler->SetSelection(Ini.MouseHandlerMode.GetValue()); cbox_audio_out->SetSelection(Ini.AudioOutMode.GetValue()); cbox_hle_loglvl->SetSelection(Ini.HLELogLvl.GetValue()); + cbox_sys_lang->SetSelection(Ini.SysLanguage.GetValue()); s_round_cpu_decoder->Add(cbox_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_cpu->Add(s_round_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -461,6 +486,9 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_round_hle->Add(chbox_hle_savetty, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_hle->Add(chbox_hle_exitonstop, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_sys_lang->Add(cbox_sys_lang, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_sys->Add(s_round_sys_lang, wxSizerFlags().Border(wxALL, 5).Expand()); + wxBoxSizer* s_b_panel(new wxBoxSizer(wxHORIZONTAL)); s_b_panel->Add(new wxButton(&diag, wxID_OK), wxSizerFlags().Border(wxALL, 5).Center()); @@ -474,9 +502,11 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_subpanel2->Add(s_round_io, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel2->Add(s_round_audio, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel2->Add(s_round_hle, wxSizerFlags().Border(wxALL, 5).Expand()); + s_subpanel3->Add(s_round_sys, wxSizerFlags().Border(wxALL, 5).Expand()); s_panel->Add(s_subpanel1, wxSizerFlags().Border(wxALL, 5).Expand()); s_panel->Add(s_subpanel2, wxSizerFlags().Border(wxALL, 5).Expand()); + s_panel->Add(s_subpanel3, wxSizerFlags().Border(wxALL, 5).Expand()); diag.SetSizerAndFit( s_panel ); @@ -500,6 +530,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) Ini.HLESaveTTY.SetValue(chbox_hle_savetty->GetValue()); Ini.HLEExitOnStop.SetValue(chbox_hle_exitonstop->GetValue()); Ini.HLELogLvl.SetValue(cbox_hle_loglvl->GetSelection()); + Ini.SysLanguage.SetValue(cbox_sys_lang->GetSelection()); Ini.Save(); } diff --git a/rpcs3/Ini.h b/rpcs3/Ini.h index 778228b97b..e0689e0972 100644 --- a/rpcs3/Ini.h +++ b/rpcs3/Ini.h @@ -110,6 +110,7 @@ public: IniEntry HLESaveTTY; IniEntry HLEExitOnStop; IniEntry HLELogLvl; + IniEntry SysLanguage; IniEntry PadHandlerLeft; IniEntry PadHandlerDown; @@ -178,6 +179,9 @@ public: HLESaveTTY.Init("HLESaveTTY", path); HLEExitOnStop.Init("HLEExitOnStop", path); HLELogLvl.Init("HLELogLvl", path); + + path = DefPath + "/" + "System"; + SysLanguage.Init("SysLanguage", path); } void Load() @@ -200,6 +204,7 @@ public: HLESaveTTY.Load(false); HLEExitOnStop.Load(false); HLELogLvl.Load(0); + SysLanguage.Load(1); PadHandlerLeft.Load(static_cast('A')); PadHandlerDown.Load(static_cast('S')); @@ -239,6 +244,7 @@ public: HLESaveTTY.Save(); HLEExitOnStop.Save(); HLELogLvl.Save(); + SysLanguage.Save(); PadHandlerLeft.Save(); PadHandlerDown.Save(); diff --git a/rpcs3/Loader/TRP.cpp b/rpcs3/Loader/TRP.cpp index 0345bdb0df..23b55c5192 100644 --- a/rpcs3/Loader/TRP.cpp +++ b/rpcs3/Loader/TRP.cpp @@ -5,10 +5,15 @@ TRPLoader::TRPLoader(vfsStream& f) : trp_f(f) { } +TRPLoader::~TRPLoader() +{ + Close(); +} + bool TRPLoader::Install(std::string dest, bool show) { - if(!trp_f.IsOpened()) return false; - if(!LoadHeader(show)) return false; + if(!trp_f.IsOpened()) + return false; if (!dest.empty() && dest.back() != '/') dest += '/'; @@ -28,13 +33,11 @@ bool TRPLoader::Install(std::string dest, bool show) return true; } -bool TRPLoader::Close() -{ - return trp_f.Close(); -} - bool TRPLoader::LoadHeader(bool show) { + if(!trp_f.IsOpened()) + return false; + trp_f.Seek(0); if (trp_f.Read(&m_header, sizeof(TRPHeader)) != sizeof(TRPHeader)) return false; @@ -59,3 +62,36 @@ bool TRPLoader::LoadHeader(bool show) return true; } + +bool TRPLoader::ContainsEntry(char *filename) +{ + for (const TRPEntry& entry : m_entries) { + if (!strcmp(entry.name, filename)) + return true; + } + return false; +} + +void TRPLoader::RemoveEntry(char *filename) +{ + std::vector::iterator i = m_entries.begin(); + while (i != m_entries.end()) { + if (!strcmp(i->name, filename)) + i = m_entries.erase(i); + else + i++; + } +} + +void TRPLoader::RenameEntry(char *oldname, char *newname) +{ + for (const TRPEntry& entry : m_entries) { + if (!strcmp(entry.name, oldname)) + memcpy((void*)entry.name, newname, 32); + } +} + +bool TRPLoader::Close() +{ + return trp_f.Close(); +} diff --git a/rpcs3/Loader/TRP.h b/rpcs3/Loader/TRP.h index e0994ce650..d86541e6c2 100644 --- a/rpcs3/Loader/TRP.h +++ b/rpcs3/Loader/TRP.h @@ -30,7 +30,13 @@ class TRPLoader public: TRPLoader(vfsStream& f); + ~TRPLoader(); virtual bool Install(std::string dest, bool show = false); virtual bool LoadHeader(bool show = false); + + virtual bool ContainsEntry(char *filename); + virtual void RemoveEntry(char *filename); + virtual void RenameEntry(char *oldname, char *newname); + virtual bool Close(); }; \ No newline at end of file From 4b14c72ed850f60118f8cf5b3347861dc1490802 Mon Sep 17 00:00:00 2001 From: kacek Date: Tue, 18 Mar 2014 01:03:26 +0100 Subject: [PATCH 24/27] implemented cellGcmsetTexture_BorderColor function --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 4 ++++ rpcs3/Emu/GS/RSXThread.cpp | 7 +++++++ rpcs3/Emu/GS/RSXThread.h | 7 +++++++ 3 files changed, 18 insertions(+) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index cabcd745d7..d99eb1d104 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -1150,6 +1150,10 @@ void GLGSRender::Flip() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + if(m_set_texture_border_color) + { + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BORDER_COLOR,(GLint)m_border_color); + } glMatrixMode(GL_PROJECTION); glLoadIdentity(); diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index 4868845eb0..e9ed13df1c 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -322,6 +322,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV4097_SET_TEXTURE_BORDER_COLOR: + { + m_set_texture_border_color = true; + m_border_color=ARGS(0); + break; + } + case NV4097_SET_SURFACE_FORMAT: { u32 a0 = ARGS(0); diff --git a/rpcs3/Emu/GS/RSXThread.h b/rpcs3/Emu/GS/RSXThread.h index c0e55d7871..887cf61b87 100644 --- a/rpcs3/Emu/GS/RSXThread.h +++ b/rpcs3/Emu/GS/RSXThread.h @@ -272,6 +272,9 @@ public: u8 m_blend_color_b; u8 m_blend_color_a; + bool m_set_texture_border_color; + u32 m_border_color; + u8 m_clear_color_r; u8 m_clear_color_g; u8 m_clear_color_b; @@ -400,6 +403,7 @@ protected: { m_set_alpha_test = false; m_set_blend = false; + m_set_texture_border_color = false; m_set_depth_bounds_test = false; m_depth_test_enable = false; m_set_logic_op = false; @@ -419,6 +423,8 @@ protected: m_clear_z = 0xffffff; m_clear_s = 0; + m_border_color = 0; + m_depth_bounds_min = 0.0; m_depth_bounds_max = 1.0; m_restart_index = 0xffffffff; @@ -442,6 +448,7 @@ protected: void Reset() { m_set_color_mask = false; + m_set_texture_border_color = false; m_set_clip = false; m_set_depth_func = false; m_set_depth_bounds = false; From 39dc6f0838a548135d371c85636e983b712c85ec Mon Sep 17 00:00:00 2001 From: kacek Date: Tue, 18 Mar 2014 07:20:59 +0100 Subject: [PATCH 25/27] cellGcmSetTexture_BorderColor fix --- rpcs3/Emu/GS/RSXThread.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index e9ed13df1c..a531ae680f 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -325,7 +325,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case NV4097_SET_TEXTURE_BORDER_COLOR: { m_set_texture_border_color = true; - m_border_color=ARGS(0); + u32 tmp = ARGS(0); + m_border_color=((tmp & 0x00FFFFFF)<<8)|((tmp & 0xFF000000)>>24); break; } From 2601933bdc23f65bcbbebdb0f8426071941607de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Tue, 18 Mar 2014 17:45:26 +0100 Subject: [PATCH 26/27] TextureBorderColor & cellFont problems fixed * Fixed tabs/spaces problem in cellSysutil.h too. NOTE: The problem with cellFont (crash on line 604) has been fixed, but for a high price: There is now a huge memory leak when a NULL pointer is passed to cellFontRenderSurfaceInit. --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 4 - rpcs3/Emu/GS/GL/GLGSRender.h | 4 + rpcs3/Emu/GS/RSXTexture.cpp | 8 ++ rpcs3/Emu/GS/RSXTexture.h | 3 + rpcs3/Emu/GS/RSXThread.cpp | 6 +- rpcs3/Emu/GS/RSXThread.h | 7 -- rpcs3/Emu/SysCalls/Modules/cellFont.cpp | 3 + rpcs3/Emu/SysCalls/Modules/cellSysutil.h | 154 +++++++++++------------ 8 files changed, 96 insertions(+), 93 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index d99eb1d104..cabcd745d7 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -1150,10 +1150,6 @@ void GLGSRender::Flip() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - if(m_set_texture_border_color) - { - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BORDER_COLOR,(GLint)m_border_color); - } glMatrixMode(GL_PROJECTION); glLoadIdentity(); diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index 3f8dc8ac39..c9b37b79e2 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -241,6 +241,10 @@ public: checkForGlError("GLTexture::Init() -> filters"); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (tex.GetBorderColor() << 8) | (tex.GetBorderColor() >> 24)); + + checkForGlError("GLTexture::Init() -> border color"); + //Unbind(); if(is_swizzled && format == CELL_GCM_TEXTURE_A8R8G8B8) diff --git a/rpcs3/Emu/GS/RSXTexture.cpp b/rpcs3/Emu/GS/RSXTexture.cpp index 1b150a95ac..ccf8b90d48 100644 --- a/rpcs3/Emu/GS/RSXTexture.cpp +++ b/rpcs3/Emu/GS/RSXTexture.cpp @@ -38,6 +38,9 @@ void RSXTexture::Init() // Image Rect methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*32)] = (/*height*/1) | ((/*width*/1) << 16); + + // Border Color + methodRegisters[NV4097_SET_TEXTURE_BORDER_COLOR + (m_index*32)] = 0; } u32 RSXTexture::GetOffset() const @@ -195,6 +198,11 @@ u16 RSXTexture::GetHeight() const return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*32)]) & 0xffff); } +u32 RSXTexture::GetBorderColor() const +{ + return methodRegisters[NV4097_SET_TEXTURE_BORDER_COLOR + (m_index*32)]; +} + void RSXTexture::SetControl3(u16 depth, u32 pitch) { m_depth = depth; diff --git a/rpcs3/Emu/GS/RSXTexture.h b/rpcs3/Emu/GS/RSXTexture.h index 8b87a9d7d9..d5db3480fb 100644 --- a/rpcs3/Emu/GS/RSXTexture.h +++ b/rpcs3/Emu/GS/RSXTexture.h @@ -58,5 +58,8 @@ public: u16 GetWidth() const; u16 GetHeight() const; + // Border Color + u32 GetBorderColor() const; + void SetControl3(u16 depth, u32 pitch); }; diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index a531ae680f..66277aee02 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -322,12 +322,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - case NV4097_SET_TEXTURE_BORDER_COLOR: + case_16(NV4097_SET_TEXTURE_BORDER_COLOR,0x20): { - m_set_texture_border_color = true; - u32 tmp = ARGS(0); - m_border_color=((tmp & 0x00FFFFFF)<<8)|((tmp & 0xFF000000)>>24); - break; } case NV4097_SET_SURFACE_FORMAT: diff --git a/rpcs3/Emu/GS/RSXThread.h b/rpcs3/Emu/GS/RSXThread.h index 887cf61b87..c0e55d7871 100644 --- a/rpcs3/Emu/GS/RSXThread.h +++ b/rpcs3/Emu/GS/RSXThread.h @@ -272,9 +272,6 @@ public: u8 m_blend_color_b; u8 m_blend_color_a; - bool m_set_texture_border_color; - u32 m_border_color; - u8 m_clear_color_r; u8 m_clear_color_g; u8 m_clear_color_b; @@ -403,7 +400,6 @@ protected: { m_set_alpha_test = false; m_set_blend = false; - m_set_texture_border_color = false; m_set_depth_bounds_test = false; m_depth_test_enable = false; m_set_logic_op = false; @@ -423,8 +419,6 @@ protected: m_clear_z = 0xffffff; m_clear_s = 0; - m_border_color = 0; - m_depth_bounds_min = 0.0; m_depth_bounds_max = 1.0; m_restart_index = 0xffffffff; @@ -448,7 +442,6 @@ protected: void Reset() { m_set_color_mask = false; - m_set_texture_border_color = false; m_set_clip = false; m_set_depth_func = false; m_set_depth_bounds = false; diff --git a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp index 9e816ba8b6..8181010427 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp @@ -459,6 +459,9 @@ void cellFontRenderSurfaceInit(mem_ptr_t surface, u32 buf surface->pixelSizeByte = pixelSizeByte; surface->width = w; surface->height = h; + + if (!buffer_addr) + surface->buffer_addr = Memory.Alloc(bufferWidthByte * h, 1); // TODO: Huge memory leak } void cellFontRenderSurfaceSetScissor(mem_ptr_t surface, s32 x0, s32 y0, s32 w, s32 h) diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.h b/rpcs3/Emu/SysCalls/Modules/cellSysutil.h index 62860307cd..0db281baef 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.h @@ -4,54 +4,54 @@ enum { // Integers - CELL_SYSUTIL_SYSTEMPARAM_ID_LANG = 0x0111, - CELL_SYSUTIL_SYSTEMPARAM_ID_ENTER_BUTTON_ASSIGN = 0x0112, - CELL_SYSUTIL_SYSTEMPARAM_ID_DATE_FORMAT = 0x0114, - CELL_SYSUTIL_SYSTEMPARAM_ID_TIME_FORMAT = 0x0115, - CELL_SYSUTIL_SYSTEMPARAM_ID_TIMEZONE = 0x0116, - CELL_SYSUTIL_SYSTEMPARAM_ID_SUMMERTIME = 0x0117, - CELL_SYSUTIL_SYSTEMPARAM_ID_GAME_PARENTAL_LEVEL = 0x0121, - CELL_SYSUTIL_SYSTEMPARAM_ID_GAME_PARENTAL_LEVEL0_RESTRICT = 0x0123, - CELL_SYSUTIL_SYSTEMPARAM_ID_CURRENT_USER_HAS_NP_ACCOUNT = 0x0141, - CELL_SYSUTIL_SYSTEMPARAM_ID_CAMERA_PLFREQ = 0x0151, - CELL_SYSUTIL_SYSTEMPARAM_ID_PAD_RUMBLE = 0x0152, - CELL_SYSUTIL_SYSTEMPARAM_ID_KEYBOARD_TYPE = 0x0153, - CELL_SYSUTIL_SYSTEMPARAM_ID_JAPANESE_KEYBOARD_ENTRY_METHOD = 0x0154, - CELL_SYSUTIL_SYSTEMPARAM_ID_CHINESE_KEYBOARD_ENTRY_METHOD = 0x0155, - CELL_SYSUTIL_SYSTEMPARAM_ID_PAD_AUTOOFF = 0x0156, + CELL_SYSUTIL_SYSTEMPARAM_ID_LANG = 0x0111, + CELL_SYSUTIL_SYSTEMPARAM_ID_ENTER_BUTTON_ASSIGN = 0x0112, + CELL_SYSUTIL_SYSTEMPARAM_ID_DATE_FORMAT = 0x0114, + CELL_SYSUTIL_SYSTEMPARAM_ID_TIME_FORMAT = 0x0115, + CELL_SYSUTIL_SYSTEMPARAM_ID_TIMEZONE = 0x0116, + CELL_SYSUTIL_SYSTEMPARAM_ID_SUMMERTIME = 0x0117, + CELL_SYSUTIL_SYSTEMPARAM_ID_GAME_PARENTAL_LEVEL = 0x0121, + CELL_SYSUTIL_SYSTEMPARAM_ID_GAME_PARENTAL_LEVEL0_RESTRICT = 0x0123, + CELL_SYSUTIL_SYSTEMPARAM_ID_CURRENT_USER_HAS_NP_ACCOUNT = 0x0141, + CELL_SYSUTIL_SYSTEMPARAM_ID_CAMERA_PLFREQ = 0x0151, + CELL_SYSUTIL_SYSTEMPARAM_ID_PAD_RUMBLE = 0x0152, + CELL_SYSUTIL_SYSTEMPARAM_ID_KEYBOARD_TYPE = 0x0153, + CELL_SYSUTIL_SYSTEMPARAM_ID_JAPANESE_KEYBOARD_ENTRY_METHOD = 0x0154, + CELL_SYSUTIL_SYSTEMPARAM_ID_CHINESE_KEYBOARD_ENTRY_METHOD = 0x0155, + CELL_SYSUTIL_SYSTEMPARAM_ID_PAD_AUTOOFF = 0x0156, // Strings - CELL_SYSUTIL_SYSTEMPARAM_ID_NICKNAME = 0x113, - CELL_SYSUTIL_SYSTEMPARAM_ID_CURRENT_USERNAME = 0x131, + CELL_SYSUTIL_SYSTEMPARAM_ID_NICKNAME = 0x113, + CELL_SYSUTIL_SYSTEMPARAM_ID_CURRENT_USERNAME = 0x131, }; enum { - CELL_SYSUTIL_LANG_JAPANESE = 0, - CELL_SYSUTIL_LANG_ENGLISH_US = 1, - CELL_SYSUTIL_LANG_FRENCH = 2, - CELL_SYSUTIL_LANG_SPANISH = 3, - CELL_SYSUTIL_LANG_GERMAN = 4, - CELL_SYSUTIL_LANG_ITALIAN = 5, - CELL_SYSUTIL_LANG_DUTCH = 6, - CELL_SYSUTIL_LANG_PORTUGUESE_PT = 7, - CELL_SYSUTIL_LANG_RUSSIAN = 8, - CELL_SYSUTIL_LANG_KOREAN = 9, - CELL_SYSUTIL_LANG_CHINESE_T = 10, - CELL_SYSUTIL_LANG_CHINESE_S = 11, - CELL_SYSUTIL_LANG_FINNISH = 12, - CELL_SYSUTIL_LANG_SWEDISH = 13, - CELL_SYSUTIL_LANG_DANISH = 14, - CELL_SYSUTIL_LANG_NORWEGIAN = 15, - CELL_SYSUTIL_LANG_POLISH = 16, - CELL_SYSUTIL_LANG_PORTUGUESE_BR = 17, - CELL_SYSUTIL_LANG_ENGLISH_GB = 18, + CELL_SYSUTIL_LANG_JAPANESE = 0, + CELL_SYSUTIL_LANG_ENGLISH_US = 1, + CELL_SYSUTIL_LANG_FRENCH = 2, + CELL_SYSUTIL_LANG_SPANISH = 3, + CELL_SYSUTIL_LANG_GERMAN = 4, + CELL_SYSUTIL_LANG_ITALIAN = 5, + CELL_SYSUTIL_LANG_DUTCH = 6, + CELL_SYSUTIL_LANG_PORTUGUESE_PT = 7, + CELL_SYSUTIL_LANG_RUSSIAN = 8, + CELL_SYSUTIL_LANG_KOREAN = 9, + CELL_SYSUTIL_LANG_CHINESE_T = 10, + CELL_SYSUTIL_LANG_CHINESE_S = 11, + CELL_SYSUTIL_LANG_FINNISH = 12, + CELL_SYSUTIL_LANG_SWEDISH = 13, + CELL_SYSUTIL_LANG_DANISH = 14, + CELL_SYSUTIL_LANG_NORWEGIAN = 15, + CELL_SYSUTIL_LANG_POLISH = 16, + CELL_SYSUTIL_LANG_PORTUGUESE_BR = 17, + CELL_SYSUTIL_LANG_ENGLISH_GB = 18, }; enum { CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CIRCLE = 0, - CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CROSS = 1, + CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CROSS = 1, }; enum @@ -69,74 +69,74 @@ enum enum { - CELL_SYSUTIL_GAME_PARENTAL_OFF = 0, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL01 = 1, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL02 = 2, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL03 = 3, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL04 = 4, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL05 = 5, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL06 = 6, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL07 = 7, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL08 = 8, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL09 = 9, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL10 = 10, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL11 = 11, + CELL_SYSUTIL_GAME_PARENTAL_OFF = 0, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL01 = 1, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL02 = 2, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL03 = 3, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL04 = 4, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL05 = 5, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL06 = 6, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL07 = 7, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL08 = 8, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL09 = 9, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL10 = 10, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL11 = 11, }; enum { - CELL_SYSUTIL_GAME_PARENTAL_LEVEL0_RESTRICT_OFF = 0, - CELL_SYSUTIL_GAME_PARENTAL_LEVEL0_RESTRICT_ON = 1, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL0_RESTRICT_OFF = 0, + CELL_SYSUTIL_GAME_PARENTAL_LEVEL0_RESTRICT_ON = 1, }; enum { - CELL_SYSUTIL_CAMERA_PLFREQ_DISABLED = 0, - CELL_SYSUTIL_CAMERA_PLFREQ_50HZ = 1, - CELL_SYSUTIL_CAMERA_PLFREQ_60HZ = 2, - CELL_SYSUTIL_CAMERA_PLFREQ_DEVCIE_DEPEND = 4, + CELL_SYSUTIL_CAMERA_PLFREQ_DISABLED = 0, + CELL_SYSUTIL_CAMERA_PLFREQ_50HZ = 1, + CELL_SYSUTIL_CAMERA_PLFREQ_60HZ = 2, + CELL_SYSUTIL_CAMERA_PLFREQ_DEVCIE_DEPEND = 4, }; enum { - CELL_SYSUTIL_PAD_RUMBLE_OFF = 0, - CELL_SYSUTIL_PAD_RUMBLE_ON = 1, + CELL_SYSUTIL_PAD_RUMBLE_OFF = 0, + CELL_SYSUTIL_PAD_RUMBLE_ON = 1, }; enum { - CELL_MSGDIALOG_BUTTON_NONE = -1, - CELL_MSGDIALOG_BUTTON_INVALID = 0, - CELL_MSGDIALOG_BUTTON_OK = 1, - CELL_MSGDIALOG_BUTTON_YES = 1, - CELL_MSGDIALOG_BUTTON_NO = 2, - CELL_MSGDIALOG_BUTTON_ESCAPE = 3, + CELL_MSGDIALOG_BUTTON_NONE = -1, + CELL_MSGDIALOG_BUTTON_INVALID = 0, + CELL_MSGDIALOG_BUTTON_OK = 1, + CELL_MSGDIALOG_BUTTON_YES = 1, + CELL_MSGDIALOG_BUTTON_NO = 2, + CELL_MSGDIALOG_BUTTON_ESCAPE = 3, }; enum { - CELL_SYSCACHE_RET_OK_CLEARED = 0, - CELL_SYSCACHE_RET_OK_RELAYED = 1, + CELL_SYSCACHE_RET_OK_CLEARED = 0, + CELL_SYSCACHE_RET_OK_RELAYED = 1, - CELL_SYSCACHE_ID_SIZE = 32, - CELL_SYSCACHE_PATH_MAX = 1055, + CELL_SYSCACHE_ID_SIZE = 32, + CELL_SYSCACHE_PATH_MAX = 1055, - CELL_SYSCACHE_ERROR_ACCESS_ERROR = 0x8002bc01, // I don't think we need this - CELL_SYSCACHE_ERROR_INTERNAL = 0x8002bc02, // Not really useful, if we run out of HDD space sys_fs should handle that + CELL_SYSCACHE_ERROR_ACCESS_ERROR = 0x8002bc01, // I don't think we need this + CELL_SYSCACHE_ERROR_INTERNAL = 0x8002bc02, // Not really useful, if we run out of HDD space sys_fs should handle that - CELL_SYSCACHE_ERROR_PARAM = 0x8002bc03, - CELL_SYSCACHE_ERROR_NOTMOUNTED = 0x8002bc04, // We don't really need to simulate the mounting, so this is probably useless + CELL_SYSCACHE_ERROR_PARAM = 0x8002bc03, + CELL_SYSCACHE_ERROR_NOTMOUNTED = 0x8002bc04, // We don't really need to simulate the mounting, so this is probably useless }; enum CellMsgDialogType { - CELL_MSGDIALOG_DIALOG_TYPE_ERROR = 0x00000000, - CELL_MSGDIALOG_DIALOG_TYPE_NORMAL = 0x00000001, + CELL_MSGDIALOG_DIALOG_TYPE_ERROR = 0x00000000, + CELL_MSGDIALOG_DIALOG_TYPE_NORMAL = 0x00000001, - CELL_MSGDIALOG_BUTTON_TYPE_NONE = 0x00000000, - CELL_MSGDIALOG_BUTTON_TYPE_YESNO = 0x00000010, + CELL_MSGDIALOG_BUTTON_TYPE_NONE = 0x00000000, + CELL_MSGDIALOG_BUTTON_TYPE_YESNO = 0x00000010, - CELL_MSGDIALOG_DEFAULT_CURSOR_YES = 0x00000000, - CELL_MSGDIALOG_DEFAULT_CURSOR_NO = 0x00000100, + CELL_MSGDIALOG_DEFAULT_CURSOR_YES = 0x00000000, + CELL_MSGDIALOG_DEFAULT_CURSOR_NO = 0x00000100, }; From 37f7a31a2274a0ddb1be152b7b0a5bf8570000c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Tue, 18 Mar 2014 18:27:11 +0100 Subject: [PATCH 27/27] Another small fix related with TextureBorderColor TODO: Find an appropriate place for setting the GL_TEXTURE_BORDER_COLOR parameter. --- rpcs3/Emu/GS/GL/GLGSRender.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index c9b37b79e2..3f8dc8ac39 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -241,10 +241,6 @@ public: checkForGlError("GLTexture::Init() -> filters"); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (tex.GetBorderColor() << 8) | (tex.GetBorderColor() >> 24)); - - checkForGlError("GLTexture::Init() -> border color"); - //Unbind(); if(is_swizzled && format == CELL_GCM_TEXTURE_A8R8G8B8)