implement more APIs

This commit is contained in:
InoriRus 2022-04-08 20:41:59 +10:00
parent d4c640462f
commit 1d43b81773
42 changed files with 2146 additions and 109 deletions

View File

@ -1,4 +1,4 @@
version: 0.0.12.build-{build}
version: 0.0.13.build-{build}
image: Visual Studio 2019
environment:
matrix:

View File

@ -82,7 +82,7 @@ if (KYTY_LINKER STREQUAL LD)
set(KYTY_LD_OPTIONS "-Wl,--image-base=0x100000000000")
endif()
project(Kyty${KYTY_PROJECT_NAME}${CMAKE_BUILD_TYPE}${KYTY_COMPILER} VERSION 0.0.12)
project(Kyty${KYTY_PROJECT_NAME}${CMAKE_BUILD_TYPE}${KYTY_COMPILER} VERSION 0.0.13)
include(src_script.cmake)

View File

@ -0,0 +1,25 @@
#ifndef EMULATOR_INCLUDE_EMULATOR_AUDIO_H_
#define EMULATOR_INCLUDE_EMULATOR_AUDIO_H_
#include "Kyty/Core/Common.h"
#include "Kyty/Core/Subsystems.h"
#include "Emulator/Common.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs::Audio {
KYTY_SUBSYSTEM_DEFINE(Audio);
namespace VoiceQoS {
int KYTY_SYSV_ABI VoiceQoSInit(void* mem_block, uint32_t mem_size, int32_t app_type);
} // namespace VoiceQoS
} // namespace Kyty::Libs::Audio
#endif // KYTY_EMU_ENABLED
#endif /* EMULATOR_INCLUDE_EMULATOR_AUDIO_H_ */

View File

@ -0,0 +1,20 @@
#ifndef EMULATOR_INCLUDE_EMULATOR_DIALOG_H_
#define EMULATOR_INCLUDE_EMULATOR_DIALOG_H_
#include "Emulator/Common.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs::Dialog {
namespace CommonDialog {
int KYTY_SYSV_ABI CommonDialogInitialize();
} // namespace CommonDialog
} // namespace Kyty::Libs::Dialog
#endif // KYTY_EMU_ENABLED
#endif /* EMULATOR_INCLUDE_EMULATOR_DIALOG_H_ */

View File

@ -254,6 +254,7 @@ public:
virtual ~Elf64();
void Open(const String& file_name);
void Save(const String& file_name);
void DbgDump(const String& folder);

View File

@ -89,6 +89,7 @@ void GraphicsRenderDispatchDirect(CommandBuffer* buffer, HW::HardwareContext* ct
uint32_t thread_group_z, uint32_t mode);
void GraphicsRenderMemoryBarrier(CommandBuffer* buffer);
void GraphicsRenderRenderTextureBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size);
void GraphicsRenderDepthStencilBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size);
void GraphicsRenderMemoryFree(uint64_t vaddr, uint64_t size);
void DeleteFramebuffer(VideoOutVulkanImage* image);

View File

@ -534,6 +534,15 @@ public:
m_vs.vs_shader_modifier = shader_modifier;
m_vs.vs_embedded = false;
}
void UpdateVsShader(const VsStageRegisters* vs_regs, uint32_t shader_modifier)
{
m_vs.vs_regs.m_spiShaderPgmLoVs = vs_regs->m_spiShaderPgmLoVs;
m_vs.vs_regs.m_spiShaderPgmHiVs = vs_regs->m_spiShaderPgmHiVs;
m_vs.vs_regs.m_spiShaderPgmRsrc1Vs = vs_regs->m_spiShaderPgmRsrc1Vs;
m_vs.vs_regs.m_spiShaderPgmRsrc2Vs = vs_regs->m_spiShaderPgmRsrc2Vs;
m_vs.vs_shader_modifier = shader_modifier;
m_vs.vs_embedded = false;
}
void SetVsEmbedded(uint32_t id, uint32_t shader_modifier)
{
m_vs.vs_embedded_id = id;
@ -546,6 +555,17 @@ public:
m_ps.ps_regs = *ps_regs;
m_ps.ps_embedded = false;
}
void UpdatePsShader(const PsStageRegisters* ps_regs)
{
m_ps.ps_regs.data_addr = ps_regs->data_addr;
m_ps.ps_regs.vgprs = ps_regs->vgprs;
m_ps.ps_regs.sgprs = ps_regs->sgprs;
m_ps.ps_regs.scratch_en = ps_regs->scratch_en;
m_ps.ps_regs.user_sgpr = ps_regs->user_sgpr;
m_ps.ps_regs.wave_cnt_en = ps_regs->wave_cnt_en;
m_ps.ps_regs.shader_z_format = ps_regs->shader_z_format;
m_ps.ps_embedded = false;
}
void SetPsEmbedded(uint32_t id)
{
m_ps.ps_embedded_id = id;

View File

@ -12,7 +12,9 @@ namespace Kyty::Libs::Graphics {
enum class RenderTextureFormat : uint64_t
{
R8G8B8A8Unorm
Unknown,
R8G8B8A8Unorm,
B8G8R8A8Unorm
};
class RenderTextureObject: public GpuObject

View File

@ -239,6 +239,7 @@ enum FormatByte : uint64_t
L, // label_%u
DmaskF, // dmask:0xf
Dmask7, // dmask:0x7
Dmask1, // dmask:0x1
Gds, // gds
};
@ -286,6 +287,7 @@ enum Format : uint64_t
Vdata4VaddrSvSoffsIdxen = FormatDefine({DA4, S0, S1A4, S2, Idxen}),
Vdata4VaddrSvSoffsIdxenFloat4 = FormatDefine({DA4, S0, S1A4, S2, Idxen, Float4}),
Vdata4Vaddr2SvSoffsOffenIdxenFloat4 = FormatDefine({DA4, S0A2, S1A4, S2, Offen, Idxen, Float4}),
Vdata1Vaddr3StSsDmask1 = FormatDefine({D, S0A3, S1A8, S2A4, Dmask1}),
Vdata3Vaddr3StSsDmask7 = FormatDefine({DA3, S0A3, S1A8, S2A4, Dmask7}),
Vdata4Vaddr3StSsDmaskF = FormatDefine({DA4, S0A3, S1A8, S2A4, DmaskF}),
Vdata4Vaddr3StDmaskF = FormatDefine({DA4, S0A3, S1A8, DmaskF}),

View File

@ -32,6 +32,19 @@ constexpr int OK = 0;
return 0; \
}()
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define POSIX_NET_CALL(func) \
[&]() \
{ \
auto result = func; \
if (result != OK) \
{ \
*GetErrorAddr() = Network::NetToPosix(result); \
return -1; \
} \
return 0; \
}()
namespace Kyty::Libs {
namespace Posix {
@ -324,6 +337,257 @@ constexpr int SYSTEM_SERVICE_ERROR_NOT_FLAG_IN_PARAM_SFO = -2136932342
} // namespace SystemService
namespace Network {
inline int NetToPosix(int kernel_errno)
{
return kernel_errno > -2143223551 && kernel_errno <= -2143223316 ? kernel_errno + 2143223551 + 1 : 204;
}
constexpr int NET_ERROR_EPERM = -2143223551; /* 0x80410101 */
constexpr int NET_ERROR_ENOENT = -2143223550; /* 0x80410102 */
constexpr int NET_ERROR_ESRCH = -2143223549; /* 0x80410103 */
constexpr int NET_ERROR_EINTR = -2143223548; /* 0x80410104 */
constexpr int NET_ERROR_EIO = -2143223547; /* 0x80410105 */
constexpr int NET_ERROR_ENXIO = -2143223546; /* 0x80410106 */
constexpr int NET_ERROR_E2BIG = -2143223545; /* 0x80410107 */
constexpr int NET_ERROR_ENOEXEC = -2143223544; /* 0x80410108 */
constexpr int NET_ERROR_EBADF = -2143223543; /* 0x80410109 */
constexpr int NET_ERROR_ECHILD = -2143223542; /* 0x8041010A */
constexpr int NET_ERROR_EDEADLK = -2143223541; /* 0x8041010B */
constexpr int NET_ERROR_ENOMEM = -2143223540; /* 0x8041010C */
constexpr int NET_ERROR_EACCES = -2143223539; /* 0x8041010D */
constexpr int NET_ERROR_EFAULT = -2143223538; /* 0x8041010E */
constexpr int NET_ERROR_ENOTBLK = -2143223537; /* 0x8041010F */
constexpr int NET_ERROR_EBUSY = -2143223536; /* 0x80410110 */
constexpr int NET_ERROR_EEXIST = -2143223535; /* 0x80410111 */
constexpr int NET_ERROR_EXDEV = -2143223534; /* 0x80410112 */
constexpr int NET_ERROR_ENODEV = -2143223533; /* 0x80410113 */
constexpr int NET_ERROR_ENOTDIR = -2143223532; /* 0x80410114 */
constexpr int NET_ERROR_EISDIR = -2143223531; /* 0x80410115 */
constexpr int NET_ERROR_EINVAL = -2143223530; /* 0x80410116 */
constexpr int NET_ERROR_ENFILE = -2143223529; /* 0x80410117 */
constexpr int NET_ERROR_EMFILE = -2143223528; /* 0x80410118 */
constexpr int NET_ERROR_ENOTTY = -2143223527; /* 0x80410119 */
constexpr int NET_ERROR_ETXTBSY = -2143223526; /* 0x8041011A */
constexpr int NET_ERROR_EFBIG = -2143223525; /* 0x8041011B */
constexpr int NET_ERROR_ENOSPC = -2143223524; /* 0x8041011C */
constexpr int NET_ERROR_ESPIPE = -2143223523; /* 0x8041011D */
constexpr int NET_ERROR_EROFS = -2143223522; /* 0x8041011E */
constexpr int NET_ERROR_EMLINK = -2143223521; /* 0x8041011F */
constexpr int NET_ERROR_EPIPE = -2143223520; /* 0x80410120 */
constexpr int NET_ERROR_EDOM = -2143223519; /* 0x80410121 */
constexpr int NET_ERROR_ERANGE = -2143223518; /* 0x80410122 */
constexpr int NET_ERROR_EAGAIN = -2143223517; /* 0x80410123 */
constexpr int NET_ERROR_EWOULDBLOCK = -2143223517; /* 0x80410123 */
constexpr int NET_ERROR_EINPROGRESS = -2143223516; /* 0x80410124 */
constexpr int NET_ERROR_EALREADY = -2143223515; /* 0x80410125 */
constexpr int NET_ERROR_ENOTSOCK = -2143223514; /* 0x80410126 */
constexpr int NET_ERROR_EDESTADDRREQ = -2143223513; /* 0x80410127 */
constexpr int NET_ERROR_EMSGSIZE = -2143223512; /* 0x80410128 */
constexpr int NET_ERROR_EPROTOTYPE = -2143223511; /* 0x80410129 */
constexpr int NET_ERROR_ENOPROTOOPT = -2143223510; /* 0x8041012A */
constexpr int NET_ERROR_EPROTONOSUPPORT = -2143223509; /* 0x8041012B */
constexpr int NET_ERROR_ESOCKTNOSUPPORT = -2143223508; /* 0x8041012C */
constexpr int NET_ERROR_EOPNOTSUPP = -2143223507; /* 0x8041012D */
constexpr int NET_ERROR_ENOTSUP = -2143223507; /* 0x8041012D */
constexpr int NET_ERROR_EPFNOSUPPORT = -2143223506; /* 0x8041012E */
constexpr int NET_ERROR_EAFNOSUPPORT = -2143223505; /* 0x8041012F */
constexpr int NET_ERROR_EADDRINUSE = -2143223504; /* 0x80410130 */
constexpr int NET_ERROR_EADDRNOTAVAIL = -2143223503; /* 0x80410131 */
constexpr int NET_ERROR_ENETDOWN = -2143223502; /* 0x80410132 */
constexpr int NET_ERROR_ENETUNREACH = -2143223501; /* 0x80410133 */
constexpr int NET_ERROR_ENETRESET = -2143223500; /* 0x80410134 */
constexpr int NET_ERROR_ECONNABORTED = -2143223499; /* 0x80410135 */
constexpr int NET_ERROR_ECONNRESET = -2143223498; /* 0x80410136 */
constexpr int NET_ERROR_ENOBUFS = -2143223497; /* 0x80410137 */
constexpr int NET_ERROR_EISCONN = -2143223496; /* 0x80410138 */
constexpr int NET_ERROR_ENOTCONN = -2143223495; /* 0x80410139 */
constexpr int NET_ERROR_ESHUTDOWN = -2143223494; /* 0x8041013A */
constexpr int NET_ERROR_ETOOMANYREFS = -2143223493; /* 0x8041013B */
constexpr int NET_ERROR_ETIMEDOUT = -2143223492; /* 0x8041013C */
constexpr int NET_ERROR_ECONNREFUSED = -2143223491; /* 0x8041013D */
constexpr int NET_ERROR_ELOOP = -2143223490; /* 0x8041013E */
constexpr int NET_ERROR_ENAMETOOLONG = -2143223489; /* 0x8041013F */
constexpr int NET_ERROR_EHOSTDOWN = -2143223488; /* 0x80410140 */
constexpr int NET_ERROR_EHOSTUNREACH = -2143223487; /* 0x80410141 */
constexpr int NET_ERROR_ENOTEMPTY = -2143223486; /* 0x80410142 */
constexpr int NET_ERROR_EPROCLIM = -2143223485; /* 0x80410143 */
constexpr int NET_ERROR_EUSERS = -2143223484; /* 0x80410144 */
constexpr int NET_ERROR_EDQUOT = -2143223483; /* 0x80410145 */
constexpr int NET_ERROR_ESTALE = -2143223482; /* 0x80410146 */
constexpr int NET_ERROR_EREMOTE = -2143223481; /* 0x80410147 */
constexpr int NET_ERROR_EBADRPC = -2143223480; /* 0x80410148 */
constexpr int NET_ERROR_ERPCMISMATCH = -2143223479; /* 0x80410149 */
constexpr int NET_ERROR_EPROGUNAVAIL = -2143223478; /* 0x8041014A */
constexpr int NET_ERROR_EPROGMISMATCH = -2143223477; /* 0x8041014B */
constexpr int NET_ERROR_EPROCUNAVAIL = -2143223476; /* 0x8041014C */
constexpr int NET_ERROR_ENOLCK = -2143223475; /* 0x8041014D */
constexpr int NET_ERROR_ENOSYS = -2143223474; /* 0x8041014E */
constexpr int NET_ERROR_EFTYPE = -2143223473; /* 0x8041014F */
constexpr int NET_ERROR_EAUTH = -2143223472; /* 0x80410150 */
constexpr int NET_ERROR_ENEEDAUTH = -2143223471; /* 0x80410151 */
constexpr int NET_ERROR_EIDRM = -2143223470; /* 0x80410152 */
constexpr int NET_ERROR_ENOMS = -2143223469; /* 0x80410153 */
constexpr int NET_ERROR_EOVERFLOW = -2143223468; /* 0x80410154 */
constexpr int NET_ERROR_ECANCELED = -2143223467; /* 0x80410155 */
constexpr int NET_ERROR_EPROTO = -2143223460; /* 0x8041015C */
constexpr int NET_ERROR_EADHOC = -2143223392; /* 0x804101A0 */
constexpr int NET_ERROR_ERESERVED161 = -2143223391; /* 0x804101A1 */
constexpr int NET_ERROR_ERESERVED162 = -2143223390; /* 0x804101A2 */
constexpr int NET_ERROR_EINACTIVEDISABLED = -2143223389; /* 0x804101A3 */
constexpr int NET_ERROR_ENODATA = -2143223388; /* 0x804101A4 */
constexpr int NET_ERROR_EDESC = -2143223387; /* 0x804101A5 */
constexpr int NET_ERROR_EDESCTIMEDOUT = -2143223386; /* 0x804101A6 */
constexpr int NET_ERROR_ENETINTR = -2143223385; /* 0x804101A7 */
constexpr int NET_ERROR_ENOTINIT = -2143223352; /* 0x804101C8 */
constexpr int NET_ERROR_ENOLIBMEM = -2143223351; /* 0x804101C9 */
constexpr int NET_ERROR_ERESERVED202 = -2143223350; /* 0x804101CA */
constexpr int NET_ERROR_ECALLBACK = -2143223349; /* 0x804101CB */
constexpr int NET_ERROR_EINTERNAL = -2143223348; /* 0x804101CC */
constexpr int NET_ERROR_ERETURN = -2143223347; /* 0x804101CD */
constexpr int NET_ERROR_ENOALLOCMEM = -2143223346; /* 0x804101CE */
constexpr int NET_ERROR_RESOLVER_EINTERNAL = -2143223332; /* 0x804101DC */
constexpr int NET_ERROR_RESOLVER_EBUSY = -2143223331; /* 0x804101DD */
constexpr int NET_ERROR_RESOLVER_ENOSPACE = -2143223330; /* 0x804101DE */
constexpr int NET_ERROR_RESOLVER_EPACKET = -2143223329; /* 0x804101DF */
constexpr int NET_ERROR_RESOLVER_ERESERVED224 = -2143223328; /* 0x804101E0 */
constexpr int NET_ERROR_RESOLVER_ENODNS = -2143223327; /* 0x804101E1 */
constexpr int NET_ERROR_RESOLVER_ETIMEDOUT = -2143223326; /* 0x804101E2 */
constexpr int NET_ERROR_RESOLVER_ENOSUPPORT = -2143223325; /* 0x804101E3 */
constexpr int NET_ERROR_RESOLVER_EFORMAT = -2143223324; /* 0x804101E4 */
constexpr int NET_ERROR_RESOLVER_ESERVERFAILURE = -2143223323; /* 0x804101E5 */
constexpr int NET_ERROR_RESOLVER_ENOHOST = -2143223322; /* 0x804101E6 */
constexpr int NET_ERROR_RESOLVER_ENOTIMPLEMENTED = -2143223321; /* 0x804101E7 */
constexpr int NET_ERROR_RESOLVER_ESERVERREFUSED = -2143223320; /* 0x804101E8 */
constexpr int NET_ERROR_RESOLVER_ENORECORD = -2143223319; /* 0x804101E9 */
constexpr int NET_ERROR_RESOLVER_EALIGNMENT = -2143223318; /* 0x804101EA */
constexpr int NET_ERROR_RESOLVER_ENOTFOUND = -2143223317; /* 0x804101EB */
constexpr int NET_ERROR_RESOLVER_ENOTINIT = -2143223316; /* 0x804101EC */
constexpr int SSL_ERROR_BEFORE_INIT = -2137657343; /* 0x8095F001 */
constexpr int SSL_ERROR_ALREADY_INITED = -2137657342; /* 0x8095F002 */
constexpr int SSL_ERROR_BROKEN = -2137657341; /* 0x8095F003 */
constexpr int SSL_ERROR_NOT_FOUND = -2137657340; /* 0x8095F004 */
constexpr int SSL_ERROR_INVALID_FORMAT = -2137657339; /* 0x8095F005 */
constexpr int SSL_ERROR_INVALID_ID = -2137657338; /* 0x8095F006 */
constexpr int SSL_ERROR_INVALID_VALUE = -2137657337; /* 0x8095F007 */
constexpr int SSL_ERROR_OUT_OF_SIZE = -2137657336; /* 0x8095F008 */
constexpr int SSL_ERROR_INTERNAL = -2137657335; /* 0x8095F009 */
constexpr int SSL_ERROR_INVALID_CERT = -2137657334; /* 0x8095F00A */
constexpr int SSL_ERROR_CN_CHECK = -2137657333; /* 0x8095F00B */
constexpr int SSL_ERROR_UNKNOWN_CA = -2137657332; /* 0x8095F00C */
constexpr int SSL_ERROR_NOT_AFTER_CHECK = -2137657331; /* 0x8095F00D */
constexpr int SSL_ERROR_NOT_BEFORE_CHECK = -2137657330; /* 0x8095F00E */
constexpr int SSL_ERROR_EAGAIN = -2137657329; /* 0x8095F00F */
constexpr int SSL_ERROR_FATAL_ALERT = -2137657328; /* 0x8095F010 */
constexpr int SSL_ERROR_BUSY = -2137657326; /* 0x8095F012 */
constexpr int SSL_ERROR_WANT_POLLIN = -2137657325; /* 0x8095F013 */
constexpr int SSL_ERROR_WANT_POLLOUT = -2137657324; /* 0x8095F014 */
constexpr int SSL_ERROR_INSUFFICIENT_STACKSIZE = -2137657323; /* 0x8095F015 */
constexpr int SSL_ERROR_APPLICATION_VERIFICATION_CALLBACK_CHECK = -2137657091; /* 0x8095F0FD */
constexpr int SSL_ERROR_OUT_OF_MEMORY = -2137712683; /* 0x809517D5 */
constexpr int SSL_ERROR_READ_TIMEOUT = -2137712880; /* 0x80951710 */
constexpr int SSL_ERROR_SOCKET_CLOSED = -2137712883; /* 0x8095170D */
constexpr int SSL_ERROR_BAD_LENGTH = -2137712781; /* 0x80951773 */
constexpr int SSL_ERROR_INDEX_OOB = -2137712776; /* 0x80951778 */
constexpr int SSL_ERROR_INVALID_ARG = -2137712774; /* 0x8095177A */
constexpr int SSL_ERROR_EOF = -2137712772; /* 0x8095177C */
constexpr int SSL_ERROR_BAD_EXPONENT = -2137712771; /* 0x8095177D */
constexpr int SSL_ERROR_INCOMPLETE_SEARCH = -2137712770; /* 0x8095177E */
constexpr int SSL_ERROR_INTERNAL_ERROR = -2137712769; /* 0x8095177F */
constexpr int SSL_ERROR_BAD_CERT_LENGTH = -2137710382; /* 0x809520D2 */
constexpr int SSL_ERROR_BAD_SIGN_ALGO = -2137710383; /* 0x809520D1 */
constexpr int SSL_ERROR_MISMATCH_PUBLIC_KEYS = -2137710381; /* 0x809520D3 */
constexpr int SSL_ERROR_KEY_BLOB_CORRUPT = -2137710380; /* 0x809520D4 */
constexpr int HTTP_ERROR_BEFORE_INIT = -2143088639; /*(0x80431001) */
constexpr int HTTP_ERROR_ALREADY_INITED = -2143088608; /*(0x80431020) */
constexpr int HTTP_ERROR_BUSY = -2143088607; /*(0x80431021) */
constexpr int HTTP_ERROR_OUT_OF_MEMORY = -2143088606; /*(0x80431022) */
constexpr int HTTP_ERROR_NOT_FOUND = -2143088603; /*(0x80431025) */
constexpr int HTTP_ERROR_INVALID_VERSION = -2143088534; /*(0x8043106a) */
constexpr int HTTP_ERROR_INVALID_ID = -2143088384; /*(0x80431100) */
constexpr int HTTP_ERROR_OUT_OF_SIZE = -2143088380; /*(0x80431104) */
constexpr int HTTP_ERROR_INVALID_VALUE = -2143088130; /*(0x804311fe) */
constexpr int HTTP_ERROR_INVALID_URL = -2143080352; /*(0x80433060) */
constexpr int HTTP_ERROR_UNKNOWN_SCHEME = -2143088543; /*(0x80431061) */
constexpr int HTTP_ERROR_NETWORK = -2143088541; /*(0x80431063) */
constexpr int HTTP_ERROR_BAD_RESPONSE = -2143088540; /*(0x80431064) */
constexpr int HTTP_ERROR_BEFORE_SEND = -2143088539; /*(0x80431065) */
constexpr int HTTP_ERROR_AFTER_SEND = -2143088538; /*(0x80431066) */
constexpr int HTTP_ERROR_TIMEOUT = -2143088536; /*(0x80431068) */
constexpr int HTTP_ERROR_UNKNOWN_AUTH_TYPE = -2143088535; /*(0x80431069) */
constexpr int HTTP_ERROR_UNKNOWN_METHOD = -2143088533; /*(0x8043106b) */
constexpr int HTTP_ERROR_READ_BY_HEAD_METHOD = -2143088529; /*(0x8043106f) */
constexpr int HTTP_ERROR_NOT_IN_COM = -2143088528; /*(0x80431070) */
constexpr int HTTP_ERROR_NO_CONTENT_LENGTH = -2143088527; /*(0x80431071) */
constexpr int HTTP_ERROR_CHUNK_ENC = -2143088526; /*(0x80431072) */
constexpr int HTTP_ERROR_TOO_LARGE_RESPONSE_HEADER = -2143088525; /*(0x80431073) */
constexpr int HTTP_ERROR_SSL = -2143088523; /*(0x80431075) */
constexpr int HTTP_ERROR_INSUFFICIENT_STACKSIZE = -2143088522; /*(0x80431076) */
constexpr int HTTP_ERROR_ABORTED = -2143088512; /*(0x80431080) */
constexpr int HTTP_ERROR_UNKNOWN = -2143088511; /*(0x80431081) */
constexpr int HTTP_ERROR_EAGAIN = -2143088510; /*(0x80431082) */
constexpr int HTTP_ERROR_PROXY = -2143088508; /*(0x80431084) */
constexpr int HTTP_ERROR_BROKEN = -2143088507; /*(0x80431085) */
constexpr int HTTP_ERROR_PARSE_HTTP_NOT_FOUND = -2143084507; /*(0x80432025) */
constexpr int HTTP_ERROR_PARSE_HTTP_INVALID_RESPONSE = -2143084448; /*(0x80432060) */
constexpr int HTTP_ERROR_PARSE_HTTP_INVALID_VALUE = -2143084034; /*(0x804321fe) */
constexpr int HTTP_ERROR_RESOLVER_EPACKET = -2143068159; /*(0x80436001) */
constexpr int HTTP_ERROR_RESOLVER_ENODNS = -2143068158; /*(0x80436002) */
constexpr int HTTP_ERROR_RESOLVER_ETIMEDOUT = -2143068157; /*(0x80436003) */
constexpr int HTTP_ERROR_RESOLVER_ENOSUPPORT = -2143068156; /*(0x80436004) */
constexpr int HTTP_ERROR_RESOLVER_EFORMAT = -2143068155; /*(0x80436005) */
constexpr int HTTP_ERROR_RESOLVER_ESERVERFAILURE = -2143068154; /*(0x80436006) */
constexpr int HTTP_ERROR_RESOLVER_ENOHOST = -2143068153; /*(0x80436007) */
constexpr int HTTP_ERROR_RESOLVER_ENOTIMPLEMENTED = -2143068152; /*(0x80436008) */
constexpr int HTTP_ERROR_RESOLVER_ESERVERREFUSED = -2143068151; /*(0x80436009) */
constexpr int HTTP_ERROR_RESOLVER_ENORECORD = -2143068150; /*(0x8043600a) */
constexpr int HTTPS_ERROR_CERT = -2143072160; /*(0x80435060) */
constexpr int HTTPS_ERROR_HANDSHAKE = -2143072159; /*(0x80435061) */
constexpr int HTTPS_ERROR_IO = -2143072158; /*(0x80435062) */
constexpr int HTTPS_ERROR_INTERNAL = -2143072157; /*(0x80435063) */
constexpr int HTTPS_ERROR_PROXY = -2143072156; /*(0x80435064) */
} // namespace Network
namespace PlayGo {
constexpr int PLAYGO_ERROR_UNKNOWN = -2135818239; /* 0x80B20001 */
constexpr int PLAYGO_ERROR_FATAL = -2135818238; /* 0x80B20002 */
constexpr int PLAYGO_ERROR_NO_MEMORY = -2135818237; /* 0x80B20003 */
constexpr int PLAYGO_ERROR_INVALID_ARGUMENT = -2135818236; /* 0x80B20004 */
constexpr int PLAYGO_ERROR_NOT_INITIALIZED = -2135818235; /* 0x80B20005 */
constexpr int PLAYGO_ERROR_ALREADY_INITIALIZED = -2135818234; /* 0x80B20006 */
constexpr int PLAYGO_ERROR_ALREADY_STARTED = -2135818233; /* 0x80B20007 */
constexpr int PLAYGO_ERROR_NOT_STARTED = -2135818232; /* 0x80B20008 */
constexpr int PLAYGO_ERROR_BAD_HANDLE = -2135818231; /* 0x80B20009 */
constexpr int PLAYGO_ERROR_BAD_POINTER = -2135818230; /* 0x80B2000A */
constexpr int PLAYGO_ERROR_BAD_SIZE = -2135818229; /* 0x80B2000B */
constexpr int PLAYGO_ERROR_BAD_CHUNK_ID = -2135818228; /* 0x80B2000C */
constexpr int PLAYGO_ERROR_BAD_SPEED = -2135818227; /* 0x80B2000D */
constexpr int PLAYGO_ERROR_NOT_SUPPORT_PLAYGO = -2135818226; /* 0x80B2000E */
constexpr int PLAYGO_ERROR_EPERM = -2135818225; /* 0x80B2000F */
constexpr int PLAYGO_ERROR_BAD_LOCUS = -2135818224; /* 0x80B20010 */
constexpr int PLAYGO_ERROR_NEED_DATA_DISC = -2135818223; /* 0x80B20011 */
} // namespace PlayGo
namespace UserService {
constexpr int USER_SERVICE_ERROR_INTERNAL = -2137653247; /* 0x80960001 */
constexpr int USER_SERVICE_ERROR_NOT_INITIALIZED = -2137653246; /* 0x80960002 */
constexpr int USER_SERVICE_ERROR_ALREADY_INITIALIZED = -2137653245; /* 0x80960003 */
constexpr int USER_SERVICE_ERROR_NO_MEMORY = -2137653244; /* 0x80960004 */
constexpr int USER_SERVICE_ERROR_INVALID_ARGUMENT = -2137653243; /* 0x80960005 */
constexpr int USER_SERVICE_ERROR_OPERATION_NOT_SUPPORTED = -2137653242; /* 0x80960006 */
constexpr int USER_SERVICE_ERROR_NO_EVENT = -2137653241; /* 0x80960007 */
constexpr int USER_SERVICE_ERROR_NOT_LOGGED_IN = -2137653239; /* 0x80960009 */
constexpr int USER_SERVICE_ERROR_BUFFER_TOO_SHORT = -2137653238; /* 0x8096000A */
} // namespace UserService
} // namespace Kyty::Libs
#endif // KYTY_EMU_ENABLED

View File

@ -18,9 +18,9 @@
#define LIB_DEFINE(name) void name(Loader::SymbolDatabase* s)
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define LIB_NAME(l, m) \
static thread_local bool PRINT_NAME_ENABLED = true; \
static constexpr char g_library[] = l; \
static constexpr char g_module[] = m;
[[maybe_unused]] static thread_local bool PRINT_NAME_ENABLED = true; \
static constexpr char g_library[] = l; \
static constexpr char g_module[] = m;
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define LIB_VERSION(l, lv, m, mv1, mv2) \
LIB_NAME(l, m); \
@ -65,8 +65,11 @@
#define PRINT_NAME() \
if (PRINT_NAME_ENABLED) \
{ \
Kyty::printf(FG_CYAN "[%d][%s] %s::%s::%s()" DEFAULT "\n", Core::Thread::GetThreadIdUnique(), \
Loader::Timer::GetTime().ToString("HH24:MI:SS.FFF").C_Str(), g_library, g_module, __func__); \
if (Kyty::Log::GetDirection() != Kyty::Log::Direction::Silent) \
{ \
Kyty::printf(FG_CYAN "[%d][%s] %s::%s::%s()" DEFAULT "\n", Core::Thread::GetThreadIdUnique(), \
Loader::Timer::GetTime().ToString("HH24:MI:SS.FFF").C_Str(), g_library, g_module, __func__); \
} \
}
namespace Kyty {

View File

@ -68,8 +68,9 @@ enum class Direction
File
};
void SetDirection(Direction dir);
void SetOutputFile(const String& file_name, Core::File::Encoding enc = Core::File::Encoding::Utf8);
Direction GetDirection();
void SetDirection(Direction dir);
void SetOutputFile(const String& file_name, Core::File::Encoding enc = Core::File::Encoding::Utf8);
bool IsColoredPrintf();
String RemoveColors(const String& str);

View File

@ -0,0 +1,94 @@
#ifndef EMULATOR_INCLUDE_EMULATOR_NETWORK_H_
#define EMULATOR_INCLUDE_EMULATOR_NETWORK_H_
#include "Kyty/Core/Common.h"
#include "Kyty/Core/Subsystems.h"
#include "Emulator/Common.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs::Network {
KYTY_SUBSYSTEM_DEFINE(Network);
namespace Net {
struct NetEtherAddr;
int KYTY_SYSV_ABI NetInit();
int KYTY_SYSV_ABI NetTerm();
int KYTY_SYSV_ABI NetPoolCreate(const char* name, int size, int flags);
int KYTY_SYSV_ABI NetPoolDestroy(int memid);
int KYTY_SYSV_ABI NetInetPton(int af, const char* src, void* dst);
int KYTY_SYSV_ABI NetEtherNtostr(const NetEtherAddr* n, char* str, size_t len);
int KYTY_SYSV_ABI NetGetMacAddress(NetEtherAddr* addr, int flags);
} // namespace Net
namespace Ssl {
int KYTY_SYSV_ABI SslInit(uint64_t pool_size);
int KYTY_SYSV_ABI SslTerm(int ssl_ctx_id);
} // namespace Ssl
namespace Http {
int KYTY_SYSV_ABI HttpInit(int memid, int ssl_ctx_id, uint64_t pool_size);
int KYTY_SYSV_ABI HttpTerm(int http_ctx_id);
int KYTY_SYSV_ABI HttpCreateTemplate(int http_ctx_id, const char* user_agent, int http_ver, int is_auto_proxy_conf);
int KYTY_SYSV_ABI HttpDeleteTemplate(int tmpl_id);
} // namespace Http
namespace NetCtl {
struct NetCtlNatInfo;
union NetCtlInfo;
using NetCtlCallback = void (*)(int, void*);
int KYTY_SYSV_ABI NetCtlInit();
void KYTY_SYSV_ABI NetCtlTerm();
int KYTY_SYSV_ABI NetCtlGetNatInfo(NetCtlNatInfo* nat_info);
int KYTY_SYSV_ABI NetCtlCheckCallback();
int KYTY_SYSV_ABI NetCtlGetState(int* state);
int KYTY_SYSV_ABI NetCtlRegisterCallback(NetCtlCallback func, void* arg, int* cid);
int KYTY_SYSV_ABI NetCtlGetInfo(int code, NetCtlInfo* info);
} // namespace NetCtl
namespace NpManager {
struct NpTitleId;
struct NpTitleSecret;
struct NpContentRestriction;
int KYTY_SYSV_ABI NpCheckCallback();
int KYTY_SYSV_ABI NpSetNpTitleId(const NpTitleId* title_id, const NpTitleSecret* title_secret);
int KYTY_SYSV_ABI NpSetContentRestriction(const NpContentRestriction* restriction);
int KYTY_SYSV_ABI NpRegisterStateCallback(void* callback, void* userdata);
void KYTY_SYSV_ABI NpRegisterGamePresenceCallback(void* callback, void* userdata);
int KYTY_SYSV_ABI NpRegisterPlusEventCallback(void* callback, void* userdata);
} // namespace NpManager
namespace NpTrophy {
int KYTY_SYSV_ABI NpTrophyCreateHandle(int* handle);
} // namespace NpTrophy
namespace NpWebApi {
int KYTY_SYSV_ABI NpWebApiInitialize(int http_ctx_id, size_t pool_size);
int KYTY_SYSV_ABI NpWebApiTerminate(int lib_ctx_id);
} // namespace NpWebApi
} // namespace Kyty::Libs::Network
#endif // KYTY_EMU_ENABLED
#endif /* EMULATOR_INCLUDE_EMULATOR_NETWORK_H_ */

View File

@ -134,6 +134,7 @@ public:
void DbgDump(const String& folder);
Program* LoadProgram(const String& elf_name);
void SaveMainProgram(const String& elf_name);
void UnloadProgram(Program* program);
[[nodiscard]] uint64_t GetEntry();

View File

@ -24,15 +24,20 @@ kyty_load_elf('/app0/main.elf');
kyty_load_elf('/app0/sce_module/libc.prx', 0);
kyty_load_elf('/app0/sce_module/libSceFios2.prx', 0);
kyty_load_symbols('libAudio_1');
kyty_load_symbols('libc_internal_1');
kyty_load_symbols('libkernel_1');
kyty_load_symbols('libVideoOut_1');
kyty_load_symbols('libSysmodule_1');
kyty_load_symbols('libDiscMap_1');
kyty_load_symbols('libDebug_1');
kyty_load_symbols('libDialog_1');
kyty_load_symbols('libDiscMap_1');
kyty_load_symbols('libGraphicsDriver_1');
kyty_load_symbols('libUserService_1');
kyty_load_symbols('libkernel_1');
kyty_load_symbols('libNet_1');
kyty_load_symbols('libPad_1');
kyty_load_symbols('libPlayGo_1');
kyty_load_symbols('libSysmodule_1');
kyty_load_symbols('libSystemService_1');
kyty_load_symbols('libUserService_1');
kyty_load_symbols('libVideoOut_1');
kyty_execute();

View File

@ -0,0 +1,59 @@
#include "Emulator/Audio.h"
#include "Kyty/Core/Common.h"
#include "Kyty/Core/DbgAssert.h"
#include "Kyty/Core/String.h"
#include "Kyty/Core/Threads.h"
#include "Emulator/Libs/Errno.h"
#include "Emulator/Libs/Libs.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs::Audio {
class Audio
{
public:
Audio() = default;
virtual ~Audio() = default;
KYTY_CLASS_NO_COPY(Audio);
private:
Core::Mutex m_mutex;
};
static Audio* g_audio = nullptr;
KYTY_SUBSYSTEM_INIT(Audio)
{
EXIT_IF(g_audio != nullptr);
g_audio = new Audio;
}
KYTY_SUBSYSTEM_UNEXPECTED_SHUTDOWN(Audio) {}
KYTY_SUBSYSTEM_DESTROY(Audio) {}
namespace VoiceQoS {
LIB_NAME("VoiceQoS", "VoiceQoS");
int KYTY_SYSV_ABI VoiceQoSInit(void* mem_block, uint32_t mem_size, int32_t app_type)
{
PRINT_NAME();
printf("\t mem_block = %016" PRIx64 "\n", reinterpret_cast<uint64_t>(mem_block));
printf("\t mem_size = %" PRIu32 "\n", mem_size);
printf("\t app_type = %" PRId32 "\n", app_type);
return OK;
}
} // namespace VoiceQoS
} // namespace Kyty::Libs::Audio
#endif // KYTY_EMU_ENABLED

View File

@ -0,0 +1,28 @@
#include "Emulator/Dialog.h"
#include "Kyty/Core/String.h"
#include "Emulator/Libs/Errno.h"
#include "Emulator/Libs/Libs.h"
#ifdef KYTY_EMU_ENABLED
// NOLINTNEXTLINE(modernize-concat-nested-namespaces)
namespace Kyty::Libs::Dialog {
namespace CommonDialog {
LIB_NAME("CommonDialog", "CommonDialog");
int KYTY_SYSV_ABI CommonDialogInitialize()
{
PRINT_NAME();
return OK;
}
} // namespace CommonDialog
} // namespace Kyty::Libs::Dialog
#endif // KYTY_EMU_ENABLED

View File

@ -44,6 +44,17 @@ static Elf64_Ehdr* load_ehdr_64(Core::File& f)
return ehdr;
}
static void save_ehdr_64(Core::File& f, const Elf64_Ehdr* ehdr)
{
EXIT_IF(ehdr == nullptr);
uint32_t bytes_written = 0;
f.Write(ehdr, sizeof(Elf64_Ehdr), &bytes_written);
EXIT_IF(bytes_written == 0);
}
static Elf64_Phdr* load_phdr_64(Core::File& f, uint64_t offset, Elf64_Half num)
{
auto* phdr = new Elf64_Phdr[num];
@ -54,6 +65,18 @@ static Elf64_Phdr* load_phdr_64(Core::File& f, uint64_t offset, Elf64_Half num)
return phdr;
}
static void save_phdr_64(Core::File& f, uint64_t offset, Elf64_Half num, const Elf64_Phdr* phdr)
{
EXIT_IF(phdr == nullptr);
uint32_t bytes_written = 0;
f.Seek(offset);
f.Write(phdr, sizeof(Elf64_Phdr) * num, &bytes_written);
EXIT_IF(bytes_written == 0);
}
static Elf64_Shdr* load_shdr_64(Core::File& f, uint64_t offset, Elf64_Half num)
{
if (num == 0)
@ -69,6 +92,23 @@ static Elf64_Shdr* load_shdr_64(Core::File& f, uint64_t offset, Elf64_Half num)
return shdr;
}
static void save_shdr_64(Core::File& f, uint64_t offset, Elf64_Half num, const Elf64_Shdr* shdr)
{
if (num == 0)
{
return;
}
EXIT_IF(shdr == nullptr);
uint32_t bytes_written = 0;
f.Seek(offset);
f.Write(shdr, sizeof(Elf64_Shdr) * num, &bytes_written);
EXIT_IF(bytes_written == 0);
}
static void* load_dynamic_64(Elf64* f, uint64_t offset, uint64_t size)
{
void* dynamic_data = new uint8_t[size];
@ -599,6 +639,72 @@ void Elf64::Open(const String& file_name)
}
}
void Elf64::Save(const String& file_name)
{
EXIT_IF(!IsValid());
if (IsValid())
{
Core::File f;
f.Create(file_name);
if (f.IsInvalid())
{
EXIT("Can't create %s\n", file_name.C_Str());
}
save_ehdr_64(f, m_ehdr);
save_phdr_64(f, m_ehdr->e_phoff, m_ehdr->e_phnum, m_phdr);
save_shdr_64(f, m_ehdr->e_shoff, m_ehdr->e_shnum, m_shdr);
for (uint16_t i = 0; i < m_ehdr->e_phnum; i++)
{
if (m_phdr[i].p_filesz == 0u)
{
continue;
}
auto* buf = new char[static_cast<uint32_t>(m_phdr[i].p_filesz)];
LoadSegment(reinterpret_cast<uint64_t>(buf), m_phdr[i].p_offset, m_phdr[i].p_filesz);
uint32_t bytes_written = 0;
f.Seek(m_phdr[i].p_offset);
f.Write(buf, static_cast<uint32_t>(m_phdr[i].p_filesz), &bytes_written);
EXIT_IF(bytes_written == 0);
delete[] buf;
}
for (uint16_t i = 0; i < m_ehdr->e_shnum; i++)
{
if (m_shdr[i].sh_size == 0u)
{
continue;
}
auto* buf = new char[static_cast<uint32_t>(m_shdr[i].sh_size)];
m_f->Seek(m_shdr[i].sh_offset);
m_f->Read(buf, static_cast<uint32_t>(m_shdr[i].sh_size));
uint32_t bytes_written = 0;
f.Seek(m_shdr[i].sh_offset);
f.Write(buf, static_cast<uint32_t>(m_shdr[i].sh_size), &bytes_written);
EXIT_IF(bytes_written == 0);
delete[] buf;
}
f.Close();
}
}
} // namespace Kyty::Loader
#endif // KYTY_EMU_ENABLED

View File

@ -530,9 +530,9 @@ static void rt_check(const HW::RenderTarget& rt)
// EXIT_NOT_IMPLEMENTED(rt.dcc_max_uncompressed_block_size != 0x00000002);
EXIT_NOT_IMPLEMENTED(rt.dcc.max_compressed_block_size != 0x00000000);
EXIT_NOT_IMPLEMENTED(rt.dcc.min_compressed_block_size != 0x00000000);
EXIT_NOT_IMPLEMENTED(rt.dcc.color_transform != 0x00000000);
// EXIT_NOT_IMPLEMENTED(rt.dcc.color_transform != 0x00000000);
EXIT_NOT_IMPLEMENTED(rt.dcc.enable_overwrite_combiner != false);
EXIT_NOT_IMPLEMENTED(rt.dcc.force_independent_blocks != false);
// EXIT_NOT_IMPLEMENTED(rt.dcc.force_independent_blocks != false);
EXIT_NOT_IMPLEMENTED(rt.cmask.addr != 0x0000000000000000);
EXIT_NOT_IMPLEMENTED(rt.cmask_slice.slice_minus1 != 0x00000000);
EXIT_NOT_IMPLEMENTED(rt.fmask.addr != 0x0000000000000000);
@ -733,7 +733,7 @@ static void mc_print(const char* func, const HW::ModeControl& c)
static void mc_check(const HW::ModeControl& c)
{
EXIT_NOT_IMPLEMENTED(c.cull_front != false);
// EXIT_NOT_IMPLEMENTED(c.cull_front != false);
// EXIT_NOT_IMPLEMENTED(c.cull_back != false);
EXIT_NOT_IMPLEMENTED(c.face != false);
EXIT_NOT_IMPLEMENTED(c.poly_mode != 0);
@ -771,10 +771,10 @@ static void bc_check(const HW::BlendControl& c, const HW::BlendColor& color, con
// EXIT_NOT_IMPLEMENTED(c.color_srcblend != 0);
EXIT_NOT_IMPLEMENTED(c.color_comb_fcn != 0);
// EXIT_NOT_IMPLEMENTED(c.color_destblend != 0);
EXIT_NOT_IMPLEMENTED(c.alpha_srcblend != 0);
// EXIT_NOT_IMPLEMENTED(c.alpha_srcblend != 0);
EXIT_NOT_IMPLEMENTED(c.alpha_comb_fcn != 0);
EXIT_NOT_IMPLEMENTED(c.alpha_destblend != 0);
EXIT_NOT_IMPLEMENTED(c.separate_alpha_blend != false);
// EXIT_NOT_IMPLEMENTED(c.alpha_destblend != 0);
// EXIT_NOT_IMPLEMENTED(c.separate_alpha_blend != false);
// EXIT_NOT_IMPLEMENTED(c.enable != false);
EXIT_NOT_IMPLEMENTED(color.red != 0.0f);
EXIT_NOT_IMPLEMENTED(color.green != 0.0f);
@ -2863,7 +2863,7 @@ VulkanDescriptorSet* DescriptorCache::GetDescriptor(Stage stage, VulkanBuffer**
gds_buffer_info[i].range = VK_WHOLE_SIZE;
}
int binding_num = 0;
uint32_t binding_num = 0;
constexpr uint32_t B_MAX = 5;
@ -3321,6 +3321,23 @@ void GraphicsRenderRenderTextureBarrier(CommandBuffer* buffer, uint64_t vaddr, u
}
}
void GraphicsRenderDepthStencilBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size)
{
EXIT_IF(buffer == nullptr);
EXIT_IF(buffer->IsInvalid());
Core::LockGuard lock(g_render_ctx->GetMutex());
auto* vk_buffer = buffer->GetPool()->buffers[buffer->GetIndex()];
auto images = FindDepthStencil(vaddr, size, false);
for (auto* image: images)
{
GraphicsRenderDepthStencilBarrier(vk_buffer, image);
}
}
// NOLINTNEXTLINE(readability-function-cognitive-complexity)
static void FindRenderDepthInfo(CommandBuffer* /*buffer*/, const HW::HardwareContext& hw, RenderDepthInfo* r)
{
@ -3500,6 +3517,8 @@ static void FindRenderColorInfo(CommandBuffer* buffer, const HW::HardwareContext
uint32_t format = 0;
bool render_to_texture = false;
auto video_image = VideoOut::VideoOutGetImage(rt.base.addr);
if (rt.attrib.tile_mode == 0x8)
{
tile = false;
@ -3507,7 +3526,7 @@ static void FindRenderColorInfo(CommandBuffer* buffer, const HW::HardwareContext
{
tile = true;
if (rt.info.format == 0xa && rt.info.channel_type == 0x0 && rt.info.channel_order == 0x0 && rt.size.width == rt.size.height)
if (rt.info.format == 0xa && rt.info.channel_type == 0x0 && (rt.info.channel_order == 0x0 || rt.info.channel_order == 0x1))
{
render_to_texture = true;
}
@ -3520,26 +3539,38 @@ static void FindRenderColorInfo(CommandBuffer* buffer, const HW::HardwareContext
EXIT("unknown tile mode: %u\n", rt.attrib.tile_mode);
}
if (render_to_texture && video_image.image != nullptr)
{
render_to_texture = false;
}
if (render_to_texture)
{
RenderTextureFormat rt_format = RenderTextureFormat::Unknown;
if (rt.info.format == 0xa && rt.info.channel_type == 0x0 && rt.info.channel_order == 0x0)
{
// Render to texture
RenderTextureObject vulkan_buffer_info(RenderTextureFormat::R8G8B8A8Unorm, width, height, tile, rt.info.neo_mode, pitch);
auto* buffer_vulkan = static_cast<Graphics::RenderTextureVulkanImage*>(
Graphics::GpuMemoryCreateObject(g_render_ctx->GetGraphicCtx(), buffer, rt.base.addr, size, vulkan_buffer_info));
EXIT_NOT_IMPLEMENTED(buffer_vulkan == nullptr);
r->type = RenderColorType::RenderTexture;
r->base_addr = rt.base.addr;
r->vulkan_buffer = buffer_vulkan;
r->buffer_size = size;
rt_format = RenderTextureFormat::R8G8B8A8Unorm;
} else if (rt.info.format == 0xa && rt.info.channel_type == 0x0 && rt.info.channel_order == 0x1)
{
rt_format = RenderTextureFormat::B8G8R8A8Unorm;
} else
{
EXIT("unknown format");
}
// Render to texture
RenderTextureObject vulkan_buffer_info(rt_format, width, height, tile, rt.info.neo_mode, pitch);
auto* buffer_vulkan = static_cast<Graphics::RenderTextureVulkanImage*>(
Graphics::GpuMemoryCreateObject(g_render_ctx->GetGraphicCtx(), buffer, rt.base.addr, size, vulkan_buffer_info));
EXIT_NOT_IMPLEMENTED(buffer_vulkan == nullptr);
r->type = RenderColorType::RenderTexture;
r->base_addr = rt.base.addr;
r->vulkan_buffer = buffer_vulkan;
r->buffer_size = size;
} else
{
if (rt.info.format == 0xa && rt.info.channel_type == 0x6 && rt.info.channel_order == 0x1)
if (rt.info.format == 0xa && (rt.info.channel_type == 0x6 || rt.info.channel_type == 0x0) && rt.info.channel_order == 0x1)
{
format = 0x80000000;
} else
@ -3547,7 +3578,6 @@ static void FindRenderColorInfo(CommandBuffer* buffer, const HW::HardwareContext
EXIT("unknown format");
}
auto video_image = VideoOut::VideoOutGetImage(rt.base.addr);
if (video_image.image == nullptr)
{
// Offscreen buffer
@ -3679,7 +3709,7 @@ static void PrepareTextures(CommandBuffer* buffer, const ShaderTextureResources&
EXIT_NOT_IMPLEMENTED(r.Base() == 0);
EXIT_NOT_IMPLEMENTED(r.MinLod() != 0);
EXIT_NOT_IMPLEMENTED(r.Dfmt() != 10 && r.Dfmt() != 37 && r.Dfmt() != 4);
EXIT_NOT_IMPLEMENTED(r.Dfmt() != 1 && r.Dfmt() != 10 && r.Dfmt() != 37 && r.Dfmt() != 4);
EXIT_NOT_IMPLEMENTED(r.Nfmt() != 9 && r.Nfmt() != 0 && r.Nfmt() != 7);
// EXIT_NOT_IMPLEMENTED(r.Width() != 511);
// EXIT_NOT_IMPLEMENTED(r.Height() != 511);
@ -3815,9 +3845,9 @@ static void PrepareSamplers(const ShaderSamplerResources& samplers, uint64_t* sa
{
auto r = samplers.samplers[i];
EXIT_NOT_IMPLEMENTED(r.ClampX() != 0);
EXIT_NOT_IMPLEMENTED(r.ClampY() != 0);
EXIT_NOT_IMPLEMENTED(r.ClampZ() != 0);
// EXIT_NOT_IMPLEMENTED(r.ClampX() != 0);
// EXIT_NOT_IMPLEMENTED(r.ClampY() != 0);
// EXIT_NOT_IMPLEMENTED(r.ClampZ() != 0);
// EXIT_NOT_IMPLEMENTED(r.MaxAnisoRatio() != 0);
EXIT_NOT_IMPLEMENTED(r.DepthCompareFunc() != 0);
EXIT_NOT_IMPLEMENTED(r.ForceUnormCoords() != false);
@ -3832,7 +3862,7 @@ static void PrepareSamplers(const ShaderSamplerResources& samplers, uint64_t* sa
// EXIT_NOT_IMPLEMENTED(r.MaxLod() != 4095);
EXIT_NOT_IMPLEMENTED(r.PerfMip() != 0);
EXIT_NOT_IMPLEMENTED(r.PerfZ() != 0);
EXIT_NOT_IMPLEMENTED(r.LodBias() != 0);
// EXIT_NOT_IMPLEMENTED(r.LodBias() != 0);
EXIT_NOT_IMPLEMENTED(r.LodBiasSec() != 0);
// EXIT_NOT_IMPLEMENTED(r.XyMagFilter() != 1);
// EXIT_NOT_IMPLEMENTED(r.XyMinFilter() != 1);
@ -4184,9 +4214,9 @@ void GraphicsRenderDrawIndexAuto(CommandBuffer* buffer, HW::HardwareContext* ctx
switch (ucfg->GetPrimType())
{
case 4: topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; break;
case 17: topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; break;
case 19: topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN; break;
case 4: topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; break; // kPrimitiveTypeTriList
case 17: topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; break; // kPrimitiveTypeRectList
case 19: topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN; break; // kPrimitiveTypeQuadList
default: EXIT("unknown primitive type: %u\n", ucfg->GetPrimType());
}
@ -4239,8 +4269,11 @@ void GraphicsRenderDrawIndexAuto(CommandBuffer* buffer, HW::HardwareContext* ctx
vkCmdDraw(vk_buffer, 4, 1, 0, 0);
break;
case 19:
EXIT_NOT_IMPLEMENTED(index_count != 4);
vkCmdDraw(vk_buffer, 4, 1, 0, 0);
EXIT_NOT_IMPLEMENTED((index_count & 0x3u) != 0);
for (uint32_t i = 0; i < index_count; i += 4)
{
vkCmdDraw(vk_buffer, 4, 1, i, 0);
}
break;
default: EXIT("unknown primitive type: %u\n", ucfg->GetPrimType());
}

View File

@ -72,6 +72,7 @@ public:
void WriteBack();
void MemoryBarrier();
void RenderTextureBarrier(uint64_t vaddr, uint64_t size);
void DepthStencilBarrier(uint64_t vaddr, uint64_t size);
void DispatchDirect(uint32_t thread_group_x, uint32_t thread_group_y, uint32_t thread_group_z, uint32_t mode);
void WaitFlipDone(uint32_t video_out_handle, uint32_t display_buffer_index);
void TriggerEvent(uint32_t event_type, uint32_t event_index);
@ -1115,6 +1116,15 @@ void CommandProcessor::RenderTextureBarrier(uint64_t vaddr, uint64_t size)
GraphicsRenderRenderTextureBarrier(m_buffer[m_current_buffer], vaddr, size);
}
void CommandProcessor::DepthStencilBarrier(uint64_t vaddr, uint64_t size)
{
Core::LockGuard lock(m_mutex);
EXIT_IF(m_current_buffer < 0 || m_current_buffer >= VK_BUFFERS_NUM);
GraphicsRenderDepthStencilBarrier(m_buffer[m_current_buffer], vaddr, size);
}
void CommandProcessor::TriggerEvent(uint32_t event_type, uint32_t event_index)
{
Core::LockGuard lock(m_mutex);
@ -1902,6 +1912,17 @@ KYTY_HW_CTX_PARSER(hw_ctx_set_vs_shader)
return 28;
}
KYTY_HW_CTX_PARSER(hw_ctx_update_vs_shader)
{
EXIT_NOT_IMPLEMENTED(cmd_id != 0xc01b103c);
auto shader_modifier = buffer[0];
cp->GetCtx()->UpdateVsShader(reinterpret_cast<const HW::VsStageRegisters*>(buffer + 1), shader_modifier);
return 28;
}
KYTY_HW_CTX_PARSER(hw_ctx_set_vs_embedded)
{
EXIT_NOT_IMPLEMENTED(cmd_id != 0xc01b1034);
@ -1961,6 +1982,25 @@ KYTY_HW_CTX_PARSER(hw_ctx_set_ps_shader)
return 39;
}
KYTY_HW_CTX_PARSER(hw_ctx_update_ps_shader)
{
EXIT_NOT_IMPLEMENTED(cmd_id != 0xc0261040);
HW::PsStageRegisters r {};
r.data_addr = (static_cast<uint64_t>(buffer[0]) << 8u) | (static_cast<uint64_t>(buffer[1]) << 40u);
r.vgprs = (buffer[2] >> Pm4::SPI_SHADER_PGM_RSRC1_PS_VGPRS_SHIFT) & Pm4::SPI_SHADER_PGM_RSRC1_PS_VGPRS_MASK;
r.sgprs = (buffer[2] >> Pm4::SPI_SHADER_PGM_RSRC1_PS_SGPRS_SHIFT) & Pm4::SPI_SHADER_PGM_RSRC1_PS_SGPRS_MASK;
r.scratch_en = (buffer[3] >> Pm4::SPI_SHADER_PGM_RSRC2_PS_SCRATCH_EN_SHIFT) & Pm4::SPI_SHADER_PGM_RSRC2_PS_SCRATCH_EN_MASK;
r.user_sgpr = (buffer[3] >> Pm4::SPI_SHADER_PGM_RSRC2_PS_USER_SGPR_SHIFT) & Pm4::SPI_SHADER_PGM_RSRC2_PS_USER_SGPR_MASK;
r.wave_cnt_en = (buffer[3] >> Pm4::SPI_SHADER_PGM_RSRC2_PS_WAVE_CNT_EN_SHIFT) & Pm4::SPI_SHADER_PGM_RSRC2_PS_WAVE_CNT_EN_MASK;
r.shader_z_format = buffer[4];
cp->GetCtx()->UpdatePsShader(&r);
return 39;
}
KYTY_HW_CTX_PARSER(hw_ctx_set_cs_shader)
{
EXIT_NOT_IMPLEMENTED(cmd_id != 0xC017101C);
@ -2500,7 +2540,12 @@ KYTY_CP_OP_PARSER(cp_op_acquire_mem)
// target_mask: 0x00004000 (Depth Target)
// extended_action: 0x04000000 (FlushAndInvalidateDbCache)
// action: 0x38 (WriteBackAndInvalidateL1andL2)
KYTY_NOT_IMPLEMENTED;
EXIT_IF(target_mask != 0x00004000);
EXIT_IF(extended_action != 0x04000000);
EXIT_IF(action != 0x38);
cp->DepthStencilBarrier(base_lo << 8u, size_lo << 8u);
cp->WriteBack();
}
break;
default:
@ -2668,6 +2713,8 @@ KYTY_CP_OP_PARSER(cp_op_nop)
case Pm4::R_POP_MARKER: return cp_op_pop_marker(cp, cmd_id, buffer, dw, num_dw); break;
case Pm4::R_VS_EMBEDDED: return hw_ctx_set_vs_embedded(cp, cmd_id, 0, buffer, dw); break;
case Pm4::R_PS_EMBEDDED: return hw_ctx_set_ps_embedded(cp, cmd_id, 0, buffer, dw); break;
case Pm4::R_VS_UPDATE: return hw_ctx_update_vs_shader(cp, cmd_id, 0, buffer, dw); break;
case Pm4::R_PS_UPDATE: return hw_ctx_update_ps_shader(cp, cmd_id, 0, buffer, dw); break;
default: break;
}

View File

@ -102,7 +102,7 @@ public:
static bool Enabled()
{
static const bool enabled = !Core::dbg_is_debugger_present();
static const bool enabled = false; // !Core::dbg_is_debugger_present();
return enabled;
}

View File

@ -165,6 +165,7 @@ static void* create_func(GraphicContext* ctx, const uint64_t* params, const uint
switch (pixel_format) // NOLINT
{
case static_cast<uint64_t>(RenderTextureFormat::R8G8B8A8Unorm): vk_format = VK_FORMAT_R8G8B8A8_UNORM; break;
case static_cast<uint64_t>(RenderTextureFormat::B8G8R8A8Unorm): vk_format = VK_FORMAT_B8G8R8A8_UNORM; break;
default: EXIT("unknown format: %" PRIu64 "\n", pixel_format);
}
@ -267,6 +268,7 @@ static void* create2_func(GraphicContext* ctx, CommandBuffer* buffer, const uint
switch (pixel_format) // NOLINT
{
case static_cast<uint64_t>(RenderTextureFormat::R8G8B8A8Unorm): vk_format = VK_FORMAT_R8G8B8A8_UNORM; break;
case static_cast<uint64_t>(RenderTextureFormat::B8G8R8A8Unorm): vk_format = VK_FORMAT_B8G8R8A8_UNORM; break;
default: EXIT("unknown format: %" PRIu64 "\n", pixel_format);
}

View File

@ -26,6 +26,10 @@ static VkFormat get_texture_format(uint32_t dfmt, uint32_t nfmt)
{
return VK_FORMAT_R8G8B8A8_UNORM;
}
if (nfmt == 0 && dfmt == 1)
{
return VK_FORMAT_R8_UNORM;
}
if (nfmt == 9 && dfmt == 37)
{
return VK_FORMAT_BC3_SRGB_BLOCK;

View File

@ -12,7 +12,34 @@
namespace Kyty::Libs::Graphics {
static void* create_func(GraphicContext* ctx, const uint64_t* /*params*/, const uint64_t* vaddr, const uint64_t* size, int vaddr_num,
static void update_func(GraphicContext* ctx, const uint64_t* /*params*/, void* obj, const uint64_t* vaddr, const uint64_t* size,
int vaddr_num)
{
KYTY_PROFILER_BLOCK("VertexBufferGpuObject::update_func");
EXIT_IF(vaddr_num != 1 || size == nullptr || vaddr == nullptr || *vaddr == 0);
EXIT_IF(obj == nullptr);
auto* vk_obj = static_cast<VulkanBuffer*>(obj);
VulkanBuffer staging_buffer {};
staging_buffer.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
staging_buffer.memory.property = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
VulkanCreateBuffer(ctx, *size, &staging_buffer);
EXIT_NOT_IMPLEMENTED(staging_buffer.buffer == nullptr);
void* data = nullptr;
VulkanMapMemory(ctx, &staging_buffer.memory, &data);
memcpy(data, reinterpret_cast<void*>(*vaddr), *size);
VulkanUnmapMemory(ctx, &staging_buffer.memory);
UtilCopyBuffer(&staging_buffer, vk_obj, *size);
VulkanDeleteBuffer(ctx, &staging_buffer);
}
static void* create_func(GraphicContext* ctx, const uint64_t* params, const uint64_t* vaddr, const uint64_t* size, int vaddr_num,
VulkanMemory* mem)
{
KYTY_PROFILER_BLOCK("VertexBufferGpuObject::Create");
@ -30,35 +57,11 @@ static void* create_func(GraphicContext* ctx, const uint64_t* /*params*/, const
VulkanCreateBuffer(ctx, *size, vk_obj);
EXIT_NOT_IMPLEMENTED(vk_obj->buffer == nullptr);
VulkanBuffer staging_buffer {};
staging_buffer.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
staging_buffer.memory.property = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
VulkanCreateBuffer(ctx, *size, &staging_buffer);
EXIT_NOT_IMPLEMENTED(staging_buffer.buffer == nullptr);
void* data = nullptr;
// vkMapMemory(ctx->device, staging_buffer.memory.memory, staging_buffer.memory.offset, *size, 0, &data);
VulkanMapMemory(ctx, &staging_buffer.memory, &data);
memcpy(data, reinterpret_cast<void*>(*vaddr), *size);
// vkUnmapMemory(ctx->device, staging_buffer.memory.memory);
VulkanUnmapMemory(ctx, &staging_buffer.memory);
UtilCopyBuffer(&staging_buffer, vk_obj, *size);
VulkanDeleteBuffer(ctx, &staging_buffer);
update_func(ctx, params, vk_obj, vaddr, size, vaddr_num);
return vk_obj;
}
static void update_func(GraphicContext* /*ctx*/, const uint64_t* /*params*/, void* /*obj*/, const uint64_t* /*vaddr*/,
const uint64_t* /*size*/, int /*vaddr_num*/)
{
KYTY_PROFILER_BLOCK("VertexBufferGpuObject::update_func");
KYTY_NOT_IMPLEMENTED;
}
static void delete_func(GraphicContext* ctx, void* obj, VulkanMemory* /*mem*/)
{
KYTY_PROFILER_BLOCK("VertexBufferGpuObject::delete_func");

View File

@ -212,7 +212,8 @@ static String dbg_fmt_to_str(const ShaderInstruction& inst)
case ShaderInstructionFormat::Vdata4VaddrSvSoffsIdxen: return U"Vdata4VaddrSvSoffsIdxen"; break;
case ShaderInstructionFormat::Vdata4VaddrSvSoffsIdxenFloat4: return U"Vdata4VaddrSvSoffsIdxenFloat4"; break;
case ShaderInstructionFormat::Vdata4Vaddr2SvSoffsOffenIdxenFloat4: return U"Vdata4Vaddr2SvSoffsOffenIdxenFloat4"; break;
case ShaderInstructionFormat::Vdata3Vaddr3StSsDmask7: return U"Vdata4Vaddr3StSsDmask7"; break;
case ShaderInstructionFormat::Vdata1Vaddr3StSsDmask1: return U"Vdata1Vaddr3StSsDmask1"; break;
case ShaderInstructionFormat::Vdata3Vaddr3StSsDmask7: return U"Vdata3Vaddr3StSsDmask7"; break;
case ShaderInstructionFormat::Vdata4Vaddr3StSsDmaskF: return U"Vdata4Vaddr3StSsDmaskF"; break;
case ShaderInstructionFormat::Vdata4Vaddr3StDmaskF: return U"Vdata4Vaddr3StDmaskF"; break;
case ShaderInstructionFormat::Vdata4Vaddr4StDmaskF: return U"Vdata4Vaddr4StDmaskF"; break;
@ -286,6 +287,7 @@ static String dbg_fmt_print(const ShaderInstruction& inst)
case ShaderInstructionFormat::Compr: s = U"compr"; break;
case ShaderInstructionFormat::Vm: s = U"vm"; break;
case ShaderInstructionFormat::L: s = String::FromPrintf("label_%04" PRIx32, inst.pc + 4 + inst.src[0].constant.i); break;
case ShaderInstructionFormat::Dmask1: s = U"dmask:0x1"; break;
case ShaderInstructionFormat::Dmask7: s = U"dmask:0x7"; break;
case ShaderInstructionFormat::DmaskF: s = U"dmask:0xf"; break;
case ShaderInstructionFormat::Gds: s = U"gds"; break;
@ -1532,7 +1534,7 @@ KYTY_SHADER_PARSER(shader_parse_mimg)
EXIT_NOT_IMPLEMENTED(glc == 1);
EXIT_NOT_IMPLEMENTED(slc == 1);
EXIT_NOT_IMPLEMENTED(unrm == 1);
EXIT_NOT_IMPLEMENTED(dmask != 0xf && dmask != 0x7);
// EXIT_NOT_IMPLEMENTED(dmask != 0xf && dmask != 0x7);
uint32_t size = 2;
@ -1584,14 +1586,27 @@ KYTY_SHADER_PARSER(shader_parse_mimg)
inst.src[0].size = 3;
inst.src[1].size = 8;
inst.src[2].size = 4;
if (dmask == 0x7)
switch (dmask)
{
inst.format = ShaderInstructionFormat::Vdata3Vaddr3StSsDmask7;
inst.dst.size = 3;
} else if (dmask == 0xf)
{
inst.format = ShaderInstructionFormat::Vdata4Vaddr3StSsDmaskF;
inst.dst.size = 4;
case 0x1:
{
inst.format = ShaderInstructionFormat::Vdata1Vaddr3StSsDmask1;
inst.dst.size = 1;
break;
}
case 0x7:
{
inst.format = ShaderInstructionFormat::Vdata3Vaddr3StSsDmask7;
inst.dst.size = 3;
break;
}
case 0xf:
{
inst.format = ShaderInstructionFormat::Vdata4Vaddr3StSsDmaskF;
inst.dst.size = 4;
break;
}
default:;
}
break;
default: printf("%s", dst->DbgDump().C_Str()); EXIT("unknown mimg opcode: 0x%02" PRIx32 " at addr 0x%08" PRIx32 "\n", opcode, pc);
@ -1600,7 +1615,7 @@ KYTY_SHADER_PARSER(shader_parse_mimg)
if (inst.format == ShaderInstructionFormat::Unknown)
{
printf("%s", dst->DbgDump().C_Str());
EXIT("unknown mimg format for opcode: 0x%02" PRIx32 " at addr 0x%08" PRIx32 "\n", opcode, pc)
EXIT("unknown mimg format for opcode: 0x%02" PRIx32 " at addr 0x%08" PRIx32 ", dmask: 0x%" PRIx32 "\n", opcode, pc, dmask);
}
dst->GetInstructions().Add(inst);

View File

@ -2217,6 +2217,61 @@ KYTY_RECOMPILER_FUNC(Recompile_Exp_Pos0Vsrc0Vsrc1Vsrc2Vsrc3Done)
return true;
}
KYTY_RECOMPILER_FUNC(Recompile_ImageSample_Vdata1Vaddr3StSsDmask1)
{
const auto& inst = code.GetInstructions().At(index);
const auto* bind_info = spirv->GetBindInfo();
// const auto& bind_params = spirv->GetBindParams();
if (bind_info != nullptr && bind_info->textures2D.textures2d_sampled_num > 0 && bind_info->samplers.samplers_num > 0)
{
auto dst_value0 = operand_variable_to_str(inst.dst, 0);
auto src0_value0 = operand_variable_to_str(inst.src[0], 0);
auto src0_value1 = operand_variable_to_str(inst.src[0], 1);
auto src0_value2 = operand_variable_to_str(inst.src[0], 2);
auto src1_value0 = operand_variable_to_str(inst.src[1], 0);
auto src2_value0 = operand_variable_to_str(inst.src[2], 0);
EXIT_NOT_IMPLEMENTED(dst_value0.type != SpirvType::Float);
EXIT_NOT_IMPLEMENTED(src0_value0.type != SpirvType::Float);
EXIT_NOT_IMPLEMENTED(src1_value0.type != SpirvType::Uint);
EXIT_NOT_IMPLEMENTED(src2_value0.type != SpirvType::Uint);
// TODO() check VSKIP
// TODO() check LOD_CLAMPED
static const char32_t* text = UR"(
%t24_<index> = OpLoad %uint %<src1_value0>
%t26_<index> = OpAccessChain %_ptr_UniformConstant_ImageS %textures2D_S %t24_<index>
%t27_<index> = OpLoad %ImageS %t26_<index>
%t33_<index> = OpLoad %uint %<src2_value0>
%t35_<index> = OpAccessChain %_ptr_UniformConstant_Sampler %samplers %t33_<index>
%t36_<index> = OpLoad %Sampler %t35_<index>
%t38_<index> = OpSampledImage %SampledImage %t27_<index> %t36_<index>
%t39_<index> = OpLoad %float %<src0_value0>
%t40_<index> = OpLoad %float %<src0_value1>
%t42_<index> = OpCompositeConstruct %v2float %t39_<index> %t40_<index>
%t43_<index> = OpImageSampleImplicitLod %v4float %t38_<index> %t42_<index>
OpStore %temp_v4float %t43_<index>
%t46_<index> = OpAccessChain %_ptr_Function_float %temp_v4float %uint_0
%t47_<index> = OpLoad %float %t46_<index>
OpStore %<dst_value0> %t47_<index>
)";
*dst_source += String(text)
.ReplaceStr(U"<index>", String::FromPrintf("%u", index))
.ReplaceStr(U"<src0_value0>", src0_value0.value)
.ReplaceStr(U"<src0_value1>", src0_value1.value)
.ReplaceStr(U"<src0_value2>", src0_value2.value)
.ReplaceStr(U"<src1_value0>", src1_value0.value)
.ReplaceStr(U"<src2_value0>", src2_value0.value)
.ReplaceStr(U"<dst_value0>", dst_value0.value);
return true;
}
return false;
}
KYTY_RECOMPILER_FUNC(Recompile_ImageSample_Vdata3Vaddr3StSsDmask7)
{
const auto& inst = code.GetInstructions().At(index);
@ -4855,6 +4910,7 @@ static RecompilerFunc g_recomp_func[] = {
{Recompile_Exp_Pos0Vsrc0Vsrc1Vsrc2Vsrc3Done, ShaderInstructionType::Exp, ShaderInstructionFormat::Pos0Vsrc0Vsrc1Vsrc2Vsrc3Done, {U""}},
{Recompile_ImageLoad_Vdata4Vaddr3StDmaskF, ShaderInstructionType::ImageLoad, ShaderInstructionFormat::Vdata4Vaddr3StDmaskF, {U""}},
{Recompile_ImageSample_Vdata1Vaddr3StSsDmask1, ShaderInstructionType::ImageSample, ShaderInstructionFormat::Vdata1Vaddr3StSsDmask1, {U""}},
{Recompile_ImageSample_Vdata3Vaddr3StSsDmask7, ShaderInstructionType::ImageSample, ShaderInstructionFormat::Vdata3Vaddr3StSsDmask7, {U""}},
{Recompile_ImageSample_Vdata4Vaddr3StSsDmaskF, ShaderInstructionType::ImageSample, ShaderInstructionFormat::Vdata4Vaddr3StSsDmaskF, {U""}},
{Recompile_ImageStore_Vdata4Vaddr3StDmaskF, ShaderInstructionType::ImageStore, ShaderInstructionFormat::Vdata4Vaddr3StDmaskF, {U""}},

View File

@ -678,6 +678,11 @@ void TileGetTextureSize(uint32_t dfmt, uint32_t nfmt, uint32_t width, uint32_t h
{ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, } },
{ 4, 7, 1920, 1080, 11, 2, true, {8847360, 12124160, 1048576, 262144, 65536, 16384, 2048, 1024, 1024, 1024, 1024, },
{ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, } },
// kDataFormatR8Unorm, 2048, 2048, kTileModeDisplay_LinearAligned
{ 1, 0, 2048, 2048, 12, 8, false, {4194304, 1048576, 262144, 65536, 16384, 4096, 2048, 1024, 512, 256, 256, 256, },
{ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, } },
{ 1, 0, 2048, 2048, 12, 8, true, {4194304, 1048576, 262144, 65536, 16384, 4096, 2048, 1024, 512, 256, 256, 256, },
{ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, } },
// clang-format on
};

View File

@ -1434,6 +1434,13 @@ static VkPhysicalDevice VulkanFindPhysicalDevice(VkInstance instance, VkSurfaceK
skip_device = true;
}
if (!skip_device &&
!CheckFormat(device, VK_FORMAT_R8_UNORM, true, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))
{
printf("Format VK_FORMAT_R8_UNORM cannot be used as texture\n");
skip_device = true;
}
if (!skip_device &&
!CheckFormat(device, VK_FORMAT_R8G8B8A8_SRGB, true, VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT))
{

View File

@ -9,6 +9,7 @@
#include "Kyty/Core/Vector.h"
#include "Kyty/Scripts/Scripts.h"
#include "Emulator/Audio.h"
#include "Emulator/Common.h"
#include "Emulator/Config.h"
#include "Emulator/Controller.h"
@ -19,6 +20,7 @@
#include "Emulator/Kernel/Memory.h"
#include "Emulator/Kernel/Pthread.h"
#include "Emulator/Libs/Libs.h"
#include "Emulator/Network.h"
#include "Emulator/Profiler.h"
#include "Emulator/RuntimeLinker.h"
#include "Emulator/Timer.h"
@ -75,31 +77,35 @@ static void Init(const Scripts::ScriptVar& cfg)
auto* slist = Core::SubsystemsList::Instance();
auto* log = Log::LogSubsystem::Instance();
auto* core = Core::CoreSubsystem::Instance();
auto* scripts = Scripts::ScriptsSubsystem::Instance();
auto* audio = Libs::Audio::AudioSubsystem::Instance();
auto* config = Config::ConfigSubsystem::Instance();
auto* pthread = Libs::LibKernel::PthreadSubsystem::Instance();
auto* timer = Loader::Timer::TimerSubsystem::Instance();
auto* file_system = Libs::LibKernel::FileSystem::FileSystemSubsystem::Instance();
auto* memory = Libs::LibKernel::Memory::MemorySubsystem::Instance();
auto* graphics = Libs::Graphics::GraphicsSubsystem::Instance();
auto* profiler = Profiler::ProfilerSubsystem::Instance();
auto* controller = Libs::Controller::ControllerSubsystem::Instance();
auto* core = Core::CoreSubsystem::Instance();
auto* file_system = Libs::LibKernel::FileSystem::FileSystemSubsystem::Instance();
auto* graphics = Libs::Graphics::GraphicsSubsystem::Instance();
auto* log = Log::LogSubsystem::Instance();
auto* memory = Libs::LibKernel::Memory::MemorySubsystem::Instance();
auto* network = Libs::Network::NetworkSubsystem::Instance();
auto* profiler = Profiler::ProfilerSubsystem::Instance();
auto* pthread = Libs::LibKernel::PthreadSubsystem::Instance();
auto* scripts = Scripts::ScriptsSubsystem::Instance();
auto* timer = Loader::Timer::TimerSubsystem::Instance();
slist->Add(config, {core, scripts});
slist->InitAll(true);
Config::Load(cfg);
slist->Add(log, {core, config});
slist->Add(pthread, {core, log, timer});
slist->Add(timer, {core, log});
slist->Add(memory, {core, log});
slist->Add(audio, {core, log, pthread, memory});
slist->Add(controller, {core, log, config});
slist->Add(file_system, {core, log, pthread});
slist->Add(graphics, {core, log, pthread, memory, config, profiler, controller});
slist->Add(log, {core, config});
slist->Add(memory, {core, log});
slist->Add(network, {core, log, pthread});
slist->Add(profiler, {core, config});
slist->Add(pthread, {core, log, timer});
slist->Add(timer, {core, log});
slist->InitAll(true);
}
@ -160,6 +166,22 @@ KYTY_SCRIPT_FUNC(kyty_load_elf_func)
return 0;
}
KYTY_SCRIPT_FUNC(kyty_save_main_elf_func)
{
if (Scripts::ArgGetVarCount() != 1)
{
EXIT("invalid args\n");
}
Scripts::ScriptVar elf = Scripts::ArgGetVar(0);
auto* rt = Core::Singleton<Loader::RuntimeLinker>::Instance();
rt->SaveMainProgram(Libs::LibKernel::FileSystem::GetRealFilename(elf.ToString()));
return 0;
}
KYTY_SCRIPT_FUNC(kyty_load_symbols_func)
{
auto count = Scripts::ArgGetVarCount();
@ -342,6 +364,7 @@ void kyty_reg()
Scripts::RegisterFunc("kyty_init", LuaFunc::kyty_init_func, LuaFunc::kyty_help);
Scripts::RegisterFunc("kyty_load_cfg", LuaFunc::kyty_load_cfg_func, LuaFunc::kyty_help);
Scripts::RegisterFunc("kyty_load_elf", LuaFunc::kyty_load_elf_func, LuaFunc::kyty_help);
Scripts::RegisterFunc("kyty_save_main_elf", LuaFunc::kyty_save_main_elf_func, LuaFunc::kyty_help);
Scripts::RegisterFunc("kyty_load_symbols", LuaFunc::kyty_load_symbols_func, LuaFunc::kyty_help);
Scripts::RegisterFunc("kyty_dbg_dump", LuaFunc::kyty_dbg_dump_func, LuaFunc::kyty_help);
Scripts::RegisterFunc("kyty_execute", LuaFunc::kyty_execute_func, LuaFunc::kyty_help);

View File

@ -0,0 +1,30 @@
#include "Emulator/Audio.h"
#include "Emulator/Common.h"
#include "Emulator/Libs/Libs.h"
#include "Emulator/SymbolDatabase.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs {
namespace LibVoiceQoS {
LIB_VERSION("VoiceQoS", 1, "VoiceQoS", 0, 0);
namespace VoiceQoS = Audio::VoiceQoS;
LIB_DEFINE(InitAudio_1_VoiceQoS)
{
LIB_FUNC("U8IfNl6-Css", VoiceQoS::VoiceQoSInit);
}
} // namespace LibVoiceQoS
LIB_DEFINE(InitAudio_1)
{
LibVoiceQoS::InitAudio_1_VoiceQoS(s);
}
} // namespace Kyty::Libs
#endif // KYTY_EMU_ENABLED

View File

@ -0,0 +1,30 @@
#include "Emulator/Common.h"
#include "Emulator/Dialog.h"
#include "Emulator/Libs/Libs.h"
#include "Emulator/SymbolDatabase.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs {
namespace LibCommonDialog {
LIB_VERSION("CommonDialog", 1, "CommonDialog", 1, 1);
namespace CommonDialog = Dialog::CommonDialog;
LIB_DEFINE(InitDialog_1_CommonDialog)
{
LIB_FUNC("uoUpLGNkygk", CommonDialog::CommonDialogInitialize);
}
} // namespace LibCommonDialog
LIB_DEFINE(InitDialog_1)
{
LibCommonDialog::InitDialog_1_CommonDialog(s);
}
} // namespace Kyty::Libs
#endif // KYTY_EMU_ENABLED

View File

@ -122,6 +122,17 @@ static KYTY_SYSV_ABI void stack_chk_fail()
EXIT("stack fail!!!");
}
static KYTY_SYSV_ABI int sigprocmask(int /*how*/, const void* /*set*/, void* /*oset*/)
{
// PRINT_NAME();
// printf("\t how = %d\n", how);
// printf("\t set = %016" PRIx64 "\n", reinterpret_cast<uint64_t>(set));
// printf("\t oset = %016" PRIx64 "\n", reinterpret_cast<uint64_t>(oset));
return 0;
}
static KYTY_SYSV_ABI KernelModule KernelLoadStartModule(const char* module_file_name, size_t args, const void* argp, uint32_t flags,
const KernelLoadModuleOpt* opt, int* res)
{
@ -511,6 +522,9 @@ LIB_DEFINE(InitLibKernel_1_Pthread)
LIB_FUNC("8+s5BzZjxSg", LibKernel::PthreadAttrGetaffinity);
LIB_FUNC("nsYoNRywwNg", LibKernel::PthreadAttrInit);
LIB_FUNC("JaRMy+QcpeU", LibKernel::PthreadAttrGetdetachstate);
LIB_FUNC("Ru36fiTtJzA", LibKernel::PthreadAttrGetstackaddr);
LIB_FUNC("-fA+7ZlGDQs", LibKernel::PthreadAttrGetstacksize);
LIB_FUNC("txHtngJ+eyc", LibKernel::PthreadAttrGetguardsize);
LIB_FUNC("UTXzJbWhhTE", LibKernel::PthreadAttrSetstacksize);
LIB_FUNC("-Wreprtu0Qs", LibKernel::PthreadAttrSetdetachstate);
LIB_FUNC("eXbUSpEaTsA", LibKernel::PthreadAttrSetinheritsched);
@ -573,6 +587,7 @@ LIB_DEFINE(InitLibKernel_1)
LIB_FUNC("Xjoosiw+XPI", LibKernel::KernelUuidCreate);
LIB_FUNC("WslcK1FQcGI", LibKernel::KernelIsNeoMode);
LIB_FUNC("9BcDykPmo1I", LibKernel::get_error_addr);
LIB_FUNC("6xVpy0Fdq+I", LibKernel::sigprocmask);
LIB_FUNC("1jfXLRVzisc", LibKernel::KernelUsleep);
LIB_FUNC("rNhWz+lvOMU", LibKernel::KernelSetThreadDtors);

View File

@ -0,0 +1,179 @@
#include "Kyty/Core/Common.h"
#include "Emulator/Common.h"
#include "Emulator/Libs/Libs.h"
#include "Emulator/Network.h"
#include "Emulator/SymbolDatabase.h"
#ifdef KYTY_EMU_ENABLED
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define NET_CALL(func) \
[&]() \
{ \
auto result = func; \
if (result < 0) \
{ \
*GetNetErrorAddr() = result; \
} \
return result; \
}()
namespace Kyty::Libs {
namespace Network::Net {
struct NetEtherAddr;
} // namespace Network::Net
namespace LibNet {
LIB_VERSION("Net", 1, "Net", 1, 1);
static thread_local int g_net_errno = 0;
namespace Net = Network::Net;
KYTY_SYSV_ABI int* GetNetErrorAddr()
{
return &g_net_errno;
}
static int KYTY_SYSV_ABI NetInit()
{
return NET_CALL(Net::NetInit());
}
int KYTY_SYSV_ABI NetPoolCreate(const char* name, int size, int flags)
{
return NET_CALL(Net::NetPoolCreate(name, size, flags));
}
int KYTY_SYSV_ABI NetInetPton(int af, const char* src, void* dst)
{
return NET_CALL(Net::NetInetPton(af, src, dst));
}
int KYTY_SYSV_ABI NetEtherNtostr(const Net::NetEtherAddr* n, char* str, size_t len)
{
return NET_CALL(Net::NetEtherNtostr(n, str, len));
}
int KYTY_SYSV_ABI NetGetMacAddress(Net::NetEtherAddr* addr, int flags)
{
return NET_CALL(Net::NetGetMacAddress(addr, flags));
}
LIB_DEFINE(InitNet_1_Net)
{
LIB_FUNC("Nlev7Lg8k3A", LibNet::NetInit);
LIB_FUNC("dgJBaeJnGpo", LibNet::NetPoolCreate);
LIB_FUNC("8Kcp5d-q1Uo", LibNet::NetInetPton);
LIB_FUNC("v6M4txecCuo", LibNet::NetEtherNtostr);
LIB_FUNC("6Oc0bLsIYe0", LibNet::NetGetMacAddress);
}
} // namespace LibNet
namespace LibSsl {
LIB_VERSION("Ssl", 1, "Ssl", 1, 1);
namespace Ssl = Network::Ssl;
LIB_DEFINE(InitNet_1_Ssl)
{
LIB_FUNC("hdpVEUDFW3s", Ssl::SslInit);
}
} // namespace LibSsl
namespace LibHttp {
LIB_VERSION("Http", 1, "Http", 1, 1);
namespace Http = Network::Http;
LIB_DEFINE(InitNet_1_Http)
{
LIB_FUNC("A9cVMUtEp4Y", Http::HttpInit);
LIB_FUNC("0gYjPTR-6cY", Http::HttpCreateTemplate);
}
} // namespace LibHttp
namespace LibNetCtl {
LIB_VERSION("NetCtl", 1, "NetCtl", 1, 1);
namespace NetCtl = Network::NetCtl;
LIB_DEFINE(InitNet_1_NetCtl)
{
LIB_FUNC("gky0+oaNM4k", NetCtl::NetCtlInit);
LIB_FUNC("JO4yuTuMoKI", NetCtl::NetCtlGetNatInfo);
LIB_FUNC("iQw3iQPhvUQ", NetCtl::NetCtlCheckCallback);
LIB_FUNC("uBPlr0lbuiI", NetCtl::NetCtlGetState);
LIB_FUNC("UJ+Z7Q+4ck0", NetCtl::NetCtlRegisterCallback);
LIB_FUNC("obuxdTiwkF8", NetCtl::NetCtlGetInfo);
}
} // namespace LibNetCtl
namespace LibNpManager {
LIB_VERSION("NpManager", 1, "NpManager", 1, 1);
namespace NpManager = Network::NpManager;
LIB_DEFINE(InitNet_1_NpManager)
{
LIB_FUNC("3Zl8BePTh9Y", NpManager::NpCheckCallback);
LIB_FUNC("Ec63y59l9tw", NpManager::NpSetNpTitleId);
LIB_FUNC("A2CQ3kgSopQ", NpManager::NpSetContentRestriction);
LIB_FUNC("VfRSmPmj8Q8", NpManager::NpRegisterStateCallback);
LIB_FUNC("uFJpaKNBAj4", NpManager::NpRegisterGamePresenceCallback);
LIB_FUNC("GImICnh+boA", NpManager::NpRegisterPlusEventCallback);
}
} // namespace LibNpManager
namespace LibNpTrophy {
LIB_VERSION("NpTrophy", 1, "NpTrophy", 1, 1);
namespace NpTrophy = Network::NpTrophy;
LIB_DEFINE(InitNet_1_NpTrophy)
{
LIB_FUNC("q7U6tEAQf7c", NpTrophy::NpTrophyCreateHandle);
}
} // namespace LibNpTrophy
namespace LibNpWebApi {
LIB_VERSION("NpWebApi", 1, "NpWebApi", 1, 1);
namespace NpWebApi = Network::NpWebApi;
LIB_DEFINE(InitNet_1_NpWebApi)
{
LIB_FUNC("G3AnLNdRBjE", NpWebApi::NpWebApiInitialize);
}
} // namespace LibNpWebApi
LIB_DEFINE(InitNet_1)
{
LibNet::InitNet_1_Net(s);
LibSsl::InitNet_1_Ssl(s);
LibHttp::InitNet_1_Http(s);
LibNetCtl::InitNet_1_NetCtl(s);
LibNpManager::InitNet_1_NpManager(s);
LibNpTrophy::InitNet_1_NpTrophy(s);
LibNpWebApi::InitNet_1_NpWebApi(s);
}
} // namespace Kyty::Libs
#endif // KYTY_EMU_ENABLED

View File

@ -0,0 +1,88 @@
#include "Kyty/Core/Common.h"
#include "Kyty/Core/DbgAssert.h"
#include "Kyty/Core/String.h"
#include "Emulator/Common.h"
#include "Emulator/Libs/Errno.h"
#include "Emulator/Libs/Libs.h"
#include "Emulator/SymbolDatabase.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs {
LIB_VERSION("PlayGo", 1, "PlayGo", 1, 0);
namespace PlayGo {
struct PlayGoInitParams
{
const void* buf_addr;
uint32_t buf_size;
uint32_t reserved;
};
int KYTY_SYSV_ABI PlayGoInitialize(const PlayGoInitParams* init)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(init == nullptr);
printf("\t buf_addr = %016" PRIx64 "\n", reinterpret_cast<uint64_t>(init->buf_addr));
printf("\t buf_size = %" PRIu32 "\n", init->buf_size);
printf("\t reserved = %" PRId32 "\n", init->reserved);
return OK;
}
int KYTY_SYSV_ABI PlayGoOpen(int* out_handle, const void* param)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(out_handle == nullptr);
EXIT_NOT_IMPLEMENTED(param != nullptr);
*out_handle = 1;
return OK;
}
int KYTY_SYSV_ABI PlayGoGetLocus(int handle, const uint16_t* chunk_ids, uint32_t number_of_entries, int8_t* out_loci)
{
PRINT_NAME();
printf("\t handle = %d\n", handle);
EXIT_NOT_IMPLEMENTED(handle != 1);
EXIT_NOT_IMPLEMENTED(chunk_ids == nullptr);
EXIT_NOT_IMPLEMENTED(out_loci == nullptr);
EXIT_NOT_IMPLEMENTED(number_of_entries != 1);
for (uint32_t i = 0; i < number_of_entries; i++)
{
printf("\t chunk_ids[%u] = %" PRIu16 "\n", i, chunk_ids[i]);
if (chunk_ids[i] == 0)
{
out_loci[i] = 3;
} else
{
return PLAYGO_ERROR_BAD_CHUNK_ID;
}
}
return OK;
}
} // namespace PlayGo
LIB_DEFINE(InitPlayGo_1)
{
LIB_FUNC("ts6GlZOKRrE", PlayGo::PlayGoInitialize);
LIB_FUNC("M1Gma1ocrGE", PlayGo::PlayGoOpen);
LIB_FUNC("uWIYLFkkwqk", PlayGo::PlayGoGetLocus);
}
} // namespace Kyty::Libs
#endif // KYTY_EMU_ENABLED

View File

@ -0,0 +1,54 @@
#include "Kyty/Core/String.h"
#include "Emulator/Common.h"
#include "Emulator/Libs/Errno.h"
#include "Emulator/Libs/Libs.h"
#include "Emulator/SymbolDatabase.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs {
LIB_VERSION("SaveData", 1, "SaveData", 1, 1);
namespace SaveData {
int KYTY_SYSV_ABI SaveDataInitialize(const void* /*init*/)
{
PRINT_NAME();
// EXIT_NOT_IMPLEMENTED(init != nullptr);
return OK;
}
int KYTY_SYSV_ABI SaveDataInitialize2(const void* /*init*/)
{
PRINT_NAME();
// EXIT_NOT_IMPLEMENTED(init != nullptr);
return OK;
}
int KYTY_SYSV_ABI SaveDataInitialize3(const void* /*init*/)
{
PRINT_NAME();
// EXIT_NOT_IMPLEMENTED(init != nullptr);
return OK;
}
} // namespace SaveData
LIB_DEFINE(InitSaveData_1)
{
LIB_FUNC("ZkZhskCPXFw", SaveData::SaveDataInitialize);
LIB_FUNC("l1NmDeDpNGU", SaveData::SaveDataInitialize2);
LIB_FUNC("TywrFKCoLGY", SaveData::SaveDataInitialize3);
}
} // namespace Kyty::Libs
#endif // KYTY_EMU_ENABLED

View File

@ -1,3 +1,4 @@
#include "Kyty/Core/Common.h"
#include "Kyty/Core/DbgAssert.h"
#include "Kyty/Core/String.h"
@ -79,6 +80,16 @@ namespace SystemService {
[[maybe_unused]] constexpr int PARAM_ENTER_BUTTON_ASSIGN_CIRCLE = 0;
[[maybe_unused]] constexpr int PARAM_ENTER_BUTTON_ASSIGN_CROSS = 1;
struct SystemServiceStatus
{
int32_t event_num = 0;
bool is_system_ui_overlaid = false;
bool is_in_background_execution = false;
bool is_cpu_mode_7cpu_normal = true;
bool is_game_live_streaming_on_air = false;
bool is_out_of_vr_play_area = false;
};
static int KYTY_SYSV_ABI SystemServiceHideSplashScreen()
{
PRINT_NAME();
@ -116,12 +127,27 @@ static int KYTY_SYSV_ABI SystemServiceParamGetInt(int param_id, int* value)
return OK;
}
static int KYTY_SYSV_ABI SystemServiceGetStatus(SystemServiceStatus* status)
{
PRINT_NAME();
if (status == nullptr)
{
return SYSTEM_SERVICE_ERROR_PARAMETER;
}
*status = SystemServiceStatus();
return OK;
}
} // namespace SystemService
LIB_DEFINE(InitSystemService_1)
{
LIB_FUNC("Vo5V8KAwCmk", SystemService::SystemServiceHideSplashScreen);
LIB_FUNC("fZo48un7LK4", SystemService::SystemServiceParamGetInt);
LIB_FUNC("rPo6tV8D9bM", SystemService::SystemServiceGetStatus);
}
} // namespace Kyty::Libs

View File

@ -2,6 +2,7 @@
#include "Kyty/Core/String.h"
#include "Emulator/Common.h"
#include "Emulator/Libs/Errno.h"
#include "Emulator/Libs/Libs.h"
#include "Emulator/SymbolDatabase.h"
@ -17,7 +18,7 @@ static KYTY_SYSV_ABI int UserServiceInitialize(const void* /*params*/)
{
PRINT_NAME();
return 0;
return OK;
}
static KYTY_SYSV_ABI int UserServiceGetInitialUser(int* user_id)
@ -28,7 +29,16 @@ static KYTY_SYSV_ABI int UserServiceGetInitialUser(int* user_id)
*user_id = 1;
return 0;
return OK;
}
static KYTY_SYSV_ABI int UserServiceGetEvent(void* event)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(event == nullptr);
return USER_SERVICE_ERROR_NO_EVENT;
}
} // namespace UserService
@ -37,6 +47,7 @@ LIB_DEFINE(InitUserService_1)
{
LIB_FUNC("j3YMu1MVNNo", UserService::UserServiceInitialize);
LIB_FUNC("CdWp0oHWGr0", UserService::UserServiceGetInitialUser);
LIB_FUNC("yH17Q6NWtVg", UserService::UserServiceGetEvent);
}
} // namespace Kyty::Libs

View File

@ -8,30 +8,40 @@ namespace LibcInternal {
LIB_DEFINE(InitLibcInternal_1);
} // namespace LibcInternal
LIB_DEFINE(InitAudio_1);
LIB_DEFINE(InitDebug_1);
LIB_DEFINE(InitDialog_1);
LIB_DEFINE(InitDiscMap_1);
LIB_DEFINE(InitGraphicsDriver_1);
LIB_DEFINE(InitLibC_1);
LIB_DEFINE(InitLibKernel_1);
LIB_DEFINE(InitVideoOut_1);
LIB_DEFINE(InitNet_1);
LIB_DEFINE(InitPad_1);
LIB_DEFINE(InitPlayGo_1);
LIB_DEFINE(InitSaveData_1);
LIB_DEFINE(InitSysmodule_1);
LIB_DEFINE(InitDiscMap_1);
LIB_DEFINE(InitDebug_1);
LIB_DEFINE(InitGraphicsDriver_1);
LIB_DEFINE(InitSystemService_1);
LIB_DEFINE(InitUserService_1);
LIB_DEFINE(InitPad_1);
LIB_DEFINE(InitVideoOut_1);
bool Init(const String& id, Loader::SymbolDatabase* s)
{
LIB_CHECK(U"libAudio_1", InitAudio_1);
LIB_CHECK(U"libc_1", InitLibC_1);
LIB_CHECK(U"libc_internal_1", LibcInternal::InitLibcInternal_1);
LIB_CHECK(U"libkernel_1", InitLibKernel_1);
LIB_CHECK(U"libVideoOut_1", InitVideoOut_1);
LIB_CHECK(U"libSysmodule_1", InitSysmodule_1);
LIB_CHECK(U"libDiscMap_1", InitDiscMap_1);
LIB_CHECK(U"libDebug_1", InitDebug_1);
LIB_CHECK(U"libDialog_1", InitDialog_1);
LIB_CHECK(U"libDiscMap_1", InitDiscMap_1);
LIB_CHECK(U"libGraphicsDriver_1", InitGraphicsDriver_1);
LIB_CHECK(U"libUserService_1", InitUserService_1);
LIB_CHECK(U"libSystemService_1", InitSystemService_1);
LIB_CHECK(U"libkernel_1", InitLibKernel_1);
LIB_CHECK(U"libNet_1", InitNet_1);
LIB_CHECK(U"libPad_1", InitPad_1);
LIB_CHECK(U"libPlayGo_1", InitPlayGo_1);
LIB_CHECK(U"libSaveData_1", InitSaveData_1);
LIB_CHECK(U"libSysmodule_1", InitSysmodule_1);
LIB_CHECK(U"libSystemService_1", InitSystemService_1);
LIB_CHECK(U"libUserService_1", InitUserService_1);
LIB_CHECK(U"libVideoOut_1", InitVideoOut_1);
return false;
}

View File

@ -143,6 +143,13 @@ void SetDirection(Direction dir)
g_dir = dir;
}
Direction GetDirection()
{
EXIT_IF(!Log::g_log_initialized);
return g_dir;
}
void SetOutputFile(const String& file_name, Core::File::Encoding enc)
{
EXIT_IF(!Log::g_log_initialized);

View File

@ -0,0 +1,742 @@
#include "Emulator/Network.h"
#include "Kyty/Core/ByteBuffer.h"
#include "Kyty/Core/Common.h"
#include "Kyty/Core/DbgAssert.h"
#include "Kyty/Core/String.h"
#include "Kyty/Core/Threads.h"
#include "Kyty/Core/Vector.h"
#include "Emulator/Libs/Errno.h"
#include "Emulator/Libs/Libs.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs::Network {
class Network
{
public:
Network() = default;
virtual ~Network() = default;
KYTY_CLASS_NO_COPY(Network);
int PoolCreate(const char* name, int size);
bool PoolDestroy(int memid);
int SslInit(uint64_t pool_size);
bool SslTerm(int ssl_ctx_id);
int HttpInit(int memid, int ssl_ctx_id, uint64_t pool_size);
bool HttpTerm(int http_ctx_id);
int HttpCreateTemplate(int http_ctx_id, const char* user_agent, int http_ver, bool is_auto_proxy_conf);
bool HttpDeleteTemplate(int tmpl_id);
bool HttpValid(int http_ctx_id);
private:
struct Pool
{
bool used = false;
String name;
int size = 0;
};
struct Ssl
{
bool used = false;
uint64_t size = 0;
};
struct Http
{
bool used = false;
uint64_t size = 0;
int memid = 0;
int ssl_ctx_id = 0;
};
struct HttpTemplate
{
bool used = false;
int http_ctx_id = 0;
String user_agent;
int http_ver = 0;
bool is_auto_proxy_conf = true;
};
static constexpr int POOLS_MAX = 32;
static constexpr int SSL_MAX = 32;
static constexpr int HTTP_MAX = 32;
Core::Mutex m_mutex;
Pool m_pools[POOLS_MAX];
Ssl m_ssl[SSL_MAX];
Http m_http[HTTP_MAX];
Vector<HttpTemplate> m_templates;
};
static Network* g_net = nullptr;
KYTY_SUBSYSTEM_INIT(Network)
{
EXIT_IF(g_net != nullptr);
g_net = new Network;
}
KYTY_SUBSYSTEM_UNEXPECTED_SHUTDOWN(Network) {}
KYTY_SUBSYSTEM_DESTROY(Network) {}
int Network::PoolCreate(const char* name, int size)
{
Core::LockGuard lock(m_mutex);
for (int id = 0; id < POOLS_MAX; id++)
{
if (!m_pools[id].used)
{
m_pools[id].used = true;
m_pools[id].size = size;
m_pools[id].name = String::FromUtf8(name);
return id;
}
}
return -1;
}
bool Network::PoolDestroy(int memid)
{
Core::LockGuard lock(m_mutex);
if (memid >= 0 && memid < POOLS_MAX && m_pools[memid].used)
{
m_pools[memid].used = false;
return true;
}
return false;
}
int Network::SslInit(uint64_t pool_size)
{
Core::LockGuard lock(m_mutex);
for (int id = 0; id < SSL_MAX; id++)
{
if (!m_ssl[id].used)
{
m_ssl[id].used = true;
m_ssl[id].size = pool_size;
return id;
}
}
return -1;
}
bool Network::SslTerm(int ssl_ctx_id)
{
Core::LockGuard lock(m_mutex);
if (ssl_ctx_id >= 0 && ssl_ctx_id < SSL_MAX && m_ssl[ssl_ctx_id].used)
{
m_ssl[ssl_ctx_id].used = false;
return true;
}
return false;
}
int Network::HttpInit(int memid, int ssl_ctx_id, uint64_t pool_size)
{
Core::LockGuard lock(m_mutex);
if (ssl_ctx_id >= 0 && ssl_ctx_id < SSL_MAX && m_ssl[ssl_ctx_id].used && memid >= 0 && memid < POOLS_MAX && m_pools[memid].used)
{
for (int id = 0; id < HTTP_MAX; id++)
{
if (!m_http[id].used)
{
m_http[id].used = true;
m_http[id].size = pool_size;
m_http[id].ssl_ctx_id = ssl_ctx_id;
m_http[id].memid = memid;
return id;
}
}
}
return -1;
}
bool Network::HttpValid(int http_ctx_id)
{
Core::LockGuard lock(m_mutex);
return (http_ctx_id >= 0 && http_ctx_id < HTTP_MAX && m_http[http_ctx_id].used);
}
bool Network::HttpTerm(int http_ctx_id)
{
Core::LockGuard lock(m_mutex);
if (HttpValid(http_ctx_id))
{
m_http[http_ctx_id].used = false;
return true;
}
return false;
}
int Network::HttpCreateTemplate(int http_ctx_id, const char* user_agent, int http_ver, bool is_auto_proxy_conf)
{
Core::LockGuard lock(m_mutex);
if (http_ctx_id >= 0 && http_ctx_id < HTTP_MAX && m_http[http_ctx_id].used)
{
HttpTemplate tn {};
tn.used = true;
tn.http_ver = http_ver;
tn.user_agent = String::FromUtf8(user_agent);
tn.is_auto_proxy_conf = is_auto_proxy_conf;
tn.http_ctx_id = http_ctx_id;
int index = 0;
for (auto& t: m_templates)
{
if (!t.used)
{
t = tn;
return index;
}
index++;
}
m_templates.Add(tn);
return index;
}
return -1;
}
bool Network::HttpDeleteTemplate(int tmpl_id)
{
Core::LockGuard lock(m_mutex);
if (m_templates.IndexValid(tmpl_id) && m_templates.At(tmpl_id).used)
{
m_templates[tmpl_id].used = false;
return true;
}
return false;
}
namespace Net {
LIB_NAME("Net", "Net");
struct NetEtherAddr
{
uint8_t data[6] = {0};
};
int KYTY_SYSV_ABI NetInit()
{
PRINT_NAME();
return OK;
}
int KYTY_SYSV_ABI NetTerm()
{
PRINT_NAME();
return OK;
}
int KYTY_SYSV_ABI NetPoolCreate(const char* name, int size, int flags)
{
PRINT_NAME();
printf("\t name = %s\n", name);
printf("\t size = %d\n", size);
printf("\t flags = %d\n", flags);
EXIT_IF(g_net == nullptr);
EXIT_NOT_IMPLEMENTED(flags != 0);
EXIT_NOT_IMPLEMENTED(size == 0);
int id = g_net->PoolCreate(name, size);
if (id < 0)
{
return NET_ERROR_ENFILE;
}
return id;
}
int KYTY_SYSV_ABI NetPoolDestroy(int memid)
{
PRINT_NAME();
EXIT_IF(g_net == nullptr);
if (!g_net->PoolDestroy(memid))
{
return NET_ERROR_EBADF;
}
return OK;
}
int KYTY_SYSV_ABI NetInetPton(int af, const char* src, void* dst)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(af != 2);
EXIT_NOT_IMPLEMENTED(src == nullptr);
EXIT_NOT_IMPLEMENTED(dst == nullptr);
EXIT_NOT_IMPLEMENTED(strcmp(src, "127.0.0.1") != 0);
printf("\t src = %.16s\n", src);
*static_cast<uint32_t*>(dst) = 0x7f000001;
return OK;
}
int KYTY_SYSV_ABI NetEtherNtostr(const NetEtherAddr* n, char* str, size_t len)
{
PRINT_NAME();
NetEtherAddr zero {};
EXIT_NOT_IMPLEMENTED(len != 18);
EXIT_NOT_IMPLEMENTED(n == nullptr);
EXIT_NOT_IMPLEMENTED(str == nullptr);
EXIT_NOT_IMPLEMENTED(memcmp(n->data, zero.data, sizeof(zero.data)) != 0);
strcpy(str, "00:00:00:00:00:00"); // NOLINT
return OK;
}
int KYTY_SYSV_ABI NetGetMacAddress(NetEtherAddr* addr, int flags)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(addr == nullptr);
EXIT_NOT_IMPLEMENTED(flags != 0);
memset(addr->data, 0, sizeof(addr->data));
return OK;
}
} // namespace Net
namespace Ssl {
LIB_NAME("Ssl", "Ssl");
int KYTY_SYSV_ABI SslInit(uint64_t pool_size)
{
PRINT_NAME();
printf("\t size = %" PRIu64 "\n", pool_size);
EXIT_IF(g_net == nullptr);
EXIT_NOT_IMPLEMENTED(pool_size == 0);
int id = g_net->SslInit(pool_size);
if (id < 0)
{
return SSL_ERROR_OUT_OF_SIZE;
}
return id + 1;
}
int KYTY_SYSV_ABI SslTerm(int ssl_ctx_id)
{
PRINT_NAME();
EXIT_IF(g_net == nullptr);
if (!g_net->SslTerm(ssl_ctx_id - 1))
{
return SSL_ERROR_INVALID_ID;
}
return OK;
}
} // namespace Ssl
namespace Http {
LIB_NAME("Http", "Http");
int KYTY_SYSV_ABI HttpInit(int memid, int ssl_ctx_id, uint64_t pool_size)
{
PRINT_NAME();
printf("\t memid = %d\n", memid);
printf("\t ssl_ctx_id = %d\n", ssl_ctx_id);
printf("\t size = %" PRIu64 "\n", pool_size);
EXIT_IF(g_net == nullptr);
EXIT_NOT_IMPLEMENTED(pool_size == 0);
int id = g_net->HttpInit(memid, ssl_ctx_id - 1, pool_size);
if (id < 0)
{
return HTTP_ERROR_OUT_OF_MEMORY;
}
return id + 1;
}
int KYTY_SYSV_ABI HttpTerm(int http_ctx_id)
{
PRINT_NAME();
EXIT_IF(g_net == nullptr);
if (!g_net->HttpTerm(http_ctx_id - 1))
{
return HTTP_ERROR_INVALID_ID;
}
return OK;
}
int KYTY_SYSV_ABI HttpCreateTemplate(int http_ctx_id, const char* user_agent, int http_ver, int is_auto_proxy_conf)
{
PRINT_NAME();
printf("\t http_ctx_id = %d\n", http_ctx_id);
printf("\t user_agent = %s\n", user_agent);
printf("\t http_ver = %d\n", http_ver);
printf("\t is_auto_proxy_conf = %d\n", is_auto_proxy_conf);
EXIT_IF(g_net == nullptr);
int id = g_net->HttpCreateTemplate(http_ctx_id, user_agent, http_ver, is_auto_proxy_conf != 0);
if (id < 0)
{
return HTTP_ERROR_OUT_OF_MEMORY;
}
return id + 1;
}
int KYTY_SYSV_ABI HttpDeleteTemplate(int tmpl_id)
{
PRINT_NAME();
EXIT_IF(g_net == nullptr);
if (!g_net->HttpDeleteTemplate(tmpl_id - 1))
{
return HTTP_ERROR_INVALID_ID;
}
return OK;
}
} // namespace Http
namespace NetCtl {
LIB_NAME("NetCtl", "NetCtl");
struct NetInAddr
{
uint32_t s_addr = 0;
};
struct NetEtherAddr
{
uint8_t data[6];
};
struct NetCtlNatInfo
{
unsigned int size = sizeof(NetCtlNatInfo);
int stunStatus = 0;
int natType = 0;
NetInAddr mappedAddr;
};
union NetCtlInfo
{
uint32_t device;
NetEtherAddr ether_addr;
uint32_t mtu;
uint32_t link;
NetEtherAddr bssid;
char ssid[32 + 1];
uint32_t wifi_security;
uint8_t rssi_dbm;
uint8_t rssi_percentage;
uint8_t channel;
uint32_t ip_config;
char dhcp_hostname[255 + 1];
char pppoe_auth_name[127 + 1];
char ip_address[16];
char netmask[16];
char default_route[16];
char primary_dns[16];
char secondary_dns[16];
uint32_t http_proxy_config;
char http_proxy_server[255 + 1];
uint16_t http_proxy_port;
};
int KYTY_SYSV_ABI NetCtlInit()
{
PRINT_NAME();
return OK;
}
void KYTY_SYSV_ABI NetCtlTerm()
{
PRINT_NAME();
}
int KYTY_SYSV_ABI NetCtlGetNatInfo(NetCtlNatInfo* nat_info)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(nat_info == nullptr);
EXIT_NOT_IMPLEMENTED(nat_info->size != sizeof(NetCtlNatInfo));
nat_info->stunStatus = 1;
nat_info->natType = 3;
nat_info->mappedAddr.s_addr = 0x7f000001;
return OK;
}
int KYTY_SYSV_ABI NetCtlCheckCallback()
{
PRINT_NAME();
return OK;
}
int KYTY_SYSV_ABI NetCtlGetState(int* state)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(state == nullptr);
*state = 0; // Disconnected
return OK;
}
int KYTY_SYSV_ABI NetCtlRegisterCallback(NetCtlCallback func, void* /*arg*/, int* cid)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(func == nullptr);
EXIT_NOT_IMPLEMENTED(cid == nullptr);
*cid = 1;
return OK;
}
int KYTY_SYSV_ABI NetCtlGetInfo(int code, NetCtlInfo* info)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(info == nullptr);
printf("\t code = %d\n", code);
switch (code)
{
case 2: memset(info->ether_addr.data, 0, sizeof(info->ether_addr.data)); break;
case 11: info->ip_config = 0; break;
case 14: strcpy(info->ip_address, "127.0.0.1"); break;
default: EXIT("unknown code: %d\n", code);
}
return OK;
}
} // namespace NetCtl
namespace NpManager {
LIB_NAME("NpManager", "NpManager");
struct NpTitleId
{
char id[12 + 1];
uint8_t padding[3];
};
struct NpTitleSecret
{
uint8_t data[128];
};
struct NpCountryCode
{
char data[2];
char term;
char padding[1];
};
struct NpAgeRestriction
{
NpCountryCode country_code;
int8_t age;
uint8_t padding[3];
};
struct NpContentRestriction
{
size_t size;
int8_t default_age_restriction;
char padding[3];
int32_t age_restriction_count;
const NpAgeRestriction* age_restriction;
};
int KYTY_SYSV_ABI NpCheckCallback()
{
PRINT_NAME();
return OK;
}
int KYTY_SYSV_ABI NpSetNpTitleId(const NpTitleId* title_id, const NpTitleSecret* title_secret)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(title_id == nullptr);
EXIT_NOT_IMPLEMENTED(title_secret == nullptr);
printf("\t title_id = %.12s\n", title_id->id);
printf("\t title_secret = %s\n", String::HexFromBin(Core::ByteBuffer(title_secret->data, 128)).C_Str());
return OK;
}
int KYTY_SYSV_ABI NpSetContentRestriction(const NpContentRestriction* restriction)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(restriction == nullptr);
EXIT_NOT_IMPLEMENTED(restriction->size != sizeof(NpContentRestriction));
printf("\t default_age_restriction = %" PRIi8 "\n", restriction->default_age_restriction);
printf("\t age_restriction_count = %" PRIi32 "\n", restriction->age_restriction_count);
for (int i = 0; i < restriction->age_restriction_count; i++)
{
printf("\t age_restriction[%d].age = %" PRIi8 "\n", i, restriction->age_restriction[i].age);
printf("\t age_restriction[%d].country_code.data = %.2s\n", i, restriction->age_restriction[i].country_code.data);
}
return OK;
}
int KYTY_SYSV_ABI NpRegisterStateCallback(void* /*callback*/, void* /*userdata*/)
{
PRINT_NAME();
return OK;
}
void KYTY_SYSV_ABI NpRegisterGamePresenceCallback(void* /*callback*/, void* /*userdata*/)
{
PRINT_NAME();
}
int KYTY_SYSV_ABI NpRegisterPlusEventCallback(void* /*callback*/, void* /*userdata*/)
{
PRINT_NAME();
return OK;
}
} // namespace NpManager
namespace NpTrophy {
LIB_NAME("NpTrophy", "NpTrophy");
int KYTY_SYSV_ABI NpTrophyCreateHandle(int* handle)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(handle == nullptr);
*handle = 1;
return OK;
}
} // namespace NpTrophy
namespace NpWebApi {
LIB_NAME("NpWebApi", "NpWebApi");
int KYTY_SYSV_ABI NpWebApiInitialize(int http_ctx_id, size_t pool_size)
{
PRINT_NAME();
EXIT_IF(g_net == nullptr);
printf("\t http_ctx_id = %d\n", http_ctx_id);
printf("\t pool_size = %" PRIu64 "\n", pool_size);
EXIT_NOT_IMPLEMENTED(!g_net->HttpValid(http_ctx_id - 1));
static int id = 0;
return ++id;
}
int KYTY_SYSV_ABI NpWebApiTerminate(int lib_ctx_id)
{
PRINT_NAME();
printf("\t lib_ctx_id = %d\n", lib_ctx_id);
return OK;
}
} // namespace NpWebApi
} // namespace Kyty::Libs::Network
#endif // KYTY_EMU_ENABLED

View File

@ -683,6 +683,24 @@ Program* RuntimeLinker::LoadProgram(const String& elf_name)
return program;
}
void RuntimeLinker::SaveMainProgram(const String& elf_name)
{
EXIT_NOT_IMPLEMENTED(!Core::Thread::IsMainThread());
Core::LockGuard lock(m_mutex);
for (const auto* p: m_programs)
{
EXIT_IF(p->elf == nullptr);
if (!p->elf->IsShared())
{
p->elf->Save(elf_name);
break;
}
}
}
void RuntimeLinker::Clear()
{
// EXIT_NOT_IMPLEMENTED(!Core::Thread::IsMainThread());

View File

@ -20,7 +20,7 @@
#define KYTY_LIBS \
{ \
"libc_internal_1", "libkernel_1", "libVideoOut_1", "libSysmodule_1", "libDiscMap_1", "libDebug_1", "libGraphicsDriver_1", \
"libUserService_1", "libSystemService_1", "libPad_1" \
"libUserService_1", "libSystemService_1", "libPad_1", "libNet_1", "libDialog_1", "libAudio_1", "libPlayGo_1", "libSaveData_1" \
}
template <class T>